diff options
-rw-r--r-- | src/corelib/serialization/qcborarray.cpp | 2 | ||||
-rw-r--r-- | src/corelib/serialization/qcborvalue.cpp | 55 | ||||
-rw-r--r-- | src/corelib/serialization/qcborvalue_p.h | 19 | ||||
-rw-r--r-- | src/corelib/serialization/qjsonobject.cpp | 2 |
4 files changed, 45 insertions, 33 deletions
diff --git a/src/corelib/serialization/qcborarray.cpp b/src/corelib/serialization/qcborarray.cpp index 418da317e0..78f2ca3f33 100644 --- a/src/corelib/serialization/qcborarray.cpp +++ b/src/corelib/serialization/qcborarray.cpp @@ -424,7 +424,7 @@ void QCborArray::removeAt(qsizetype i) bool QCborArray::contains(const QCborValue &value) const { for (qsizetype i = 0; i < size(); ++i) { - int cmp = d->compareElement(i, value); + int cmp = d->compareElement(i, value, Comparison::ForEquality); if (cmp == 0) return true; } diff --git a/src/corelib/serialization/qcborvalue.cpp b/src/corelib/serialization/qcborvalue.cpp index 8e12cf64bc..b83ce226dc 100644 --- a/src/corelib/serialization/qcborvalue.cpp +++ b/src/corelib/serialization/qcborvalue.cpp @@ -1089,7 +1089,8 @@ QCborValue QCborContainerPrivate::extractAt_complex(Element e) } QT_WARNING_DISABLE_MSVC(4146) // unary minus operator applied to unsigned type, result still unsigned -static int compareContainer(const QCborContainerPrivate *c1, const QCborContainerPrivate *c2); +static int compareContainer(const QCborContainerPrivate *c1, const QCborContainerPrivate *c2, + Comparison mode); static int compareElementNoData(const Element &e1, const Element &e2) { Q_ASSERT(e1.type == e2.type); @@ -1134,7 +1135,8 @@ static int compareElementNoData(const Element &e1, const Element &e2) } static int compareElementRecursive(const QCborContainerPrivate *c1, const Element &e1, - const QCborContainerPrivate *c2, const Element &e2) + const QCborContainerPrivate *c2, const Element &e2, + Comparison mode) { int cmp = typeOrder(e1.type, e2.type); if (cmp != 0) @@ -1142,7 +1144,7 @@ static int compareElementRecursive(const QCborContainerPrivate *c1, const Elemen if ((e1.flags & Element::IsContainer) || (e2.flags & Element::IsContainer)) return compareContainer(e1.flags & Element::IsContainer ? e1.container : nullptr, - e2.flags & Element::IsContainer ? e2.container : nullptr); + e2.flags & Element::IsContainer ? e2.container : nullptr, mode); // string data? const ByteData *b1 = c1 ? c1->byteData(e1) : nullptr; @@ -1216,7 +1218,8 @@ static int compareElementRecursive(const QCborContainerPrivate *c1, const Elemen return compareElementNoData(e1, e2); } -static int compareContainer(const QCborContainerPrivate *c1, const QCborContainerPrivate *c2) +static int compareContainer(const QCborContainerPrivate *c1, const QCborContainerPrivate *c2, + Comparison mode) { auto len1 = c1 ? c1->elements.size() : 0; auto len2 = c2 ? c2->elements.size() : 0; @@ -1228,7 +1231,7 @@ static int compareContainer(const QCborContainerPrivate *c1, const QCborContaine for (qsizetype i = 0; i < len1; ++i) { const Element &e1 = c1->elements.at(i); const Element &e2 = c2->elements.at(i); - int cmp = QCborContainerPrivate::compareElement_helper(c1, e1, c2, e2); + int cmp = compareElementRecursive(c1, e1, c2, e2, mode); if (cmp) return cmp; } @@ -1237,9 +1240,10 @@ static int compareContainer(const QCborContainerPrivate *c1, const QCborContaine } inline int QCborContainerPrivate::compareElement_helper(const QCborContainerPrivate *c1, Element e1, - const QCborContainerPrivate *c2, Element e2) + const QCborContainerPrivate *c2, Element e2, + Comparison mode) { - return compareElementRecursive(c1, e1, c2, e2); + return compareElementRecursive(c1, e1, c2, e2, mode); } /*! @@ -1272,7 +1276,8 @@ bool comparesEqual(const QCborValue &lhs, { Element e1 = QCborContainerPrivate::elementFromValue(lhs); Element e2 = QCborContainerPrivate::elementFromValue(rhs); - return compareElementRecursive(lhs.container, e1, rhs.container, e2) == 0; + return compareElementRecursive(lhs.container, e1, rhs.container, e2, + Comparison::ForEquality) == 0; } /*! @@ -1394,24 +1399,24 @@ int QCborValue::compare(const QCborValue &other) const { Element e1 = QCborContainerPrivate::elementFromValue(*this); Element e2 = QCborContainerPrivate::elementFromValue(other); - return compareElementRecursive(container, e1, other.container, e2); + return compareElementRecursive(container, e1, other.container, e2, Comparison::ForOrdering); } bool comparesEqual(const QCborArray &lhs, const QCborArray &rhs) noexcept { - return compareContainer(lhs.d.constData(), rhs.d.constData()) == 0; + return compareContainer(lhs.d.constData(), rhs.d.constData(), Comparison::ForEquality) == 0; } int QCborArray::compare(const QCborArray &other) const noexcept { - return compareContainer(d.data(), other.d.data()); + return compareContainer(d.data(), other.d.data(), Comparison::ForOrdering); } bool QCborArray::comparesEqual_helper(const QCborArray &lhs, const QCborValue &rhs) noexcept { if (typeOrder(QCborValue::Array, rhs.type())) return false; - return compareContainer(lhs.d.constData(), rhs.container) == 0; + return compareContainer(lhs.d.constData(), rhs.container, Comparison::ForEquality) == 0; } Qt::strong_ordering @@ -1419,25 +1424,25 @@ QCborArray::compareThreeWay_helper(const QCborArray &lhs, const QCborValue &rhs) { int c = typeOrder(QCborValue::Array, rhs.type()); if (c == 0) - c = compareContainer(lhs.d.constData(), rhs.container); + c = compareContainer(lhs.d.constData(), rhs.container, Comparison::ForOrdering); return Qt::compareThreeWay(c, 0); } bool comparesEqual(const QCborMap &lhs, const QCborMap &rhs) noexcept { - return compareContainer(lhs.d.constData(), rhs.d.constData()) == 0; + return compareContainer(lhs.d.constData(), rhs.d.constData(), Comparison::ForEquality) == 0; } int QCborMap::compare(const QCborMap &other) const noexcept { - return compareContainer(d.data(), other.d.data()); + return compareContainer(d.data(), other.d.data(), Comparison::ForOrdering); } bool QCborMap::comparesEqual_helper(const QCborMap &lhs, const QCborValue &rhs) noexcept { if (typeOrder(QCborValue::Map, rhs.type())) return false; - return compareContainer(lhs.d.constData(), rhs.container) == 0; + return compareContainer(lhs.d.constData(), rhs.container, Comparison::ForEquality) == 0; } Qt::strong_ordering @@ -1445,7 +1450,7 @@ QCborMap::compareThreeWay_helper(const QCborMap &lhs, const QCborValue &rhs) noe { int c = typeOrder(QCborValue::Map, rhs.type()); if (c == 0) - c = compareContainer(lhs.d.constData(), rhs.container); + c = compareContainer(lhs.d.constData(), rhs.container, Comparison::ForOrdering); return Qt::compareThreeWay(c, 0); } @@ -2793,7 +2798,7 @@ QCborValueConstRef::comparesEqual_helper(QCborValueConstRef lhs, QCborValueConst { QtCbor::Element e1 = lhs.d->elements.at(lhs.i); QtCbor::Element e2 = rhs.d->elements.at(rhs.i); - return compareElementRecursive(lhs.d, e1, rhs.d, e2) == 0; + return compareElementRecursive(lhs.d, e1, rhs.d, e2, Comparison::ForEquality) == 0; } Qt::strong_ordering @@ -2801,7 +2806,7 @@ QCborValueConstRef::compareThreeWay_helper(QCborValueConstRef lhs, QCborValueCon { QtCbor::Element e1 = lhs.d->elements.at(lhs.i); QtCbor::Element e2 = rhs.d->elements.at(rhs.i); - int c = compareElementRecursive(lhs.d, e1, rhs.d, e2); + int c = compareElementRecursive(lhs.d, e1, rhs.d, e2, Comparison::ForOrdering); return Qt::compareThreeWay(c, 0); } @@ -2810,7 +2815,7 @@ QCborValueConstRef::comparesEqual_helper(QCborValueConstRef lhs, const QCborValu { QtCbor::Element e1 = lhs.d->elements.at(lhs.i); QtCbor::Element e2 = QCborContainerPrivate::elementFromValue(rhs); - return compareElementRecursive(lhs.d, e1, rhs.container, e2) == 0; + return compareElementRecursive(lhs.d, e1, rhs.container, e2, Comparison::ForEquality) == 0; } Qt::strong_ordering @@ -2818,7 +2823,7 @@ QCborValueConstRef::compareThreeWay_helper(QCborValueConstRef lhs, const QCborVa { QtCbor::Element e1 = lhs.d->elements.at(lhs.i); QtCbor::Element e2 = QCborContainerPrivate::elementFromValue(rhs); - int c = compareElementRecursive(lhs.d, e1, rhs.container, e2); + int c = compareElementRecursive(lhs.d, e1, rhs.container, e2, Comparison::ForOrdering); return Qt::compareThreeWay(c, 0); } @@ -2827,7 +2832,7 @@ bool QCborArray::comparesEqual_helper(const QCborArray &lhs, QCborValueConstRef QtCbor::Element e2 = rhs.d->elements.at(rhs.i); if (typeOrder(QCborValue::Array, e2.type)) return false; - return compareContainer(lhs.d.constData(), e2.container) == 0; + return compareContainer(lhs.d.constData(), e2.container, Comparison::ForEquality) == 0; } Qt::strong_ordering @@ -2836,7 +2841,7 @@ QCborArray::compareThreeWay_helper(const QCborArray &lhs, QCborValueConstRef rhs QtCbor::Element e2 = rhs.d->elements.at(rhs.i); int c = typeOrder(QCborValue::Array, e2.type); if (c == 0) - c = compareContainer(lhs.d.constData(), e2.container); + c = compareContainer(lhs.d.constData(), e2.container, Comparison::ForOrdering); return Qt::compareThreeWay(c, 0); } @@ -2845,7 +2850,7 @@ bool QCborMap::comparesEqual_helper(const QCborMap &lhs, QCborValueConstRef rhs) QtCbor::Element e2 = rhs.d->elements.at(rhs.i); if (typeOrder(QCborValue::Array, e2.type)) return false; - return compareContainer(lhs.d.constData(), e2.container) == 0; + return compareContainer(lhs.d.constData(), e2.container, Comparison::ForEquality) == 0; } Qt::strong_ordering @@ -2854,7 +2859,7 @@ QCborMap::compareThreeWay_helper(const QCborMap &lhs, QCborValueConstRef rhs) no QtCbor::Element e2 = rhs.d->elements.at(rhs.i); int c = typeOrder(QCborValue::Map, e2.type); if (c == 0) - c = compareContainer(lhs.d.constData(), e2.container); + c = compareContainer(lhs.d.constData(), e2.container, Comparison::ForOrdering); return Qt::compareThreeWay(c, 0); } diff --git a/src/corelib/serialization/qcborvalue_p.h b/src/corelib/serialization/qcborvalue_p.h index 5930e330dc..9fa640fd63 100644 --- a/src/corelib/serialization/qcborvalue_p.h +++ b/src/corelib/serialization/qcborvalue_p.h @@ -29,6 +29,11 @@ QT_BEGIN_NAMESPACE namespace QtCbor { +enum class Comparison { + ForEquality, + ForOrdering, +}; + struct Undefined {}; struct Element { @@ -346,7 +351,7 @@ public: } template<typename String> - int stringCompareElement(const QtCbor::Element &e, String s) const + int stringCompareElement(const QtCbor::Element &e, String s, QtCbor::Comparison mode) const { if (e.type != QCborValue::String) return int(e.type) - int(QCborValue::String); @@ -355,6 +360,7 @@ public: if (!b) return s.isEmpty() ? 0 : -1; + Q_UNUSED(mode); if (e.flags & QtCbor::Element::StringIsUtf16) return QtPrivate::compareStrings(b->asStringView(), s); return compareUtf8(b, s); @@ -363,7 +369,7 @@ public: template<typename String> bool stringEqualsElement(const QtCbor::Element &e, String s) const { - return stringCompareElement(e, s) == 0; + return stringCompareElement(e, s, QtCbor::Comparison::ForEquality) == 0; } template<typename String> @@ -373,12 +379,13 @@ public: } static int compareElement_helper(const QCborContainerPrivate *c1, QtCbor::Element e1, - const QCborContainerPrivate *c2, QtCbor::Element e2); - int compareElement(qsizetype idx, const QCborValue &value) const + const QCborContainerPrivate *c2, QtCbor::Element e2, + QtCbor::Comparison mode); + int compareElement(qsizetype idx, const QCborValue &value, QtCbor::Comparison mode) const { auto &e1 = elements.at(idx); auto e2 = elementFromValue(value); - return compareElement_helper(this, e1, value.container, e2); + return compareElement_helper(this, e1, value.container, e2, mode); } void removeAt(qsizetype idx) @@ -395,7 +402,7 @@ public: const auto &e = elements.at(i); bool equals; if constexpr (std::is_same_v<std::decay_t<KeyType>, QCborValue>) { - equals = (compareElement(i, key) == 0); + equals = (compareElement(i, key, QtCbor::Comparison::ForEquality) == 0); } else if constexpr (std::is_integral_v<KeyType>) { equals = (e.type == QCborValue::Integer && e.value == key); } else { diff --git a/src/corelib/serialization/qjsonobject.cpp b/src/corelib/serialization/qjsonobject.cpp index 2dd1eb01c6..652f1b4da5 100644 --- a/src/corelib/serialization/qjsonobject.cpp +++ b/src/corelib/serialization/qjsonobject.cpp @@ -269,7 +269,7 @@ static qsizetype indexOf(const QExplicitlySharedDataPointer<QCborContainerPrivat const auto it = std::lower_bound( begin, end, key, [&](const QJsonPrivate::ConstKeyIterator::value_type &e, const String &key) { - return o->stringCompareElement(e.key(), key) < 0; + return o->stringCompareElement(e.key(), key, QtCbor::Comparison::ForOrdering) < 0; }); *keyExists = (it != end) && o->stringEqualsElement((*it).key(), key); |