diff options
Diffstat (limited to 'src/corelib/serialization/qjsonobject.h')
-rw-r--r-- | src/corelib/serialization/qjsonobject.h | 139 |
1 files changed, 112 insertions, 27 deletions
diff --git a/src/corelib/serialization/qjsonobject.h b/src/corelib/serialization/qjsonobject.h index 5d7fb227a7..4cdbf4511d 100644 --- a/src/corelib/serialization/qjsonobject.h +++ b/src/corelib/serialization/qjsonobject.h @@ -21,12 +21,12 @@ class Q_CORE_EXPORT QJsonObject public: QJsonObject(); - QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args); + QJsonObject(std::initializer_list<std::pair<QString, QJsonValue> > args); ~QJsonObject(); - QJsonObject(const QJsonObject &other); - QJsonObject &operator =(const QJsonObject &other); + QJsonObject(const QJsonObject &other) noexcept; + QJsonObject &operator =(const QJsonObject &other) noexcept; QJsonObject(QJsonObject &&other) noexcept; @@ -52,11 +52,9 @@ public: inline qsizetype length() const { return size(); } bool isEmpty() const; -#if QT_STRINGVIEW_LEVEL < 2 QJsonValue value(const QString &key) const; QJsonValue operator[] (const QString &key) const; QJsonValueRef operator[] (const QString &key); -#endif QJsonValue value(QStringView key) const; QJsonValue value(QLatin1StringView key) const; QJsonValue operator[] (QStringView key) const { return value(key); } @@ -64,11 +62,9 @@ public: QJsonValueRef operator[] (QStringView key); QJsonValueRef operator[] (QLatin1StringView key); -#if QT_STRINGVIEW_LEVEL < 2 void remove(const QString &key); QJsonValue take(const QString &key); bool contains(const QString &key) const; -#endif void remove(QStringView key); void remove(QLatin1StringView key); QJsonValue take(QStringView key); @@ -76,9 +72,10 @@ public: bool contains(QStringView key) const; bool contains(QLatin1StringView key) const; +#if QT_CORE_REMOVED_SINCE(6, 8) bool operator==(const QJsonObject &other) const; bool operator!=(const QJsonObject &other) const; - +#endif class const_iterator; class iterator @@ -110,17 +107,17 @@ public: inline const QJsonValueConstRef *operator->() const { return &item; } inline QJsonValueRef *operator->() { return &item; } inline QJsonValueRef operator[](qsizetype j) const { return *(*this + j); } - +#if QT_CORE_REMOVED_SINCE(6, 8) inline bool operator==(const iterator &other) const { return item.d == other.item.d && item.index == other.item.index; } - inline bool operator!=(const iterator &other) const { return !(*this == other); } + inline bool operator!=(const iterator &other) const { return !operator==(other); } bool operator<(const iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.index < other.item.index; } bool operator<=(const iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.index <= other.item.index; } - bool operator>(const iterator& other) const { return !(*this <= other); } - bool operator>=(const iterator& other) const { return !(*this < other); } - + bool operator>(const iterator& other) const { return !operator<=(other); } + bool operator>=(const iterator& other) const { return !operator<(other); } +#endif inline iterator &operator++() { ++item.index; return *this; } inline iterator operator++(int) { iterator r = *this; ++item.index; return r; } inline iterator &operator--() { --item.index; return *this; } @@ -132,15 +129,63 @@ public: qsizetype operator-(iterator j) const { return item.index - j.item.index; } public: +#if QT_CORE_REMOVED_SINCE(6, 8) inline bool operator==(const const_iterator &other) const { return item.d == other.item.d && item.index == other.item.index; } - inline bool operator!=(const const_iterator &other) const { return !(*this == other); } + inline bool operator!=(const const_iterator &other) const { return !operator==(other); } bool operator<(const const_iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.index < other.item.index; } bool operator<=(const const_iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.index <= other.item.index; } - bool operator>(const const_iterator& other) const { return !(*this <= other); } - bool operator>=(const const_iterator& other) const { return !(*this < other); } + bool operator>(const const_iterator& other) const { return operator<=(other); } + bool operator>=(const const_iterator& other) const { return operator<(other); } +#endif + private: + // Helper functions + static bool comparesEqual_helper(const iterator &lhs, const iterator &rhs) noexcept + { + return lhs.item.d == rhs.item.d && lhs.item.index == rhs.item.index; + } + static bool comparesEqual_helper(const iterator &lhs, const const_iterator &rhs) noexcept + { + return lhs.item.d == rhs.item.d && lhs.item.index == rhs.item.index; + } + + 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.index, rhs.item.index); + } + static Qt::strong_ordering compareThreeWay_helper(const iterator &lhs, + const const_iterator &rhs) noexcept + { + Q_ASSERT(lhs.item.d == rhs.item.d); + return Qt::compareThreeWay(lhs.item.index, rhs.item.index); + } + + // 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 const_iterator &rhs) noexcept + { + return comparesEqual_helper(lhs, rhs); + } + friend Qt::strong_ordering compareThreeWay(const iterator &lhs, + const const_iterator &rhs) noexcept + { + return compareThreeWay_helper(lhs, rhs); + } + Q_DECLARE_STRONGLY_ORDERED(iterator, const_iterator) }; friend class iterator; @@ -174,17 +219,17 @@ public: inline const QJsonValueConstRef operator*() const { return item; } inline const QJsonValueConstRef *operator->() const { return &item; } inline QJsonValueConstRef operator[](qsizetype j) const { return *(*this + j); } - +#if QT_CORE_REMOVED_SINCE(6, 8) inline bool operator==(const const_iterator &other) const { return item.d == other.item.d && item.index == other.item.index; } - inline bool operator!=(const const_iterator &other) const { return !(*this == other); } + inline bool operator!=(const const_iterator &other) const { return !operator==(other); } bool operator<(const const_iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.index < other.item.index; } bool operator<=(const const_iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.index <= other.item.index; } - bool operator>(const const_iterator& other) const { return !(*this <= other); } - bool operator>=(const const_iterator& other) const { return !(*this < other); } - + bool operator>(const const_iterator& other) const { return !operator<=(other); } + bool operator>=(const const_iterator& other) const { return !operator<(other); } +#endif inline const_iterator &operator++() { ++item.index; return *this; } inline const_iterator operator++(int) { const_iterator r = *this; ++item.index; return r; } inline const_iterator &operator--() { --item.index; return *this; } @@ -194,16 +239,43 @@ public: inline const_iterator &operator+=(qsizetype j) { item.index += quint64(j); return *this; } inline const_iterator &operator-=(qsizetype j) { item.index -= quint64(j); return *this; } qsizetype operator-(const_iterator j) const { return item.index - j.item.index; } - +#if QT_CORE_REMOVED_SINCE(6, 8) inline bool operator==(const iterator &other) const { return item.d == other.item.d && item.index == other.item.index; } - inline bool operator!=(const iterator &other) const { return !(*this == other); } + inline bool operator!=(const iterator &other) const { return !operator==(other); } bool operator<(const iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.index < other.item.index; } bool operator<=(const iterator& other) const { Q_ASSERT(item.d == other.item.d); return item.index <= other.item.index; } - bool operator>(const iterator& other) const { return !(*this <= other); } - bool operator>=(const iterator& other) const { return !(*this < other); } + bool operator>(const iterator& other) const { return !operator<=(other); } + bool operator>=(const iterator& other) const { return !operator<(other); } +#endif + + private: + // Helper functions + static bool comparesEqual_helper(const const_iterator &lhs, + const const_iterator &rhs) noexcept + { + return lhs.item.d == rhs.item.d && lhs.item.index == rhs.item.index; + } + static Qt::strong_ordering compareThreeWay_helper(const const_iterator &lhs, + const const_iterator &rhs) noexcept + { + Q_ASSERT(lhs.item.d == rhs.item.d); + return Qt::compareThreeWay(lhs.item.index, rhs.item.index); + } + + // Compare friends + friend bool comparesEqual(const const_iterator &lhs, const const_iterator &rhs) noexcept + { + return comparesEqual_helper(lhs, rhs); + } + friend Qt::strong_ordering compareThreeWay(const const_iterator &lhs, + const const_iterator &rhs) noexcept + { + return compareThreeWay_helper(lhs, rhs); + } + Q_DECLARE_STRONGLY_ORDERED(const_iterator) }; friend class const_iterator; @@ -219,12 +291,10 @@ public: // more Qt typedef iterator Iterator; typedef const_iterator ConstIterator; -#if QT_STRINGVIEW_LEVEL < 2 iterator find(const QString &key); const_iterator find(const QString &key) const { return constFind(key); } const_iterator constFind(const QString &key) const; iterator insert(const QString &key, const QJsonValue &value); -#endif iterator find(QStringView key); iterator find(QLatin1StringView key); const_iterator find(QStringView key) const { return constFind(key); } @@ -242,6 +312,21 @@ public: inline bool empty() const { return isEmpty(); } private: + friend Q_CORE_EXPORT bool comparesEqual(const QJsonObject &lhs, + const QJsonObject &rhs) noexcept; + friend bool comparesEqual(const QJsonObject &lhs, + const QJsonValue &rhs) noexcept + { + return comparesEqual(lhs, rhs.toObject()); + } + friend bool comparesEqual(const QJsonObject &lhs, + const QJsonValueConstRef &rhs) noexcept + { + return comparesEqual(lhs, rhs.toObject()); + } + Q_DECLARE_EQUALITY_COMPARABLE(QJsonObject) + Q_DECLARE_EQUALITY_COMPARABLE(QJsonObject, QJsonValue) + Q_DECLARE_EQUALITY_COMPARABLE(QJsonObject, QJsonValueConstRef) friend class QJsonValue; friend class QJsonDocument; friend class QJsonPrivate::Value; |