diff options
Diffstat (limited to 'src/qml/qml/qqmlvaluetypewrapper_p.h')
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper_p.h | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/src/qml/qml/qqmlvaluetypewrapper_p.h b/src/qml/qml/qqmlvaluetypewrapper_p.h index 0c4cbb7dd3..5b3894a07f 100644 --- a/src/qml/qml/qqmlvaluetypewrapper_p.h +++ b/src/qml/qml/qqmlvaluetypewrapper_p.h @@ -41,11 +41,12 @@ namespace Heap { DECLARE_HEAP_OBJECT(QQmlValueTypeWrapper, ReferenceObject) { DECLARE_MARKOBJECTS(QQmlValueTypeWrapper); - void init(const void *data, QQmlValueType *valueType, const QMetaObject *metaObject, - Object *object, int property, Flags flags) + void init( + const void *data, QMetaType metaType, const QMetaObject *metaObject, + Object *object, int property, Flags flags) { ReferenceObject::init(object, property, flags); - setValueType(valueType); + setMetaType(metaType); setMetaObject(metaObject); if (data) setData(data); @@ -55,10 +56,10 @@ DECLARE_HEAP_OBJECT(QQmlValueTypeWrapper, ReferenceObject) { void destroy(); - QQmlValueType *valueType() const + QMetaType metaType() const { - Q_ASSERT(m_valueType != nullptr); - return m_valueType; + Q_ASSERT(m_metaType != nullptr); + return QMetaType(m_metaType); } void setGadgetPtr(void *gadgetPtr) { m_gadgetPtr = gadgetPtr; } @@ -66,7 +67,19 @@ DECLARE_HEAP_OBJECT(QQmlValueTypeWrapper, ReferenceObject) { const QMetaObject *metaObject() const { return m_metaObject; } - void setData(const void *data); + void setData(const void *data) + { + const QMetaType type = metaType(); + void *gadget = gadgetPtr(); + if (gadget) { + type.destruct(gadget); + } else { + gadget = ::operator new(type.sizeOf()); + setGadgetPtr(gadget); + } + type.construct(gadget, data); + } + QVariant toVariant() const; void *storagePointer(); @@ -77,14 +90,14 @@ DECLARE_HEAP_OBJECT(QQmlValueTypeWrapper, ReferenceObject) { private: void setMetaObject(const QMetaObject *metaObject) { m_metaObject = metaObject; } - void setValueType(QQmlValueType *valueType) + void setMetaType(QMetaType metaType) { - Q_ASSERT(valueType != nullptr); - m_valueType = valueType; + Q_ASSERT(metaType.isValid()); + m_metaType = metaType.iface(); } void *m_gadgetPtr; - QQmlValueType *m_valueType; + const QtPrivate::QMetaTypeInterface *m_metaType; const QMetaObject *m_metaObject; }; @@ -107,12 +120,24 @@ public: ExecutionEngine *engine, const void *, const QMetaObject *metaObject, QMetaType type); QVariant toVariant() const; + + template<typename ValueType> + ValueType *cast() + { + if (QMetaType::fromType<ValueType>() != d()->metaType()) + return nullptr; + if (d()->isReference() && !readReferenceValue()) + return nullptr; + return static_cast<ValueType *>(d()->gadgetPtr()); + } + bool toGadget(void *data) const; bool isEqual(const QVariant& value) const; int typeId() const; QMetaType type() const; bool write(QObject *target, int propertyIndex) const; bool readReferenceValue() const { return d()->readReference(); } + const QMetaObject *metaObject() const { return d()->metaObject(); } QQmlPropertyData dataForPropertyKey(PropertyKey id) const; |