diff options
author | Stephen Kelly <stephen.kelly@kdab.com> | 2012-05-24 14:35:45 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-20 15:45:07 +0200 |
commit | 579ea489a40ae0240f22c3d31bde1fc2cd8aaf15 (patch) | |
tree | b2d2e0a950af75d8e230dbe41e4b0f3f31ae308e /src/corelib/kernel/qmetatype.h | |
parent | 668efc29fd85bbae2395a4eca8d0ad71ad6ee3d1 (diff) |
Record if a metatype is a smart pointer to a QObject derived.
This allows QVariant/QMetaType software (such as QtDeclarative) to
deal with smart pointers in a similar way to how they can deal with
naked pointers (accessing properties etc).
This also adds a requirement that T be fully defined when
QSharedPointer<T> is inserted into a QVariant.
Change-Id: I29e12b8a6aa5f4aadbd62f92b89bc238f64b5725
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@nokia.com>
Diffstat (limited to 'src/corelib/kernel/qmetatype.h')
-rw-r--r-- | src/corelib/kernel/qmetatype.h | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index da6d02cddf..1a57cac7f1 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -247,7 +247,10 @@ public: NeedsDestruction = 0x2, MovableType = 0x4, PointerToQObject = 0x8, - IsEnumeration = 0x10 + IsEnumeration = 0x10, + SharedPointerToQObject = 0x20, + WeakPointerToQObject = 0x40, + TrackingPointerToQObject = 0x80 }; Q_DECLARE_FLAGS(TypeFlags, TypeFlag) @@ -415,6 +418,9 @@ template <> inline void qMetaTypeLoadHelper<void>(QDataStream &, void *) {} class QObject; class QWidget; +template <class T> class QSharedPointer; +template <class T> class QWeakPointer; +template <class T> class QPointer; namespace QtPrivate { @@ -465,6 +471,40 @@ namespace QtPrivate { static inline const QMetaObject *value() { return &T::staticMetaObject; } }; + + template<typename T> + struct IsSharedPointerToTypeDerivedFromQObject + { + enum { Value = false }; + }; + + template<typename T> + struct IsSharedPointerToTypeDerivedFromQObject<QSharedPointer<T> > : IsPointerToTypeDerivedFromQObject<T*> + { + }; + + template<typename T> + struct IsWeakPointerToTypeDerivedFromQObject + { + enum { Value = false }; + }; + + template<typename T> + struct IsWeakPointerToTypeDerivedFromQObject<QWeakPointer<T> > : IsPointerToTypeDerivedFromQObject<T*> + { + }; + + template<typename T> + struct IsTrackingPointerToTypeDerivedFromQObject + { + enum { Value = false }; + }; + + template<typename T> + struct IsTrackingPointerToTypeDerivedFromQObject<QPointer<T> > + { + enum { Value = true }; + }; } template <typename T, bool = QtPrivate::IsPointerToTypeDerivedFromQObject<T>::Value> @@ -511,6 +551,9 @@ namespace QtPrivate { | (QTypeInfo<T>::isComplex ? QMetaType::NeedsConstruction : 0) | (QTypeInfo<T>::isComplex ? QMetaType::NeedsDestruction : 0) | (IsPointerToTypeDerivedFromQObject<T>::Value ? QMetaType::PointerToQObject : 0) + | (IsSharedPointerToTypeDerivedFromQObject<T>::Value ? QMetaType::SharedPointerToQObject : 0) + | (IsWeakPointerToTypeDerivedFromQObject<T>::Value ? QMetaType::WeakPointerToQObject : 0) + | (IsTrackingPointerToTypeDerivedFromQObject<T>::Value ? QMetaType::TrackingPointerToQObject : 0) | (Q_IS_ENUM(T) ? QMetaType::IsEnumeration : 0) }; }; @@ -677,9 +720,6 @@ template <class T> class QVector; 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; |