diff options
-rw-r--r-- | src/corelib/serialization/qjson_p.h | 24 | ||||
-rw-r--r-- | src/corelib/serialization/qjsonarray.h | 2 | ||||
-rw-r--r-- | src/corelib/serialization/qjsonobject.h | 1 | ||||
-rw-r--r-- | src/corelib/serialization/qjsonvalue.cpp | 7 | ||||
-rw-r--r-- | src/corelib/serialization/qjsonvalue.h | 1 | ||||
-rw-r--r-- | tests/auto/corelib/serialization/json/tst_qtjson.cpp | 6 |
6 files changed, 33 insertions, 8 deletions
diff --git a/src/corelib/serialization/qjson_p.h b/src/corelib/serialization/qjson_p.h index edab2c6b13..f8f807189f 100644 --- a/src/corelib/serialization/qjson_p.h +++ b/src/corelib/serialization/qjson_p.h @@ -56,6 +56,9 @@ #include <qcborvalue.h> #include <private/qcborvalue_p.h> +#include <qjsonarray.h> +#include <qjsonobject.h> + QT_BEGIN_NAMESPACE namespace QJsonPrivate { @@ -203,8 +206,27 @@ inline void swap(KeyIterator::reference a, KeyIterator::reference b) class Value { public: - static QCborContainerPrivate *container(const QCborValue &v) { return v.container; } static qint64 valueHelper(const QCborValue &v) { return v.n; } + static QCborContainerPrivate *container(const QCborValue &v) { return v.container; } + static const QCborContainerPrivate *container(QJsonValueConstRef r) noexcept + { + return (r.is_object ? r.o->o : r.a->a).data(); + } + static QCborContainerPrivate *container(QJsonValueRef r) noexcept + { + return const_cast<QCborContainerPrivate *>(container(QJsonValueConstRef(r))); + } + static qsizetype indexHelper(QJsonValueConstRef r) noexcept + { + qsizetype index = r.index; + if (r.is_object) + index = index * 2 + 1; + return index; + } + static const QtCbor::Element &elementHelper(QJsonValueConstRef r) noexcept + { + return container(r)->elements.at(indexHelper(r)); + } static QJsonValue fromTrustedCbor(const QCborValue &v) { diff --git a/src/corelib/serialization/qjsonarray.h b/src/corelib/serialization/qjsonarray.h index cf534103f9..0128a36470 100644 --- a/src/corelib/serialization/qjsonarray.h +++ b/src/corelib/serialization/qjsonarray.h @@ -262,6 +262,8 @@ public: private: friend class QJsonValue; + friend class QJsonValueConstRef; + friend class QJsonPrivate::Value; friend class QJsonDocument; friend class QCborArray; friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonArray &); diff --git a/src/corelib/serialization/qjsonobject.h b/src/corelib/serialization/qjsonobject.h index e569d85192..d9f6785631 100644 --- a/src/corelib/serialization/qjsonobject.h +++ b/src/corelib/serialization/qjsonobject.h @@ -284,6 +284,7 @@ public: private: friend class QJsonValue; friend class QJsonDocument; + friend class QJsonPrivate::Value; friend class QJsonValueConstRef; friend class QJsonValueRef; friend class QCborMap; diff --git a/src/corelib/serialization/qjsonvalue.cpp b/src/corelib/serialization/qjsonvalue.cpp index 28da3e5b2b..481ac64f55 100644 --- a/src/corelib/serialization/qjsonvalue.cpp +++ b/src/corelib/serialization/qjsonvalue.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2022 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -951,9 +952,9 @@ QJsonObject QJsonValueConstRef::toObject() const QJsonValue QJsonValueConstRef::concrete(QJsonValueConstRef self) noexcept { - if (!self.is_object) - return self.a->at(self.index); - return self.o->valueAt(self.index); + const QCborContainerPrivate *d = QJsonPrivate::Value::container(self); + qsizetype index = QJsonPrivate::Value::indexHelper(self); + return QJsonPrivate::Value::fromTrustedCbor(d->valueAt(index)); } #if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED) diff --git a/src/corelib/serialization/qjsonvalue.h b/src/corelib/serialization/qjsonvalue.h index 9266ef9f2d..11b9ad1b01 100644 --- a/src/corelib/serialization/qjsonvalue.h +++ b/src/corelib/serialization/qjsonvalue.h @@ -206,6 +206,7 @@ protected: friend class QJsonArray; friend class QJsonObject; + friend class QJsonPrivate::Value; }; class Q_CORE_EXPORT QJsonValueRef : public QJsonValueConstRef diff --git a/tests/auto/corelib/serialization/json/tst_qtjson.cpp b/tests/auto/corelib/serialization/json/tst_qtjson.cpp index 1b6148429f..98e1782840 100644 --- a/tests/auto/corelib/serialization/json/tst_qtjson.cpp +++ b/tests/auto/corelib/serialization/json/tst_qtjson.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2021 The Qt Company Ltd. -** Copyright (C) 2021 Intel Corporation. +** Copyright (C) 2022 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -1226,14 +1226,12 @@ void tst_QtJson::testObjectFind() QJsonObject::iterator it = object.find(QLatin1String("1")); QCOMPARE((*it).toDouble(), 1.); it = object.find(QString("11")); - QCOMPARE((*it).type(), QJsonValue::Undefined); QCOMPARE(it, object.end()); QJsonObject::const_iterator cit = object.constFind(QLatin1String("1")); QCOMPARE((*cit).toDouble(), 1.); cit = object.constFind(QString("11")); - QCOMPARE((*it).type(), QJsonValue::Undefined); - QCOMPARE(it, object.end()); + QCOMPARE(cit, object.constEnd()); } void tst_QtJson::testDocument() |