From d1c3f81126863791df6bad2a38aa9c322e481388 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Sun, 12 Jul 2020 21:07:22 +0200 Subject: [PATCH] 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 --- src/corelib/kernel/qvariant.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h index e4bfa7c896d..419aefd081d 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 + 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 + const T &get() const + { return *static_cast(CanUseInternalSpace ? &data : data.shared->data()); } + inline QMetaType type() const { return QMetaType(reinterpret_cast(packedType << 2)); } + inline int typeId() const + { + return type().id(); + } }; public: inline bool operator==(const QVariant &v) const