summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/serialization/qcborarray.cpp2
-rw-r--r--src/corelib/serialization/qcborvalue.cpp55
-rw-r--r--src/corelib/serialization/qcborvalue_p.h19
-rw-r--r--src/corelib/serialization/qjsonobject.cpp2
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);