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>
bb10
Stephen Kelly 2012-03-19 13:03:41 +01:00 committed by Qt by Nokia
parent 105a7fccc4
commit afa50b1478
3 changed files with 30 additions and 8 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -189,7 +189,8 @@ QDBusMetaObjectGenerator::findType(const QByteArray &signature,
QDBusRawTypeHandler::destruct,
QDBusRawTypeHandler::construct,
sizeof(void *),
QMetaType::MovableType);
QMetaType::MovableType,
0);
}
result.name = typeName;