Add automatic metatype declaration for QPointer and QWeakPointer.
Change-Id: Ic9a04fa68d0bb14ef07455a6559e59f4b887f38b Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@nokia.com>bb10
parent
aca3513dda
commit
e83c3a0d33
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue