summaryrefslogtreecommitdiffstats
path: root/src/corelib/serialization/qjsonobject.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/serialization/qjsonobject.h')
-rw-r--r--src/corelib/serialization/qjsonobject.h392
1 files changed, 228 insertions, 164 deletions
diff --git a/src/corelib/serialization/qjsonobject.h b/src/corelib/serialization/qjsonobject.h
index 4002a8bc24..4cdbf4511d 100644
--- a/src/corelib/serialization/qjsonobject.h
+++ b/src/corelib/serialization/qjsonobject.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QJSONOBJECT_H
#define QJSONOBJECT_H
@@ -49,10 +13,6 @@
QT_BEGIN_NAMESPACE
class QDebug;
-template <class Key, class T> class QMap;
-typedef QMap<QString, QVariant> QVariantMap;
-template <class Key, class T> class QHash;
-typedef QHash<QString, QVariant> QVariantHash;
class QCborContainerPrivate;
@@ -61,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;
@@ -78,7 +38,7 @@ public:
void swap(QJsonObject &other) noexcept
{
- qSwap(o, other.o);
+ o.swap(other.o);
}
static QJsonObject fromVariantMap(const QVariantMap &map);
@@ -87,156 +47,243 @@ public:
QVariantHash toVariantHash() const;
QStringList keys() const;
- int size() const;
- inline int count() const { return size(); }
- inline int length() const { return size(); }
+ qsizetype size() const;
+ inline qsizetype count() const { return size(); }
+ 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(QLatin1String key) const;
+ QJsonValue value(QLatin1StringView key) const;
QJsonValue operator[] (QStringView key) const { return value(key); }
- QJsonValue operator[] (QLatin1String key) const { return value(key); }
+ QJsonValue operator[] (QLatin1StringView key) const { return value(key); }
QJsonValueRef operator[] (QStringView key);
- QJsonValueRef operator[] (QLatin1String 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(QLatin1String key);
+ void remove(QLatin1StringView key);
QJsonValue take(QStringView key);
- QJsonValue take(QLatin1String key);
+ QJsonValue take(QLatin1StringView key);
bool contains(QStringView key) const;
- bool contains(QLatin1String 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
{
friend class const_iterator;
friend class QJsonObject;
- QJsonObject *o;
- int i;
+ QJsonValueRef item;
public:
typedef std::random_access_iterator_tag iterator_category;
- typedef int difference_type;
+ typedef qsizetype difference_type;
typedef QJsonValue value_type;
typedef QJsonValueRef reference;
- typedef QJsonValuePtr pointer;
-
- Q_DECL_CONSTEXPR inline iterator() : o(nullptr), i(0) {}
- Q_DECL_CONSTEXPR inline iterator(QJsonObject *obj, int index) : o(obj), i(index) {}
-
- inline QString key() const { return o->keyAt(i); }
- inline QJsonValueRef value() const { return QJsonValueRef(o, i); }
- inline QJsonValueRef operator*() const { return QJsonValueRef(o, i); }
-#ifdef Q_QDOC
- inline QJsonValueRef* operator->() const;
-#else
- inline QJsonValueRefPtr operator->() const { return QJsonValueRefPtr(o, i); }
+ typedef QJsonValueRef *pointer;
+
+ inline iterator() : item(static_cast<QJsonObject*>(nullptr), 0) { }
+ inline iterator(QJsonObject *obj, qsizetype index) : item(obj, index) { }
+
+ constexpr iterator(const iterator &other) = default;
+ iterator &operator=(const iterator &other)
+ {
+ item.rebind(other.item);
+ return *this;
+ }
+
+ inline QString key() const { return item.objectKey(); }
+ inline QJsonValueRef value() const { return item; }
+ inline QJsonValueRef operator*() const { return item; }
+ 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 !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 !operator<=(other); }
+ bool operator>=(const iterator& other) const { return !operator<(other); }
#endif
- const QJsonValueRef operator[](int j) { return QJsonValueRef(o, i + j); }
-
- inline bool operator==(const iterator &other) const { return i == other.i; }
- inline bool operator!=(const iterator &other) const { return i != other.i; }
- bool operator<(const iterator& other) const { return i < other.i; }
- bool operator<=(const iterator& other) const { return i <= other.i; }
- bool operator>(const iterator& other) const { return i > other.i; }
- bool operator>=(const iterator& other) const { return i >= other.i; }
-
- inline iterator &operator++() { ++i; return *this; }
- inline iterator operator++(int) { iterator r = *this; ++i; return r; }
- inline iterator &operator--() { --i; return *this; }
- inline iterator operator--(int) { iterator r = *this; --i; return r; }
- inline iterator operator+(int j) const
- { iterator r = *this; r.i += j; return r; }
- inline iterator operator-(int j) const { return operator+(-j); }
- inline iterator &operator+=(int j) { i += j; return *this; }
- inline iterator &operator-=(int j) { i -= j; return *this; }
- int operator-(iterator j) const { return i - j.i; }
+ 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; }
+ inline iterator operator--(int) { iterator r = *this; --item.index; return r; }
+ inline iterator operator+(qsizetype j) const { iterator r = *this; return r += j; }
+ inline iterator operator-(qsizetype j) const { return operator+(-j); }
+ inline iterator &operator+=(qsizetype j) { item.index += quint64(j); return *this; }
+ inline iterator &operator-=(qsizetype j) { item.index -= quint64(j); return *this; }
+ qsizetype operator-(iterator j) const { return item.index - j.item.index; }
public:
- inline bool operator==(const const_iterator &other) const { return i == other.i; }
- inline bool operator!=(const const_iterator &other) const { return i != other.i; }
- bool operator<(const const_iterator& other) const { return i < other.i; }
- bool operator<=(const const_iterator& other) const { return i <= other.i; }
- bool operator>(const const_iterator& other) const { return i > other.i; }
- bool operator>=(const const_iterator& other) const { return i >= other.i; }
+#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 !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 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;
class const_iterator
{
friend class iterator;
- const QJsonObject *o;
- int i;
+ QJsonValueConstRef item;
public:
typedef std::random_access_iterator_tag iterator_category;
- typedef int difference_type;
+ typedef qsizetype difference_type;
typedef QJsonValue value_type;
- typedef QJsonValue reference;
- typedef QJsonValuePtr pointer;
+ typedef const QJsonValueConstRef reference;
+ typedef const QJsonValueConstRef *pointer;
- Q_DECL_CONSTEXPR inline const_iterator() : o(nullptr), i(0) {}
- Q_DECL_CONSTEXPR inline const_iterator(const QJsonObject *obj, int index)
- : o(obj), i(index) {}
+ inline const_iterator() : item(static_cast<QJsonObject*>(nullptr), 0) { }
+ inline const_iterator(const QJsonObject *obj, qsizetype index)
+ : item(const_cast<QJsonObject*>(obj), index) { }
inline const_iterator(const iterator &other)
- : o(other.o), i(other.i) {}
-
- inline QString key() const { return o->keyAt(i); }
- inline QJsonValue value() const { return o->valueAt(i); }
- inline QJsonValue operator*() const { return o->valueAt(i); }
-#ifdef Q_QDOC
- inline QJsonValue* operator->() const;
-#else
- inline QJsonValuePtr operator->() const { return QJsonValuePtr(o->valueAt(i)); }
+ : item(other.item) { }
+
+ constexpr const_iterator(const const_iterator &other) = default;
+ const_iterator &operator=(const const_iterator &other)
+ {
+ item.rebind(other.item);
+ return *this;
+ }
+
+ inline QString key() const { return item.objectKey(); }
+ inline QJsonValueConstRef value() const { return item; }
+ 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 !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 !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; }
+ inline const_iterator operator--(int) { const_iterator r = *this; --item.index; return r; }
+ inline const_iterator operator+(qsizetype j) const { const_iterator r = *this; return r += j; }
+ inline const_iterator operator-(qsizetype j) const { return operator+(-j); }
+ 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 !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 !operator<=(other); }
+ bool operator>=(const iterator& other) const { return !operator<(other); }
#endif
- const QJsonValue operator[](int j) { return o->valueAt(i + j); }
-
- inline bool operator==(const const_iterator &other) const { return i == other.i; }
- inline bool operator!=(const const_iterator &other) const { return i != other.i; }
- bool operator<(const const_iterator& other) const { return i < other.i; }
- bool operator<=(const const_iterator& other) const { return i <= other.i; }
- bool operator>(const const_iterator& other) const { return i > other.i; }
- bool operator>=(const const_iterator& other) const { return i >= other.i; }
-
- inline const_iterator &operator++() { ++i; return *this; }
- inline const_iterator operator++(int) { const_iterator r = *this; ++i; return r; }
- inline const_iterator &operator--() { --i; return *this; }
- inline const_iterator operator--(int) { const_iterator r = *this; --i; return r; }
- inline const_iterator operator+(int j) const
- { const_iterator r = *this; r.i += j; return r; }
- inline const_iterator operator-(int j) const { return operator+(-j); }
- inline const_iterator &operator+=(int j) { i += j; return *this; }
- inline const_iterator &operator-=(int j) { i -= j; return *this; }
- int operator-(const_iterator j) const { return i - j.i; }
-
- inline bool operator==(const iterator &other) const { return i == other.i; }
- inline bool operator!=(const iterator &other) const { return i != other.i; }
- bool operator<(const iterator& other) const { return i < other.i; }
- bool operator<=(const iterator& other) const { return i <= other.i; }
- bool operator>(const iterator& other) const { return i > other.i; }
- bool operator>=(const iterator& other) const { return i >= other.i; }
+
+ 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;
// STL style
- inline iterator begin() { detach2(); return iterator(this, 0); }
+ inline iterator begin() { detach(); return iterator(this, 0); }
inline const_iterator begin() const { return const_iterator(this, 0); }
inline const_iterator constBegin() const { return const_iterator(this, 0); }
- inline iterator end() { detach2(); return iterator(this, size()); }
+ inline iterator end() { detach(); return iterator(this, size()); }
inline const_iterator end() const { return const_iterator(this, size()); }
inline const_iterator constEnd() const { return const_iterator(this, size()); }
iterator erase(iterator it);
@@ -244,41 +291,52 @@ 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(QLatin1String key);
+ iterator find(QLatin1StringView key);
const_iterator find(QStringView key) const { return constFind(key); }
- const_iterator find(QLatin1String key) const { return constFind(key); }
+ const_iterator find(QLatin1StringView key) const { return constFind(key); }
const_iterator constFind(QStringView key) const;
- const_iterator constFind(QLatin1String key) const;
+ const_iterator constFind(QLatin1StringView key) const;
iterator insert(QStringView key, const QJsonValue &value);
- iterator insert(QLatin1String key, const QJsonValue &value);
+ iterator insert(QLatin1StringView key, const QJsonValue &value);
// STL compatibility
typedef QJsonValue mapped_type;
typedef QString key_type;
- typedef int size_type;
+ typedef qsizetype size_type;
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;
+ friend class QJsonValueConstRef;
friend class QJsonValueRef;
friend class QCborMap;
friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonObject &);
QJsonObject(QCborContainerPrivate *object);
- void initialize();
- // ### Qt 6: remove me and merge with detach2
- void detach(uint reserve = 0);
- bool detach2(uint reserve = 0);
- void compact();
+ bool detach(qsizetype reserve = 0);
template <typename T> QJsonValue valueImpl(T key) const;
template <typename T> QJsonValueRef atImpl(T key);
@@ -289,19 +347,25 @@ private:
template <typename T> const_iterator constFindImpl(T key) const;
template <typename T> iterator insertImpl(T key, const QJsonValue &value);
- QString keyAt(int i) const;
- QJsonValue valueAt(int i) const;
- void setValueAt(int i, const QJsonValue &val);
- void removeAt(int i);
- template <typename T> iterator insertAt(int i, T key, const QJsonValue &val, bool exists);
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
+ QString keyAt(qsizetype i) const;
+ QJsonValue valueAt(qsizetype i) const;
+ void setValueAt(qsizetype i, const QJsonValue &val);
+#endif
+ void removeAt(qsizetype i);
+ template <typename T> iterator insertAt(qsizetype i, T key, const QJsonValue &val, bool exists);
- // ### Qt 6: remove
- void *dead = nullptr;
QExplicitlySharedDataPointer<QCborContainerPrivate> o;
};
Q_DECLARE_SHARED(QJsonObject)
+#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED)
+inline QJsonValueConstRef::QJsonValueConstRef(QJsonObject *o, qsizetype idx)
+ : d(o ? o->o.data() : nullptr), is_object(true), index(idx)
+{}
+#endif
+
Q_CORE_EXPORT size_t qHash(const QJsonObject &object, size_t seed = 0);
#if !defined(QT_NO_DEBUG_STREAM) && !defined(QT_JSON_READONLY)