summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qmetatype.h
diff options
context:
space:
mode:
authorStephen Kelly <stephen.kelly@kdab.com>2012-05-24 14:35:45 +0200
committerQt by Nokia <qt-info@nokia.com>2012-06-20 15:45:07 +0200
commit579ea489a40ae0240f22c3d31bde1fc2cd8aaf15 (patch)
treeb2d2e0a950af75d8e230dbe41e4b0f3f31ae308e /src/corelib/kernel/qmetatype.h
parent668efc29fd85bbae2395a4eca8d0ad71ad6ee3d1 (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.h48
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;