summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qvariant.h
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-07-12 21:07:22 +0200
committerLars Knoll <lars.knoll@qt.io>2020-08-24 00:17:05 +0200
commitd1c3f81126863791df6bad2a38aa9c322e481388 (patch)
tree30ca2d6b64ed99fe943253ed0f4ae25390dd8f67 /src/corelib/kernel/qvariant.h
parent73fd7f2efcdb31e33febe840357a9d7b05e89165 (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.h19
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