diff options
author | Stephen Kelly <stephen.kelly@kdab.com> | 2012-03-19 13:03:41 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-03-20 16:03:57 +0100 |
commit | afa50b1478f8ecea30c4991ff753162e750fc7dc (patch) | |
tree | 0888abbc2e20c3837765f28e2a9cc111854e58ee /src | |
parent | 105a7fccc4154a76a75022f7233e6168c35338cc (diff) |
Add API and reserve space for storing the QMetaObject with the QMetaType.
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 <jedrzej.nowacki@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/kernel/qmetatype.cpp | 9 | ||||
-rw-r--r-- | src/corelib/kernel/qmetatype.h | 26 | ||||
-rw-r--r-- | 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<void>, qMetaTypeConstructHelper<void>, 0, TypeFlags()); + return registerType(typeName, deleter, creator, qMetaTypeDestructHelper<void>, qMetaTypeConstructHelper<void>, 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<QCustomTypeInfo> *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<T*>(0))) == sizeof(yes_type) }; }; + + template<typename T, bool = IsPointerToTypeDerivedFromQObject<T>::Value> + struct MetaObjectForType + { + static inline const QMetaObject *value() { return 0; } + }; + template<typename T> + struct MetaObjectForType<T*, /* isPointerToTypeDerivedFromQObject = */ true> + { + static inline const QMetaObject *value() { return &T::staticMetaObject; } + }; } template <typename T, bool = QtPrivate::IsPointerToTypeDerivedFromQObject<T>::Value> @@ -477,7 +492,8 @@ int qRegisterMetaType(const char *typeName qMetaTypeDestructHelper<T>, qMetaTypeConstructHelper<T>, sizeof(T), - flags); + flags, + QtPrivate::MetaObjectForType<T>::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; |