From afa50b1478f8ecea30c4991ff753162e750fc7dc Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Mon, 19 Mar 2012 13:03:41 +0100 Subject: Add API and reserve space for storing the QMetaObject with the QMetaType. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In Qt 5.1, http://codereview.qt-project.org/#change,19113 can be rebased on top of this change in a compatible way. Change-Id: If7ac0481a3b2a874528de4ef6ea7535501a4ac71 Reviewed-by: Jędrzej Nowacki --- src/corelib/kernel/qmetatype.cpp | 9 ++++++--- src/corelib/kernel/qmetatype.h | 26 ++++++++++++++++++++++---- src/dbus/qdbusmetaobject.cpp | 3 ++- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index 8c2b5a8665..a735e6dc4c 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -460,7 +460,7 @@ static int qMetaTypeCustomType_unlocked(const char *typeName, int length) int QMetaType::registerType(const char *typeName, Deleter deleter, Creator creator) { - return registerType(typeName, deleter, creator, qMetaTypeDestructHelper, qMetaTypeConstructHelper, 0, TypeFlags()); + return registerType(typeName, deleter, creator, qMetaTypeDestructHelper, qMetaTypeConstructHelper, 0, TypeFlags(), 0); } /*! \internal @@ -475,7 +475,7 @@ int QMetaType::registerType(const char *typeName, Deleter deleter, Creator creator, Destructor destructor, Constructor constructor, - int size, TypeFlags flags) + int size, TypeFlags flags, const QMetaObject *metaObject) { QVector *ct = customTypes(); if (!ct || !typeName || !deleter || !creator || !destructor || !constructor) @@ -1675,7 +1675,8 @@ QMetaType QMetaType::typeInfo(const int type) , typeInfo.info.destructor , typeInfo.info.size , typeInfo.info.flags - , type) + , type + , 0) : QMetaType(UnknownType); } @@ -1708,6 +1709,7 @@ QMetaType::QMetaType(const QMetaType &other) , m_typeFlags(other.m_typeFlags) , m_extensionFlags(other.m_extensionFlags) , m_typeId(other.m_typeId) + , m_metaObject(other.m_metaObject) {} QMetaType &QMetaType::operator =(const QMetaType &other) @@ -1723,6 +1725,7 @@ QMetaType &QMetaType::operator =(const QMetaType &other) m_extensionFlags = other.m_extensionFlags; m_extension = other.m_extension; // space reserved for future use m_typeId = other.m_typeId; + m_metaObject = other.m_metaObject; return *this; } diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index aa73785dac..39d58913db 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -180,6 +180,7 @@ QT_BEGIN_NAMESPACE class QDataStream; class QMetaTypeInterface; +class QMetaObject; class Q_CORE_EXPORT QMetaType { enum ExtensionFlag { NoExtensionFlags, @@ -238,7 +239,8 @@ public: Destructor destructor, Constructor constructor, int size, - QMetaType::TypeFlags flags); + QMetaType::TypeFlags flags, + const QMetaObject *metaObject); static int registerTypedef(const char *typeName, int aliasId); static int type(const char *typeName); static const char *typeName(int type); @@ -282,7 +284,8 @@ private: Destructor destructor, uint sizeOf, uint theTypeFlags, - int typeId); + int typeId, + const QMetaObject *metaObject); QMetaType(const QMetaType &other); QMetaType &operator =(const QMetaType &); inline bool isExtended(const ExtensionFlag flag) const { return m_extensionFlags & flag; } @@ -308,6 +311,7 @@ private: uint m_typeFlags; uint m_extensionFlags; int m_typeId; + const QMetaObject *m_metaObject; // Placeholder for Qt 5.1 feature. }; #undef QT_DEFINE_METATYPE_ID @@ -409,6 +413,17 @@ namespace QtPrivate Q_STATIC_ASSERT_X(sizeof(T), "Type argument of Q_DECLARE_METATYPE(T*) must be fully defined"); enum { Value = sizeof(checkType(static_cast(0))) == sizeof(yes_type) }; }; + + template::Value> + struct MetaObjectForType + { + static inline const QMetaObject *value() { return 0; } + }; + template + struct MetaObjectForType + { + static inline const QMetaObject *value() { return &T::staticMetaObject; } + }; } template ::Value> @@ -477,7 +492,8 @@ int qRegisterMetaType(const char *typeName qMetaTypeDestructHelper, qMetaTypeConstructHelper, sizeof(T), - flags); + flags, + QtPrivate::MetaObjectForType::value()); } #ifndef QT_NO_DATASTREAM @@ -659,7 +675,8 @@ inline QMetaType::QMetaType(const ExtensionFlag extensionFlags, const QMetaTypeI Destructor destructor, uint size, uint theTypeFlags, - int typeId) + int typeId, + const QMetaObject *metaObject) : m_creator(creator) , m_deleter(deleter) , m_saveOp(saveOp) @@ -670,6 +687,7 @@ inline QMetaType::QMetaType(const ExtensionFlag extensionFlags, const QMetaTypeI , m_typeFlags(theTypeFlags) , m_extensionFlags(extensionFlags) , m_typeId(typeId) + , m_metaObject(metaObject) { if (Q_UNLIKELY(isExtended(CtorEx) || typeId == QMetaType::Void)) ctor(info); diff --git a/src/dbus/qdbusmetaobject.cpp b/src/dbus/qdbusmetaobject.cpp index ce8146f639..a6e5f96eca 100644 --- a/src/dbus/qdbusmetaobject.cpp +++ b/src/dbus/qdbusmetaobject.cpp @@ -189,7 +189,8 @@ QDBusMetaObjectGenerator::findType(const QByteArray &signature, QDBusRawTypeHandler::destruct, QDBusRawTypeHandler::construct, sizeof(void *), - QMetaType::MovableType); + QMetaType::MovableType, + 0); } result.name = typeName; -- cgit v1.2.3