From 2ff15ff065ef5f189ba8727ec6424c0e79285864 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 5 Sep 2013 18:03:44 +0200 Subject: Fix the automatic declaration of smart pointer types. Before this patch, qRegisterMetaType >("QSharedPointer") without a metatype declaration fails to compile, whereas it works with Qt 5.1 (ie, before commit e9a69c3ba928bd88974563b386b000ad6583f969) Change-Id: I9408f711c9df810ff29b879b7696dab81c1160f1 Reviewed-by: Stephen Kelly --- src/corelib/kernel/qmetatype.h | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) (limited to 'src/corelib/kernel/qmetatype.h') diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 5ce3f26b53..80c1f21c0d 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -1789,16 +1789,32 @@ struct QMetaTypeId< DOUBLE_ARG_TEMPLATE > \ } \ }; +namespace QtPrivate { + +template +struct SharedPointerMetaTypeIdHelper +{ + enum { + Defined = 0 + }; + static int qt_metatype_id() + { + return -1; + } +}; + +} + #define Q_DECLARE_SMART_POINTER_METATYPE(SMART_POINTER) \ -template \ -struct QMetaTypeId< SMART_POINTER > \ +QT_BEGIN_NAMESPACE \ +namespace QtPrivate { \ +template \ +struct SharedPointerMetaTypeIdHelper, true> \ { \ enum { \ - Defined = QtPrivate::IsPointerToTypeDerivedFromQObject::Value \ + Defined = 1 \ }; \ - static \ - typename QtPrivate::QEnableIf::Value, int>::Type \ - qt_metatype_id() \ + static int qt_metatype_id() \ { \ static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \ if (const int id = metatype_id.loadAcquire()) \ @@ -1814,7 +1830,15 @@ struct QMetaTypeId< SMART_POINTER > \ metatype_id.storeRelease(newId); \ return newId; \ } \ +}; \ +} \ +template \ +struct QMetaTypeId< SMART_POINTER > \ + : QtPrivate::SharedPointerMetaTypeIdHelper< SMART_POINTER, \ + QtPrivate::IsPointerToTypeDerivedFromQObject::Value> \ +{ \ };\ +QT_END_NAMESPACE \ #define QT_FOR_EACH_AUTOMATIC_TEMPLATE_SMART_POINTER(F) \ F(QSharedPointer) \ @@ -1846,8 +1870,12 @@ Q_DECLARE_METATYPE_TEMPLATE_2ARG(std::map) #define Q_DECLARE_METATYPE_TEMPLATE_SMART_POINTER_ITER(TEMPLATENAME) \ Q_DECLARE_SMART_POINTER_METATYPE(TEMPLATENAME) +QT_END_NAMESPACE + QT_FOR_EACH_AUTOMATIC_TEMPLATE_SMART_POINTER(Q_DECLARE_METATYPE_TEMPLATE_SMART_POINTER_ITER) +QT_BEGIN_NAMESPACE + #undef Q_DECLARE_METATYPE_TEMPLATE_SMART_POINTER_ITER inline QMetaType::QMetaType(const ExtensionFlag extensionFlags, const QMetaTypeInterface *info, -- cgit v1.2.3