diff options
Diffstat (limited to 'src/corelib/json')
-rw-r--r-- | src/corelib/json/qjson.cpp | 13 | ||||
-rw-r--r-- | src/corelib/json/qjson_p.h | 129 | ||||
-rw-r--r-- | src/corelib/json/qjsonarray.cpp | 21 | ||||
-rw-r--r-- | src/corelib/json/qjsonarray.h | 22 | ||||
-rw-r--r-- | src/corelib/json/qjsondocument.cpp | 74 | ||||
-rw-r--r-- | src/corelib/json/qjsondocument.h | 23 | ||||
-rw-r--r-- | src/corelib/json/qjsonobject.cpp | 22 | ||||
-rw-r--r-- | src/corelib/json/qjsonobject.h | 21 | ||||
-rw-r--r-- | src/corelib/json/qjsonvalue.cpp | 78 | ||||
-rw-r--r-- | src/corelib/json/qjsonvalue.h | 29 |
10 files changed, 293 insertions, 139 deletions
diff --git a/src/corelib/json/qjson.cpp b/src/corelib/json/qjson.cpp index d509349a51..e4bca3bcd0 100644 --- a/src/corelib/json/qjson.cpp +++ b/src/corelib/json/qjson.cpp @@ -45,15 +45,8 @@ QT_BEGIN_NAMESPACE namespace QJsonPrivate { -#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN -#define Q_TO_LITTLE_ENDIAN(x) (x) -#else -#define Q_TO_LITTLE_ENDIAN(x) ( ((x & 0xff) << 24) | ((x & 0xff00) << 8) | ((x & 0xff0000) >> 8) | ((x & 0xff000000) >> 24) ) -#endif - -static const Base emptyArray = { { Q_TO_LITTLE_ENDIAN(sizeof(Base)) }, { 0 }, { 0 } }; -static const Base emptyObject = { { Q_TO_LITTLE_ENDIAN(sizeof(Base)) }, { 0 }, { 0 } }; - +static Q_CONSTEXPR Base emptyArray = { { qle_uint(sizeof(Base)) }, { 0 }, { qle_uint(0) } }; +static Q_CONSTEXPR Base emptyObject = { { qle_uint(sizeof(Base)) }, { 0 }, { qle_uint(0) } }; void Data::compact() { @@ -394,7 +387,7 @@ int Value::requiredStorage(QJsonValue &v, bool *compressed) v.d->compact(); v.base = static_cast<QJsonPrivate::Base *>(v.d->header->root()); } - return v.base ? v.base->size : sizeof(QJsonPrivate::Base); + return v.base ? uint(v.base->size) : sizeof(QJsonPrivate::Base); case QJsonValue::Undefined: case QJsonValue::Null: case QJsonValue::Bool: diff --git a/src/corelib/json/qjson_p.h b/src/corelib/json/qjson_p.h index c012ec2662..131528376b 100644 --- a/src/corelib/json/qjson_p.h +++ b/src/corelib/json/qjson_p.h @@ -61,6 +61,7 @@ #include <qendian.h> #include <qnumeric.h> +#include "private/qendian_p.h" #include "private/qsimd_p.h" #include <limits.h> @@ -131,42 +132,7 @@ class Value; class Entry; template<typename T> -class q_littleendian -{ -public: - T val; - - q_littleendian &operator =(T i) { val = qToLittleEndian(i); return *this; } - operator T() const { return qFromLittleEndian(val); } - - bool operator ==(T i) { return qFromLittleEndian(val) == i; } - bool operator !=(T i) { return qFromLittleEndian(val) != i; } - bool operator ==(q_littleendian<T> i) { return val == i.val; } - bool operator !=(q_littleendian<T> i) { return val != i.val; } - bool operator <(T i) { return qFromLittleEndian(val) < i; } - bool operator >(T i) { return qFromLittleEndian(val) > i; } - bool operator <=(T i) { return qFromLittleEndian(val) <= i; } - bool operator >=(T i) { return qFromLittleEndian(val) >= i; } - q_littleendian &operator +=(T i) { - val = qToLittleEndian(qFromLittleEndian(val) + i); - return *this; - } - q_littleendian &operator |=(T i) { - val = qToLittleEndian(qFromLittleEndian(val) | i); - return *this; - } - q_littleendian &operator &=(T i) { - val = qToLittleEndian(qFromLittleEndian(val) & i); - return *this; - } -}; -} // namespace QJsonPrivate - -template <typename T> -class QTypeInfo<QJsonPrivate::q_littleendian<T> > - : public QTypeInfoMerger<QJsonPrivate::q_littleendian<T>, T> {}; - -namespace QJsonPrivate { +using q_littleendian = QLEInteger<T>; typedef q_littleendian<short> qle_short; typedef q_littleendian<unsigned short> qle_ushort; @@ -174,97 +140,10 @@ typedef q_littleendian<int> qle_int; typedef q_littleendian<unsigned int> qle_uint; template<int pos, int width> -class qle_bitfield -{ -public: - uint val; - - enum { - mask = ((1u << width) - 1) << pos - }; - - void operator =(uint t) { - uint i = qFromLittleEndian(val); - i &= ~mask; - i |= t << pos; - val = qToLittleEndian(i); - } - operator uint() const { - uint t = qFromLittleEndian(val); - t &= mask; - t >>= pos; - return t; - } - bool operator !() const { - return !operator uint(); - } - - bool operator ==(uint t) { return uint(*this) == t; } - bool operator !=(uint t) { return uint(*this) != t; } - bool operator <(uint t) { return uint(*this) < t; } - bool operator >(uint t) { return uint(*this) > t; } - bool operator <=(uint t) { return uint(*this) <= t; } - bool operator >=(uint t) { return uint(*this) >= t; } - qle_bitfield &operator +=(uint i) { - *this = (uint(*this) + i); - return *this; - } - qle_bitfield &operator -=(uint i) { - *this = (uint(*this) - i); - return *this; - } - qle_bitfield &operator |=(uint i) { - *this = (uint(*this) | i); - return *this; - } - qle_bitfield &operator &=(uint i) { - *this = (uint(*this) & i); - return *this; - } -}; +using qle_bitfield = QLEIntegerBitfield<uint, pos, width>; template<int pos, int width> -class qle_signedbitfield -{ -public: - uint val; - - enum { - mask = ((1u << width) - 1) << pos - }; - - void operator =(int t) { - uint i = qFromLittleEndian(val); - i &= ~mask; - i |= t << pos; - val = qToLittleEndian(i); - } - operator int() const { - uint i = qFromLittleEndian(val); - i <<= 32 - width - pos; - int t = (int) i; - t >>= 32 - width; - return t; - } - bool operator !() const { - return !operator int(); - } - - bool operator ==(int t) { return int(*this) == t; } - bool operator !=(int t) { return int(*this) != t; } - bool operator <(int t) { return int(*this) < t; } - bool operator >(int t) { return int(*this) > t; } - bool operator <=(int t) { return int(*this) <= t; } - bool operator >=(int t) { return int(*this) >= t; } - qle_signedbitfield &operator +=(int i) { - *this = (int(*this) + i); - return *this; - } - qle_signedbitfield &operator -=(int i) { - *this = (int(*this) - i); - return *this; - } -}; +using qle_signedbitfield = QLEIntegerBitfield<int, pos, width>; typedef qle_uint offset; diff --git a/src/corelib/json/qjsonarray.cpp b/src/corelib/json/qjsonarray.cpp index d4cc4b81df..c5a5aaf39d 100644 --- a/src/corelib/json/qjsonarray.cpp +++ b/src/corelib/json/qjsonarray.cpp @@ -212,6 +212,27 @@ QJsonArray &QJsonArray::operator =(const QJsonArray &other) return *this; } +/*! + \fn QJsonArray::QJsonArray(QJsonArray &&other) + \since 5.10 + + Move-constructs a QJsonArray from \a other. +*/ + +/*! + \fn QJsonArray &QJsonArray::operator =(QJsonArray &&other) + \since 5.10 + + Move-assigns \a other to this array. +*/ + +/*! + \fn void QJsonArray::swap(QJsonArray &other) + \since 5.10 + + Swaps the array \a other with this. This operation is very fast and never fails. +*/ + /*! \fn QJsonArray &QJsonArray::operator+=(const QJsonValue &value) Appends \a value to the array, and returns a reference to the array itself. diff --git a/src/corelib/json/qjsonarray.h b/src/corelib/json/qjsonarray.h index 3b6fa37cfa..ddba2ca78e 100644 --- a/src/corelib/json/qjsonarray.h +++ b/src/corelib/json/qjsonarray.h @@ -72,6 +72,20 @@ public: QJsonArray(const QJsonArray &other); QJsonArray &operator =(const QJsonArray &other); + QJsonArray(QJsonArray &&other) Q_DECL_NOTHROW + : d(other.d), + a(other.a) + { + other.d = nullptr; + other.a = nullptr; + } + + QJsonArray &operator =(QJsonArray &&other) Q_DECL_NOTHROW + { + swap(other); + return *this; + } + static QJsonArray fromStringList(const QStringList &list); static QJsonArray fromVariantList(const QVariantList &list); QVariantList toVariantList() const; @@ -101,6 +115,12 @@ public: bool operator==(const QJsonArray &other) const; bool operator!=(const QJsonArray &other) const; + void swap(QJsonArray &other) Q_DECL_NOTHROW + { + qSwap(d, other.d); + qSwap(a, other.a); + } + class const_iterator; class iterator { @@ -243,6 +263,8 @@ private: QJsonPrivate::Array *a; }; +Q_DECLARE_SHARED_NOT_MOVABLE_UNTIL_QT6(QJsonArray) + #if !defined(QT_NO_DEBUG_STREAM) && !defined(QT_JSON_READONLY) Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonArray &); #endif diff --git a/src/corelib/json/qjsondocument.cpp b/src/corelib/json/qjsondocument.cpp index ed454d5442..6469412054 100644 --- a/src/corelib/json/qjsondocument.cpp +++ b/src/corelib/json/qjsondocument.cpp @@ -153,6 +153,28 @@ QJsonDocument &QJsonDocument::operator =(const QJsonDocument &other) return *this; } +/*! + \fn QJsonDocument::QJsonDocument(QJsonDocument &&other) + \since 5.10 + + Move-constructs a QJsonDocument from \a other. +*/ + +/*! + \fn QJsonDocument &QJsonDocument::operator =(QJsonDocument &&other) + \since 5.10 + + Move-assigns \a other to this document. +*/ + +/*! + \fn void QJsonDocument::swap(QJsonDocument &other) + \since 5.10 + + Swaps the document \a other with this. This operation is very fast and never fails. +*/ + + /*! \enum QJsonDocument::DataValidation This value is used to tell QJsonDocument whether to validate the binary data @@ -529,6 +551,58 @@ void QJsonDocument::setArray(const QJsonArray &array) } /*! + Returns a QJsonValue representing the value for the key \a key. + + Equivalent to calling object().value(key). + + The returned QJsonValue is QJsonValue::Undefined if the key does not exist, + or if isObject() is false. + + \since 5.10 + + \sa QJsonValue, QJsonValue::isUndefined(), QJsonObject + */ +const QJsonValue QJsonDocument::operator[](const QString &key) const +{ + if (!isObject()) + return QJsonValue(QJsonValue::Undefined); + + return object().value(key); +} + +/*! + \overload + \since 5.10 +*/ +const QJsonValue QJsonDocument::operator[](QLatin1String key) const +{ + if (!isObject()) + return QJsonValue(QJsonValue::Undefined); + + return object().value(key); +} + +/*! + Returns a QJsonValue representing the value for index \a i. + + Equivalent to calling array().at(i). + + The returned QJsonValue is QJsonValue::Undefined, if \a i is out of bounds, + or if isArray() is false. + + \since 5.10 + + \sa QJsonValue, QJsonValue::isUndefined(), QJsonArray + */ +const QJsonValue QJsonDocument::operator[](int i) const +{ + if (!isArray()) + return QJsonValue(QJsonValue::Undefined); + + return array().at(i); +} + +/*! Returns \c true if the \a other document is equal to this document. */ bool QJsonDocument::operator==(const QJsonDocument &other) const diff --git a/src/corelib/json/qjsondocument.h b/src/corelib/json/qjsondocument.h index 19885a8d56..4e76af21e2 100644 --- a/src/corelib/json/qjsondocument.h +++ b/src/corelib/json/qjsondocument.h @@ -93,6 +93,23 @@ public: QJsonDocument(const QJsonDocument &other); QJsonDocument &operator =(const QJsonDocument &other); + QJsonDocument(QJsonDocument &&other) Q_DECL_NOTHROW + : d(other.d) + { + other.d = nullptr; + } + + QJsonDocument &operator =(QJsonDocument &&other) Q_DECL_NOTHROW + { + swap(other); + return *this; + } + + void swap(QJsonDocument &other) Q_DECL_NOTHROW + { + qSwap(d, other.d); + } + enum DataValidation { Validate, BypassValidation @@ -131,6 +148,10 @@ public: void setObject(const QJsonObject &object); void setArray(const QJsonArray &array); + const QJsonValue operator[](const QString &key) const; + const QJsonValue operator[](QLatin1String key) const; + const QJsonValue operator[](int i) const; + bool operator==(const QJsonDocument &other) const; bool operator!=(const QJsonDocument &other) const { return !(*this == other); } @@ -147,6 +168,8 @@ private: QJsonPrivate::Data *d; }; +Q_DECLARE_SHARED_NOT_MOVABLE_UNTIL_QT6(QJsonDocument) + #if !defined(QT_NO_DEBUG_STREAM) && !defined(QT_JSON_READONLY) Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonDocument &); #endif diff --git a/src/corelib/json/qjsonobject.cpp b/src/corelib/json/qjsonobject.cpp index b5b6f36bc6..4a316c8a6f 100644 --- a/src/corelib/json/qjsonobject.cpp +++ b/src/corelib/json/qjsonobject.cpp @@ -194,6 +194,28 @@ QJsonObject &QJsonObject::operator =(const QJsonObject &other) } /*! + \fn QJsonObject::QJsonObject(QJsonObject &&other) + \since 5.10 + + Move-constructs a QJsonObject from \a other. +*/ + +/*! + \fn QJsonObject &QJsonObject::operator =(QJsonObject &&other) + \since 5.10 + + Move-assigns \a other to this object. +*/ + +/*! + \fn void QJsonObject::swap(QJsonObject &other) + \since 5.10 + + Swaps the object \a other with this. This operation is very fast and never fails. +*/ + + +/*! Converts the variant map \a map to a QJsonObject. The keys in \a map will be used as the keys in the JSON object, diff --git a/src/corelib/json/qjsonobject.h b/src/corelib/json/qjsonobject.h index e238c84d98..c77e2164a8 100644 --- a/src/corelib/json/qjsonobject.h +++ b/src/corelib/json/qjsonobject.h @@ -74,6 +74,25 @@ public: QJsonObject(const QJsonObject &other); QJsonObject &operator =(const QJsonObject &other); + QJsonObject(QJsonObject &&other) Q_DECL_NOTHROW + : d(other.d), o(other.o) + { + other.d = nullptr; + other.o = nullptr; + } + + QJsonObject &operator =(QJsonObject &&other) Q_DECL_NOTHROW + { + swap(other); + return *this; + } + + void swap(QJsonObject &other) Q_DECL_NOTHROW + { + qSwap(d, other.d); + qSwap(o, other.o); + } + static QJsonObject fromVariantMap(const QVariantMap &map); QVariantMap toVariantMap() const; static QJsonObject fromVariantHash(const QVariantHash &map); @@ -241,6 +260,8 @@ private: QJsonPrivate::Object *o; }; +Q_DECLARE_SHARED_NOT_MOVABLE_UNTIL_QT6(QJsonObject) + #if !defined(QT_NO_DEBUG_STREAM) && !defined(QT_JSON_READONLY) Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonObject &); #endif diff --git a/src/corelib/json/qjsonvalue.cpp b/src/corelib/json/qjsonvalue.cpp index 4b52014db1..33707b6ec3 100644 --- a/src/corelib/json/qjsonvalue.cpp +++ b/src/corelib/json/qjsonvalue.cpp @@ -276,14 +276,32 @@ QJsonValue::QJsonValue(const QJsonValue &other) QJsonValue &QJsonValue::operator =(const QJsonValue &other) { QJsonValue copy(other); - // swap(copy); - qSwap(dbl, copy.dbl); - qSwap(d, copy.d); - qSwap(t, copy.t); + swap(copy); return *this; } /*! + \fn QJsonValue::QJsonValue(QJsonValue &&other) + \since 5.10 + + Move-constructs a QJsonValue from \a other. +*/ + +/*! + \fn QJsonValue &QJsonValue::operator =(QJsonValue &&other) + \since 5.10 + + Move-assigns \a other to this value. +*/ + +/*! + \fn void QJsonValue::swap(QJsonValue &other) + \since 5.10 + + Swaps the value \a other with this. This operation is very fast and never fails. +*/ + +/*! \fn bool QJsonValue::isNull() const Returns \c true if the value is null. @@ -625,6 +643,58 @@ QJsonObject QJsonValue::toObject() const } /*! + Returns a QJsonValue representing the value for the key \a key. + + Equivalent to calling toObject().value(key). + + The returned QJsonValue is QJsonValue::Undefined if the key does not exist, + or if isObject() is false. + + \since 5.10 + + \sa QJsonValue, QJsonValue::isUndefined(), QJsonObject + */ +const QJsonValue QJsonValue::operator[](const QString &key) const +{ + if (!isObject()) + return QJsonValue(QJsonValue::Undefined); + + return toObject().value(key); +} + +/*! + \overload + \since 5.10 +*/ +const QJsonValue QJsonValue::operator[](QLatin1String key) const +{ + if (!isObject()) + return QJsonValue(QJsonValue::Undefined); + + return toObject().value(key); +} + +/*! + Returns a QJsonValue representing the value for index \a i. + + Equivalent to calling toArray().at(i). + + The returned QJsonValue is QJsonValue::Undefined, if \a i is out of bounds, + or if isArray() is false. + + \since 5.10 + + \sa QJsonValue, QJsonValue::isUndefined(), QJsonArray + */ +const QJsonValue QJsonValue::operator[](int i) const +{ + if (!isArray()) + return QJsonValue(QJsonValue::Undefined); + + return toArray().at(i); +} + +/*! Returns \c true if the value is equal to \a other. */ bool QJsonValue::operator==(const QJsonValue &other) const diff --git a/src/corelib/json/qjsonvalue.h b/src/corelib/json/qjsonvalue.h index a853acaddd..5d5ec72605 100644 --- a/src/corelib/json/qjsonvalue.h +++ b/src/corelib/json/qjsonvalue.h @@ -92,6 +92,29 @@ public: QJsonValue(const QJsonValue &other); QJsonValue &operator =(const QJsonValue &other); + QJsonValue(QJsonValue &&other) Q_DECL_NOTHROW + : ui(other.ui), + d(other.d), + t(other.t) + { + other.ui = 0; + other.d = nullptr; + other.t = Null; + } + + QJsonValue &operator =(QJsonValue &&other) Q_DECL_NOTHROW + { + swap(other); + return *this; + } + + void swap(QJsonValue &other) Q_DECL_NOTHROW + { + qSwap(ui, other.ui); + qSwap(d, other.d); + qSwap(t, other.t); + } + static QJsonValue fromVariant(const QVariant &variant); QVariant toVariant() const; @@ -114,6 +137,10 @@ public: QJsonObject toObject() const; QJsonObject toObject(const QJsonObject &defaultValue) const; + const QJsonValue operator[](const QString &key) const; + const QJsonValue operator[](QLatin1String key) const; + const QJsonValue operator[](int i) const; + bool operator==(const QJsonValue &other) const; bool operator!=(const QJsonValue &other) const; @@ -217,6 +244,8 @@ public: }; #endif +Q_DECLARE_SHARED_NOT_MOVABLE_UNTIL_QT6(QJsonValue) + #if !defined(QT_NO_DEBUG_STREAM) && !defined(QT_JSON_READONLY) Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonValue &); #endif |