diff options
Diffstat (limited to 'src/corelib/serialization/qcbormap.h')
-rw-r--r-- | src/corelib/serialization/qcbormap.h | 195 |
1 files changed, 154 insertions, 41 deletions
diff --git a/src/corelib/serialization/qcbormap.h b/src/corelib/serialization/qcbormap.h index 523ef9ea34..d2fd769240 100644 --- a/src/corelib/serialization/qcbormap.h +++ b/src/corelib/serialization/qcbormap.h @@ -20,7 +20,7 @@ class QCborContainerPrivate; class Q_CORE_EXPORT QCborMap { public: - typedef QPair<QCborValue, QCborValue> value_type; + typedef std::pair<QCborValue, QCborValue> value_type; typedef QCborValue key_type; typedef QCborValue mapped_type; typedef qsizetype size_type; @@ -34,12 +34,13 @@ public: public: typedef std::random_access_iterator_tag iterator_category; typedef qsizetype difference_type; - typedef QPair<QCborValueConstRef, QCborValueRef> value_type; - typedef QPair<QCborValueConstRef, QCborValueRef> reference; - typedef QPair<QCborValueConstRef, QCborValueRef> pointer; + typedef std::pair<QCborValueConstRef, QCborValueRef> value_type; + typedef std::pair<QCborValueConstRef, QCborValueRef> reference; + typedef std::pair<QCborValueConstRef, QCborValueRef> pointer; constexpr Iterator() = default; constexpr Iterator(const Iterator &) = default; + ~Iterator() = default; Iterator &operator=(const Iterator &other) { // rebind the reference @@ -60,18 +61,20 @@ public: key() const { return QCborValueRef(item.d, item.i - 1); } QCborValueRef value() const { return item; } +#if QT_CORE_REMOVED_SINCE(6, 8) bool operator==(const Iterator &o) const { return item.d == o.item.d && item.i == o.item.i; } - bool operator!=(const Iterator &o) const { return !(*this == o); } + bool operator!=(const Iterator &o) const { return !operator==(o); } bool operator<(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; } bool operator<=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; } bool operator>(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; } bool operator>=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; } bool operator==(const ConstIterator &o) const { return item.d == o.item.d && item.i == o.item.i; } - bool operator!=(const ConstIterator &o) const { return !(*this == o); } + bool operator!=(const ConstIterator &o) const { return !operator==(o); } bool operator<(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; } bool operator<=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; } bool operator>(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; } bool operator>=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; } +#endif Iterator &operator++() { item.i += 2; return *this; } Iterator operator++(int) { Iterator n = *this; item.i += 2; return n; } Iterator &operator--() { item.i -= 2; return *this; } @@ -81,6 +84,54 @@ public: Iterator operator+(qsizetype j) const { return Iterator({ item.d, item.i + 2 * j }); } Iterator operator-(qsizetype j) const { return Iterator({ item.d, item.i - 2 * j }); } qsizetype operator-(Iterator j) const { return (item.i - j.item.i) / 2; } + + private: + // Helper functions + static bool comparesEqual_helper(const Iterator &lhs, const Iterator &rhs) noexcept + { + return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i; + } + + static bool comparesEqual_helper(const Iterator &lhs, const ConstIterator &rhs) noexcept + { + return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i; + } + + static Qt::strong_ordering compareThreeWay_helper(const Iterator &lhs, + const Iterator &rhs) noexcept + { + Q_ASSERT(lhs.item.d == rhs.item.d); + return Qt::compareThreeWay(lhs.item.i, rhs.item.i); + } + + static Qt::strong_ordering compareThreeWay_helper(const Iterator &lhs, + const ConstIterator &rhs) noexcept + { + Q_ASSERT(lhs.item.d == rhs.item.d); + return Qt::compareThreeWay(lhs.item.i, rhs.item.i); + } + + // Compare friends + friend bool comparesEqual(const Iterator &lhs, const Iterator &rhs) noexcept + { + return comparesEqual_helper(lhs, rhs); + } + friend Qt::strong_ordering compareThreeWay(const Iterator &lhs, + const Iterator &rhs) noexcept + { + return compareThreeWay_helper(lhs, rhs); + } + Q_DECLARE_STRONGLY_ORDERED(Iterator) + friend bool comparesEqual(const Iterator &lhs, const ConstIterator &rhs) noexcept + { + return comparesEqual_helper(lhs, rhs); + } + friend Qt::strong_ordering compareThreeWay(const Iterator &lhs, + const ConstIterator &rhs) noexcept + { + return compareThreeWay_helper(lhs, rhs); + } + Q_DECLARE_STRONGLY_ORDERED(Iterator, ConstIterator) }; class ConstIterator { @@ -94,12 +145,13 @@ public: public: typedef std::random_access_iterator_tag iterator_category; typedef qsizetype difference_type; - typedef QPair<QCborValueConstRef, QCborValueConstRef> value_type; - typedef QPair<QCborValueConstRef, QCborValueConstRef> reference; - typedef QPair<QCborValueConstRef, QCborValueConstRef> pointer; + typedef std::pair<QCborValueConstRef, QCborValueConstRef> value_type; + typedef std::pair<QCborValueConstRef, QCborValueConstRef> reference; + typedef std::pair<QCborValueConstRef, QCborValueConstRef> pointer; constexpr ConstIterator() = default; constexpr ConstIterator(const ConstIterator &) = default; + ~ConstIterator() = default; ConstIterator &operator=(const ConstIterator &other) { // rebind the reference @@ -119,18 +171,20 @@ public: key() const { return QCborValueRef(item.d, item.i - 1); } QCborValueConstRef value() const { return item; } +#if QT_CORE_REMOVED_SINCE(6, 8) bool operator==(const Iterator &o) const { return item.d == o.item.d && item.i == o.item.i; } - bool operator!=(const Iterator &o) const { return !(*this == o); } + bool operator!=(const Iterator &o) const { return !operator==(o); } bool operator<(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; } bool operator<=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; } bool operator>(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; } bool operator>=(const Iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; } bool operator==(const ConstIterator &o) const { return item.d == o.item.d && item.i == o.item.i; } - bool operator!=(const ConstIterator &o) const { return !(*this == o); } + bool operator!=(const ConstIterator &o) const { return !operator==(o); } bool operator<(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i < other.item.i; } bool operator<=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i <= other.item.i; } bool operator>(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i > other.item.i; } bool operator>=(const ConstIterator& other) const { Q_ASSERT(item.d == other.item.d); return item.i >= other.item.i; } +#endif ConstIterator &operator++() { item.i += 2; return *this; } ConstIterator operator++(int) { ConstIterator n = *this; item.i += 2; return n; } ConstIterator &operator--() { item.i -= 2; return *this; } @@ -140,6 +194,31 @@ public: ConstIterator operator+(qsizetype j) const { return ConstIterator{ item.d, item.i + 2 * j }; } ConstIterator operator-(qsizetype j) const { return ConstIterator{ item.d, item.i - 2 * j }; } qsizetype operator-(ConstIterator j) const { return (item.i - j.item.i) / 2; } + private: + // Helper functions + static bool comparesEqual_helper(const ConstIterator &lhs, + const ConstIterator &rhs) noexcept + { + return lhs.item.d == rhs.item.d && lhs.item.i == rhs.item.i; + } + static Qt::strong_ordering compareThreeWay_helper(const ConstIterator &lhs, + const ConstIterator &rhs) noexcept + { + Q_ASSERT(lhs.item.d == rhs.item.d); + return Qt::compareThreeWay(lhs.item.i, rhs.item.i); + } + + // Compare friends + friend bool comparesEqual(const ConstIterator &lhs, const ConstIterator &rhs) noexcept + { + return comparesEqual_helper(lhs, rhs); + } + friend Qt::strong_ordering compareThreeWay(const ConstIterator &lhs, + const ConstIterator &rhs) noexcept + { + return compareThreeWay_helper(lhs, rhs); + } + Q_DECLARE_STRONGLY_ORDERED(ConstIterator) }; QCborMap() noexcept; @@ -167,25 +246,25 @@ public: QList<QCborValue> keys() const; QCborValue value(qint64 key) const - { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); } + { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); } QCborValue value(QLatin1StringView key) const - { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); } + { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); } QCborValue value(const QString & key) const - { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); } + { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); } QCborValue value(const QCborValue &key) const - { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); } + { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); } #if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII) template<size_t N> QT_ASCII_CAST_WARN const QCborValue value(const char (&key)[N]) const { return value(QString::fromUtf8(key, N - 1)); } #endif const QCborValue operator[](qint64 key) const - { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); } + { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); } const QCborValue operator[](QLatin1StringView key) const - { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); } + { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); } const QCborValue operator[](const QString & key) const - { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); } + { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); } const QCborValue operator[](const QCborValue &key) const - { const_iterator it = find(key); return it == end() ? QCborValue() : it.value(); } + { const_iterator it = find(key); return comparesEqual(it, end()) ? QCborValue() : it.value(); } #if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII) template<size_t N> QT_ASCII_CAST_WARN const QCborValue operator[](const char (&key)[N]) const { return operator[](QString::fromUtf8(key, N - 1)); } @@ -196,44 +275,36 @@ public: QCborValueRef operator[](const QCborValue &key); QCborValue take(qint64 key) - { const_iterator it = constFind(key); if (it != constEnd()) return extract(it); return QCborValue(); } + { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) return extract(it); return QCborValue(); } QCborValue take(QLatin1StringView key) - { const_iterator it = constFind(key); if (it != constEnd()) return extract(it); return QCborValue(); } + { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) return extract(it); return QCborValue(); } QCborValue take(const QString &key) - { const_iterator it = constFind(key); if (it != constEnd()) return extract(it); return QCborValue(); } + { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) return extract(it); return QCborValue(); } QCborValue take(const QCborValue &key) - { const_iterator it = constFind(key); if (it != constEnd()) return extract(it); return QCborValue(); } + { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) return extract(it); return QCborValue(); } void remove(qint64 key) - { const_iterator it = constFind(key); if (it != constEnd()) erase(it); } + { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) erase(it); } void remove(QLatin1StringView key) - { const_iterator it = constFind(key); if (it != constEnd()) erase(it); } + { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) erase(it); } void remove(const QString & key) - { const_iterator it = constFind(key); if (it != constEnd()) erase(it); } + { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) erase(it); } void remove(const QCborValue &key) - { const_iterator it = constFind(key); if (it != constEnd()) erase(it); } + { const_iterator it = constFind(key); if (!comparesEqual(it, constEnd())) erase(it); } bool contains(qint64 key) const - { const_iterator it = find(key); return it != end(); } + { const_iterator it = find(key); return !comparesEqual(it, end()); } bool contains(QLatin1StringView key) const - { const_iterator it = find(key); return it != end(); } + { const_iterator it = find(key); return !comparesEqual(it, end()); } bool contains(const QString & key) const - { const_iterator it = find(key); return it != end(); } + { const_iterator it = find(key); return !comparesEqual(it, end()); } bool contains(const QCborValue &key) const - { const_iterator it = find(key); return it != end(); } + { const_iterator it = find(key); return !comparesEqual(it, end()); } int compare(const QCborMap &other) const noexcept Q_DECL_PURE_FUNCTION; -#if 0 && __has_include(<compare>) - std::strong_ordering operator<=>(const QCborMap &other) const - { - int c = compare(other); - if (c > 0) return std::strong_ordering::greater; - if (c == 0) return std::strong_ordering::equivalent; - return std::strong_ordering::less; - } -#else +#if QT_CORE_REMOVED_SINCE(6, 8) bool operator==(const QCborMap &other) const noexcept { return compare(other) == 0; } bool operator!=(const QCborMap &other) const noexcept - { return !(*this == other); } + { return !operator==(other); } bool operator<(const QCborMap &other) const { return compare(other) < 0; } #endif @@ -308,6 +379,48 @@ private: friend class QJsonPrivate::Variant; void detach(qsizetype reserve = 0); + friend Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool + comparesEqual(const QCborMap &lhs, const QCborMap &rhs) noexcept; + friend Qt::strong_ordering compareThreeWay(const QCborMap &lhs, + const QCborMap &rhs) noexcept + { + int c = lhs.compare(rhs); + return Qt::compareThreeWay(c, 0); + } + Q_DECLARE_STRONGLY_ORDERED(QCborMap) + + static Q_DECL_PURE_FUNCTION bool + comparesEqual_helper(const QCborMap &lhs, const QCborValue &rhs) noexcept; + static Q_DECL_PURE_FUNCTION Qt::strong_ordering + compareThreeWay_helper(const QCborMap &lhs, const QCborValue &rhs) noexcept; + friend bool comparesEqual(const QCborMap &lhs, + const QCborValue &rhs) noexcept + { + return comparesEqual_helper(lhs, rhs); + } + friend Qt::strong_ordering compareThreeWay(const QCborMap &lhs, + const QCborValue &rhs) noexcept + { + return compareThreeWay_helper(lhs, rhs); + } + Q_DECLARE_STRONGLY_ORDERED(QCborMap, QCborValue) + + static Q_DECL_PURE_FUNCTION bool + comparesEqual_helper(const QCborMap &lhs, QCborValueConstRef rhs) noexcept; + static Q_DECL_PURE_FUNCTION Qt::strong_ordering + compareThreeWay_helper(const QCborMap &lhs, QCborValueConstRef rhs) noexcept; + friend bool comparesEqual(const QCborMap &lhs, + const QCborValueConstRef &rhs) noexcept + { + return comparesEqual_helper(lhs, rhs); + } + friend Qt::strong_ordering compareThreeWay(const QCborMap &lhs, + const QCborValueConstRef &rhs) noexcept + { + return compareThreeWay_helper(lhs, rhs); + } + Q_DECLARE_STRONGLY_ORDERED(QCborMap, QCborValueConstRef) + explicit QCborMap(QCborContainerPrivate &dd) noexcept; QExplicitlySharedDataPointer<QCborContainerPrivate> d; }; |