From e83c3a0d33b7d8ffd0735136fb5e8b8c73f5bcfd Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 8 Jun 2012 13:58:16 +0200 Subject: Add automatic metatype declaration for QPointer and QWeakPointer. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ic9a04fa68d0bb14ef07455a6559e59f4b887f38b Reviewed-by: Jędrzej Nowacki --- src/corelib/kernel/qmetatype.h | 60 ++++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 26 deletions(-) (limited to 'src') 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 - }; -}; -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(); - } +#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 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, -- cgit v1.2.3