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
parent
105a7fccc4
commit
afa50b1478
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -189,7 +189,8 @@ QDBusMetaObjectGenerator::findType(const QByteArray &signature,
|
|||
QDBusRawTypeHandler::destruct,
|
||||
QDBusRawTypeHandler::construct,
|
||||
sizeof(void *),
|
||||
QMetaType::MovableType);
|
||||
QMetaType::MovableType,
|
||||
0);
|
||||
}
|
||||
|
||||
result.name = typeName;
|
||||
|
|
|
|||
Loading…
Reference in New Issue