diff options
author | Sona Kurazyan <sona.kurazyan@qt.io> | 2020-08-18 16:34:55 +0200 |
---|---|---|
committer | Sona Kurazyan <sona.kurazyan@qt.io> | 2020-08-20 17:25:09 +0200 |
commit | 35d90cb89809b540fec49e974e1a9f802f819eb6 (patch) | |
tree | dd0d8affdc3cc4419f69699e51f3e46a86685d65 /src/corelib/serialization | |
parent | a41c61fb2d2f973fd1cd5e95ee5be1ac1a4f8433 (diff) |
Resolve the remaining open ### Qt6 comments of QJsonValue
Changed QJsonValue to use QCborValue for data storage. Removed unused
internal methods.
Task-number: QTBUG-85700
Change-Id: I784fc7c0c4407f79eb7ca87a1f5116f00c26155d
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/serialization')
-rw-r--r-- | src/corelib/serialization/qjson_p.h | 5 | ||||
-rw-r--r-- | src/corelib/serialization/qjsoncbor.cpp | 2 | ||||
-rw-r--r-- | src/corelib/serialization/qjsonvalue.cpp | 154 | ||||
-rw-r--r-- | src/corelib/serialization/qjsonvalue.h | 10 |
4 files changed, 63 insertions, 108 deletions
diff --git a/src/corelib/serialization/qjson_p.h b/src/corelib/serialization/qjson_p.h index 90f1071b71..edab2c6b13 100644 --- a/src/corelib/serialization/qjson_p.h +++ b/src/corelib/serialization/qjson_p.h @@ -204,13 +204,12 @@ class Value { public: static QCborContainerPrivate *container(const QCborValue &v) { return v.container; } + static qint64 valueHelper(const QCborValue &v) { return v.n; } static QJsonValue fromTrustedCbor(const QCborValue &v) { QJsonValue result; - result.d = v.container; - result.n = v.n; - result.t = v.t; + result.value = v; return result; } }; diff --git a/src/corelib/serialization/qjsoncbor.cpp b/src/corelib/serialization/qjsoncbor.cpp index e836935f6f..5d6f521d1b 100644 --- a/src/corelib/serialization/qjsoncbor.cpp +++ b/src/corelib/serialization/qjsoncbor.cpp @@ -640,7 +640,7 @@ QCborValue QCborValue::fromJsonValue(const QJsonValue &v) case QJsonValue::Bool: return v.toBool(); case QJsonValue::Double: { - if (v.t == Integer) + if (v.value.t == Integer) return v.toInteger(); return v.toDouble(); } diff --git a/src/corelib/serialization/qjsonvalue.cpp b/src/corelib/serialization/qjsonvalue.cpp index 0d31f4b756..34106da231 100644 --- a/src/corelib/serialization/qjsonvalue.cpp +++ b/src/corelib/serialization/qjsonvalue.cpp @@ -114,26 +114,25 @@ QT_BEGIN_NAMESPACE The default is to create a Null value. */ QJsonValue::QJsonValue(Type type) - : d(nullptr), t(QCborValue::Undefined) { switch (type) { case Null: - t = QCborValue::Null; + value = QCborValue::Null; break; case Bool: - t = QCborValue::False; + value = QCborValue::False; break; case Double: - t = QCborValue::Double; + value = QCborValue::Double; break; case String: - t = QCborValue::String; + value = QCborValue::String; break; case Array: - t = QCborValue::Array; + value = QCborValue::Array; break; case Object: - t = QCborValue::Map; + value = QCborValue::Map; break; case Undefined: break; @@ -144,24 +143,27 @@ QJsonValue::QJsonValue(Type type) Creates a value of type Bool, with value \a b. */ QJsonValue::QJsonValue(bool b) - : t(b ? QCborValue::True : QCborValue::False) + : value(b) { } +static inline QCborValue doubleValueHelper(double v) +{ + qint64 n = 0; + // Convert to integer if the number is an integer and changing wouldn't + // introduce additional digit precision not present in the double. + if (convertDoubleTo<qint64>(v, &n, false /* allow_precision_upgrade */)) + return n; + else + return v; +} + /*! Creates a value of type Double, with value \a v. */ QJsonValue::QJsonValue(double v) - : d(nullptr) + : value(doubleValueHelper(v)) { - // Convert to integer if the number is an integer and changing wouldn't - // introduce additional digit precision not present in the double. - if (convertDoubleTo<qint64>(v, &n, false /* allow_precision_upgrade */)) { - t = QCborValue::Integer; - } else { - memcpy(&n, &v, sizeof(n)); - t = QCborValue::Double; - } } /*! @@ -169,7 +171,7 @@ QJsonValue::QJsonValue(double v) Creates a value of type Double, with value \a v. */ QJsonValue::QJsonValue(int v) - : n(v), t(QCborValue::Integer) + : value(v) { } @@ -180,7 +182,7 @@ QJsonValue::QJsonValue(int v) If you pass in values outside this range expect a loss of precision to occur. */ QJsonValue::QJsonValue(qint64 v) - : n(v), t(QCborValue::Integer) + : value(v) { } @@ -188,7 +190,7 @@ QJsonValue::QJsonValue(qint64 v) Creates a value of type String, with value \a s. */ QJsonValue::QJsonValue(const QString &s) - : QJsonValue(QJsonPrivate::Value::fromTrustedCbor(s)) + : value(s) { } @@ -204,17 +206,11 @@ QJsonValue::QJsonValue(const QString &s) \since 5.3 */ -// ### Qt6: remove -void QJsonValue::stringDataFromQStringHelper(const QString &string) -{ - *this = QJsonValue(string); -} - /*! Creates a value of type String, with value \a s. */ QJsonValue::QJsonValue(QLatin1String s) - : QJsonValue(QJsonPrivate::Value::fromTrustedCbor(s)) + : value(s) { } @@ -222,7 +218,7 @@ QJsonValue::QJsonValue(QLatin1String s) Creates a value of type Array, with value \a a. */ QJsonValue::QJsonValue(const QJsonArray &a) - : n(-1), d(a.a), t(QCborValue::Array) + : value(QCborArray::fromJsonArray(a)) { } @@ -230,7 +226,7 @@ QJsonValue::QJsonValue(const QJsonArray &a) Creates a value of type Object, with value \a o. */ QJsonValue::QJsonValue(const QJsonObject &o) - : n(-1), d(o.o), t(QCborValue::Map) + : value(QCborMap::fromJsonObject(o)) { } @@ -244,10 +240,8 @@ QJsonValue::~QJsonValue() = default; Creates a copy of \a other. */ QJsonValue::QJsonValue(const QJsonValue &other) + : value(other.value) { - n = other.n; - t = other.t; - d = other.d; } /*! @@ -260,21 +254,15 @@ QJsonValue &QJsonValue::operator =(const QJsonValue &other) return *this; } -QJsonValue::QJsonValue(QJsonValue &&other) noexcept : - n(other.n), - d(other.d), - t(other.t) +QJsonValue::QJsonValue(QJsonValue &&other) noexcept + : value(std::move(other.value)) { - other.n = 0; - other.d = nullptr; - other.t = QCborValue::Null; + other.value = QCborValue(nullptr); } void QJsonValue::swap(QJsonValue &other) noexcept { - qSwap(n, other.n); - qSwap(d, other.d); - qSwap(t, other.t); + value.swap(other.value); } /*! @@ -553,7 +541,7 @@ QJsonValue QJsonValue::fromVariant(const QVariant &variant) */ QVariant QJsonValue::toVariant() const { - switch (t) { + switch (value.type()) { case QCborValue::True: return true; case QCborValue::False: @@ -565,13 +553,9 @@ QVariant QJsonValue::toVariant() const case QCborValue::String: return toString(); case QCborValue::Array: - return d ? - QJsonArray(d.data()).toVariantList() : - QVariantList(); + return toArray().toVariantList(); case QCborValue::Map: - return d ? - QJsonObject(d.data()).toVariantMap() : - QVariantMap(); + return toObject().toVariantMap(); case QCborValue::Null: return QVariant::fromValue(nullptr); case QCborValue::Undefined: @@ -605,7 +589,7 @@ QVariant QJsonValue::toVariant() const */ QJsonValue::Type QJsonValue::type() const { - switch (t) { + switch (value.type()) { case QCborValue::Null: return QJsonValue::Null; case QCborValue::True: @@ -633,7 +617,7 @@ QJsonValue::Type QJsonValue::type() const */ bool QJsonValue::toBool(bool defaultValue) const { - switch (t) { + switch (value.type()) { case QCborValue::True: return true; case QCborValue::False: @@ -652,17 +636,19 @@ bool QJsonValue::toBool(bool defaultValue) const */ int QJsonValue::toInt(int defaultValue) const { - switch (t) { + switch (value.type()) { case QCborValue::Double: { int dblInt; if (convertDoubleTo<int>(toDouble(), &dblInt)) return dblInt; break; } - case QCborValue::Integer: + case QCborValue::Integer: { + const auto n = value.toInteger(); if (qint64(int(n)) == n) return int(n); break; + } default: break; } @@ -678,9 +664,9 @@ int QJsonValue::toInt(int defaultValue) const */ qint64 QJsonValue::toInteger(qint64 defaultValue) const { - switch (t) { + switch (value.type()) { case QCborValue::Integer: - return n; + return value.toInteger(); case QCborValue::Double: { qint64 dblInt; if (convertDoubleTo<qint64>(toDouble(), &dblInt)) @@ -700,17 +686,7 @@ qint64 QJsonValue::toInteger(qint64 defaultValue) const */ double QJsonValue::toDouble(double defaultValue) const { - switch (t) { - case QCborValue::Double: { - double d; - memcpy(&d, &n, sizeof(d)); - return d; - } - case QCborValue::Integer: - return double(n); - default: - return defaultValue; - } + return value.toDouble(defaultValue); } /*! @@ -720,7 +696,7 @@ double QJsonValue::toDouble(double defaultValue) const */ QString QJsonValue::toString(const QString &defaultValue) const { - return (t == QCborValue::String && d) ? d->stringAt(n) : defaultValue; + return value.toString(defaultValue); } /*! @@ -732,7 +708,7 @@ QString QJsonValue::toString(const QString &defaultValue) const */ QString QJsonValue::toString() const { - return (t == QCborValue::String && d) ? d->stringAt(n) : QString(); + return value.toString(); } /*! @@ -742,10 +718,12 @@ QString QJsonValue::toString() const */ QJsonArray QJsonValue::toArray(const QJsonArray &defaultValue) const { - if (t != QCborValue::Array || n >= 0 || !d) + const auto dd = QJsonPrivate::Value::container(value); + const auto n = QJsonPrivate::Value::valueHelper(value); + if (value.type() != QCborValue::Array || n >= 0 || !dd) return defaultValue; - return QJsonArray(d.data()); + return QJsonArray(dd); } /*! @@ -767,10 +745,12 @@ QJsonArray QJsonValue::toArray() const */ QJsonObject QJsonValue::toObject(const QJsonObject &defaultValue) const { - if (t != QCborValue::Map || n >= 0 || !d) + const auto dd = QJsonPrivate::Value::container(value); + const auto n = QJsonPrivate::Value::valueHelper(value); + if (value.type() != QCborValue::Map || n >= 0 || !dd) return defaultValue; - return QJsonObject(d.data()); + return QJsonObject(dd); } /*! @@ -853,7 +833,7 @@ const QJsonValue QJsonValue::operator[](qsizetype i) const */ bool QJsonValue::operator==(const QJsonValue &other) const { - if (t != other.t) { + if (value.type() != other.value.type()) { if (isDouble() && other.isDouble()) { // One value Cbor integer, one Cbor double, should interact as doubles. return toDouble() == other.toDouble(); @@ -861,7 +841,7 @@ bool QJsonValue::operator==(const QJsonValue &other) const return false; } - switch (t) { + switch (value.type()) { case QCborValue::Undefined: case QCborValue::Null: case QCborValue::True: @@ -870,21 +850,14 @@ bool QJsonValue::operator==(const QJsonValue &other) const case QCborValue::Double: return toDouble() == other.toDouble(); case QCborValue::Integer: - return n == other.n; + return QJsonPrivate::Value::valueHelper(value) + == QJsonPrivate::Value::valueHelper(other.value); case QCborValue::String: return toString() == other.toString(); case QCborValue::Array: - if (!d) - return !other.d || other.d->elements.length() == 0; - if (!other.d) - return d->elements.length() == 0; - return QJsonArray(d.data()) == QJsonArray(other.d.data()); + return toArray() == other.toArray(); case QCborValue::Map: - if (!d) - return !other.d || other.d->elements.length() == 0; - if (!other.d) - return d->elements.length() == 0; - return QJsonObject(d.data()) == QJsonObject(other.d.data()); + return toObject() == other.toObject(); default: return false; } @@ -900,15 +873,6 @@ bool QJsonValue::operator!=(const QJsonValue &other) const } /*! - \internal - */ -void QJsonValue::detach() -{ - d.detach(); -} - - -/*! \class QJsonValueRef \inmodule QtCore \reentrant @@ -1000,7 +964,7 @@ size_t qHash(const QJsonValue &value, size_t seed) QDebug operator<<(QDebug dbg, const QJsonValue &o) { QDebugStateSaver saver(dbg); - switch (o.t) { + switch (o.value.type()) { case QCborValue::Undefined: dbg << "QJsonValue(undefined)"; break; diff --git a/src/corelib/serialization/qjsonvalue.h b/src/corelib/serialization/qjsonvalue.h index bda77aa0df..2e99103411 100644 --- a/src/corelib/serialization/qjsonvalue.h +++ b/src/corelib/serialization/qjsonvalue.h @@ -141,15 +141,7 @@ private: friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonValue &); friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QJsonValue &); - // ### Qt6: Remove this. - void stringDataFromQStringHelper(const QString &string); - - void detach(); - - // ### Qt6: change to an actual QCborValue - qint64 n = 0; - QExplicitlySharedDataPointer<QCborContainerPrivate> d; // needed for Objects, Arrays, Strings - QCborValue::Type t; + QCborValue value; // Assert binary compatibility with pre-5.15 QJsonValue static_assert(sizeof(QExplicitlySharedDataPointer<QCborContainerPrivate>) == sizeof(void *)); |