diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index a7b2e78124..da6d02cddf 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -678,6 +678,8 @@ template class QQueue; template class QStack; template class QSet; template class QSharedPointer; +template class QWeakPointer; +template class QPointer; template class QMap; template class QHash; template 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 ::Value> -struct QMetaTypeIdSharedPointerQObjectStar -{ - enum { - Defined = 0 - }; + +#define Q_DECLARE_SMART_POINTER_METATYPE(SMART_POINTER) \ +template ::Value> \ +struct QMetaTypeId_ ## SMART_POINTER ## _QObjectStar \ +{ \ + enum { \ + Defined = 0 \ + }; \ +};\ + \ +template \ +struct QMetaTypeId_ ## SMART_POINTER ## _QObjectStar \ +{ \ + 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 >( #SMART_POINTER "<" + QByteArray(T::staticMetaObject.className()) + ">", \ + reinterpret_cast< SMART_POINTER *>(quintptr(-1)))); \ + } \ + return metatype_id.loadAcquire(); \ + } \ +}; \ +\ +template \ +struct QMetaTypeId< SMART_POINTER > : public QMetaTypeId_ ## SMART_POINTER ## _QObjectStar \ +{ \ }; -template -struct QMetaTypeIdSharedPointerQObjectStar -{ - 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 >( QByteArray("QSharedPointer<") + T::staticMetaObject.className() + ">", - reinterpret_cast< QSharedPointer *>(quintptr(-1)))); - } - return metatype_id.loadAcquire(); - } -}; - -template -struct QMetaTypeId< QSharedPointer > : public QMetaTypeIdSharedPointerQObjectStar -{ -}; +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, diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index e1b58e6c4b..861cedf416 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -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) - TEST_QSHAREDPOINTER(QSharedPointer) - TEST_QSHAREDPOINTER(QSharedPointer) - TEST_QSHAREDPOINTER(QSharedPointer) + 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 }