Add automatic metatype declaration for QPointer and QWeakPointer.

Change-Id: Ic9a04fa68d0bb14ef07455a6559e59f4b887f38b
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@nokia.com>
bb10
Stephen Kelly 2012-06-08 13:58:16 +02:00 committed by Qt by Nokia
parent aca3513dda
commit e83c3a0d33
2 changed files with 53 additions and 35 deletions

View File

@ -678,6 +678,8 @@ template <class T> class QQueue;
template <class T> class QStack;
template <class T> class QSet;
template <class T> class QSharedPointer;
template <class T> class QWeakPointer;
template <class T> class QPointer;
template <class T1, class T2> class QMap;
template <class T1, class T2> class QHash;
template <class T1, class T2> struct QPair;
@ -758,35 +760,41 @@ Q_DECLARE_METATYPE_TEMPLATE_2ARG(QHash)
Q_DECLARE_METATYPE_TEMPLATE_2ARG(QMap)
Q_DECLARE_METATYPE_TEMPLATE_2ARG(QPair)
template <typename T, bool = QtPrivate::IsPointerToTypeDerivedFromQObject<T*>::Value>
struct QMetaTypeIdSharedPointerQObjectStar
{
enum {
Defined = 0
};
#define Q_DECLARE_SMART_POINTER_METATYPE(SMART_POINTER) \
template <typename T, bool = QtPrivate::IsPointerToTypeDerivedFromQObject<T*>::Value> \
struct QMetaTypeId_ ## SMART_POINTER ## _QObjectStar \
{ \
enum { \
Defined = 0 \
}; \
};\
\
template <typename T> \
struct QMetaTypeId_ ## SMART_POINTER ## _QObjectStar<T, true> \
{ \
enum { \
Defined = 1 \
}; \
static int qt_metatype_id() \
{ \
static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
if (!metatype_id.load()) { \
metatype_id.storeRelease(qRegisterNormalizedMetaType< SMART_POINTER<T> >( #SMART_POINTER "<" + QByteArray(T::staticMetaObject.className()) + ">", \
reinterpret_cast< SMART_POINTER<T> *>(quintptr(-1)))); \
} \
return metatype_id.loadAcquire(); \
} \
}; \
\
template <typename T> \
struct QMetaTypeId< SMART_POINTER<T> > : public QMetaTypeId_ ## SMART_POINTER ## _QObjectStar<T> \
{ \
};
template <typename T>
struct QMetaTypeIdSharedPointerQObjectStar<T, /* IsPointerToTypeDerivedFromQObject */ true>
{
enum {
Defined = 1
};
static int qt_metatype_id()
{
static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0);
if (!metatype_id.load()) {
metatype_id.storeRelease(qRegisterNormalizedMetaType< QSharedPointer<T> >( QByteArray("QSharedPointer<") + T::staticMetaObject.className() + ">",
reinterpret_cast< QSharedPointer<T> *>(quintptr(-1))));
}
return metatype_id.loadAcquire();
}
};
template <typename T>
struct QMetaTypeId< QSharedPointer<T> > : public QMetaTypeIdSharedPointerQObjectStar<T>
{
};
Q_DECLARE_SMART_POINTER_METATYPE(QSharedPointer)
Q_DECLARE_SMART_POINTER_METATYPE(QWeakPointer)
Q_DECLARE_SMART_POINTER_METATYPE(QPointer)
inline QMetaType::QMetaType(const ExtensionFlag extensionFlags, const QMetaTypeInterface *info,
Creator creator,

View File

@ -1462,19 +1462,29 @@ void tst_QMetaType::automaticTemplateRegistration()
#endif // Q_COMPILER_VARIADIC_MACROS
#define TEST_QSHAREDPOINTER(FULLTYPE) \
#define TEST_SMARTPOINTER(SMARTPOINTER, ELEMENT_TYPE) \
{ \
FULLTYPE sp = FULLTYPE::create(); \
SMARTPOINTER < ELEMENT_TYPE > sp(new ELEMENT_TYPE); \
QVariant v = QVariant::fromValue(sp); \
QCOMPARE(v.typeName(), #FULLTYPE); \
QCOMPARE(v.typeName(), #SMARTPOINTER "<" #ELEMENT_TYPE ">"); \
}
TEST_QSHAREDPOINTER(QSharedPointer<QObject>)
TEST_QSHAREDPOINTER(QSharedPointer<QFile>)
TEST_QSHAREDPOINTER(QSharedPointer<QTemporaryFile>)
TEST_QSHAREDPOINTER(QSharedPointer<MyObject>)
TEST_SMARTPOINTER(QSharedPointer, QObject)
TEST_SMARTPOINTER(QSharedPointer, QFile)
TEST_SMARTPOINTER(QSharedPointer, QTemporaryFile)
TEST_SMARTPOINTER(QSharedPointer, MyObject)
#undef TEST_QSHAREDPOINTER
TEST_SMARTPOINTER(QWeakPointer, QObject)
TEST_SMARTPOINTER(QWeakPointer, QFile)
TEST_SMARTPOINTER(QWeakPointer, QTemporaryFile)
TEST_SMARTPOINTER(QWeakPointer, MyObject)
TEST_SMARTPOINTER(QPointer, QObject)
TEST_SMARTPOINTER(QPointer, QFile)
TEST_SMARTPOINTER(QPointer, QTemporaryFile)
TEST_SMARTPOINTER(QPointer, MyObject)
#undef TEST_SMARTPOINTER
}