diff options
author | Lars Knoll <lars.knoll@qt.io> | 2020-07-12 21:07:22 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2020-08-24 00:17:05 +0200 |
commit | d1c3f81126863791df6bad2a38aa9c322e481388 (patch) | |
tree | 30ca2d6b64ed99fe943253ed0f4ae25390dd8f67 /src/corelib/kernel/qvariant.h | |
parent | 73fd7f2efcdb31e33febe840357a9d7b05e89165 (diff) |
Add QVariant::Private::storage(), get() and typeId()
Adds convenient access to the data from the Private pointer.
data() determines the storage location at run time, get()
at compile time. internalStorage() can be used if we're accessing
one of multiple types, but know that the type is stored internally.
typeId() is an optimization as it allows retrieving the type id
of the metatype without atomic refcounting operations (which
type().id() would be doing).
Change-Id: I39a508c530a1588053248607c8932e501fd474dc
Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
Diffstat (limited to 'src/corelib/kernel/qvariant.h')
-rw-r--r-- | src/corelib/kernel/qvariant.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h index e4bfa7c896..419aefd081 100644 --- a/src/corelib/kernel/qvariant.h +++ b/src/corelib/kernel/qvariant.h @@ -493,10 +493,29 @@ class Q_CORE_EXPORT QVariant quintptr packedType : sizeof(QMetaType) * 8 - 2; quintptr is_shared : 1; quintptr is_null : 1; + + template<typename T> + static constexpr bool CanUseInternalSpace = sizeof(T) <= sizeof(QVariant::Private::Data); + + const void *storage() const + { return is_shared ? data.shared->data() : &data; } + + const void *internalStorage() const + { Q_ASSERT(is_shared); return &data; } + + // determine internal storage at compile time + template<typename T> + const T &get() const + { return *static_cast<const T *>(CanUseInternalSpace<T> ? &data : data.shared->data()); } + inline QMetaType type() const { return QMetaType(reinterpret_cast<QtPrivate::QMetaTypeInterface *>(packedType << 2)); } + inline int typeId() const + { + return type().id(); + } }; public: inline bool operator==(const QVariant &v) const |