From 9ec333d4bcb1f38537e79ad4e6b429972616daa9 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sun, 4 Sep 2016 11:31:52 +0200 Subject: Diagonalize XsdValidatingInstanceReader::validateUniqueIdentityConstraint() TargetNode::fieldsAreEqual() is symmetric, so diagonalize the nested loops to avoid both checking for identity as well as re-checking (A, B) if we already checked (B, A). Change-Id: I67668415b1f509e6119ea61b76213700e8b49b56 Reviewed-by: Friedemann Kleint --- src/xmlpatterns/schema/qxsdvalidatinginstancereader.cpp | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/xmlpatterns/schema/qxsdvalidatinginstancereader.cpp b/src/xmlpatterns/schema/qxsdvalidatinginstancereader.cpp index 7cad16c..7cb925a 100644 --- a/src/xmlpatterns/schema/qxsdvalidatinginstancereader.cpp +++ b/src/xmlpatterns/schema/qxsdvalidatinginstancereader.cpp @@ -973,17 +973,9 @@ bool XsdValidatingInstanceReader::validateUniqueIdentityConstraint(const XsdElem // 4.1 const XsdSchemaSourceLocationReflection reflection(sourceLocation()); - QSetIterator it(qualifiedNodeSet); - while (it.hasNext()) { - const TargetNode node = it.next(); - QSetIterator innerIt(qualifiedNodeSet); - while (innerIt.hasNext()) { - const TargetNode innerNode = innerIt.next(); - - if (node == innerNode) // do not compare with ourself - continue; - - if (node.fieldsAreEqual(innerNode, m_namePool, m_context, &reflection)) { + for (auto it = qualifiedNodeSet.cbegin(), end = qualifiedNodeSet.cend(); it != end; ++it) { + for (auto jt = qualifiedNodeSet.cbegin(); jt != it; ++jt) { + if (it->fieldsAreEqual(*jt, m_namePool, m_context, &reflection)) { error(QtXmlPatterns::tr("Non-unique value found for constraint %1.").arg(formatKeyword(constraint->displayName(m_namePool)))); return false; } -- cgit v1.2.1