diff options
Diffstat (limited to 'src/corelib/kernel/qmetatype.h')
-rw-r--r-- | src/corelib/kernel/qmetatype.h | 69 |
1 files changed, 40 insertions, 29 deletions
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index af38589903..1d8b9a8bdc 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com> ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -435,7 +436,8 @@ public: SharedPointerToQObject = 0x20, WeakPointerToQObject = 0x40, TrackingPointerToQObject = 0x80, - WasDeclaredAsMetaType = 0x100 + WasDeclaredAsMetaType = 0x100, + IsGadget = 0x200 }; Q_DECLARE_FLAGS(TypeFlags, TypeFlag) @@ -469,9 +471,19 @@ public: int size, QMetaType::TypeFlags flags, const QMetaObject *metaObject); + static int registerNormalizedType(const QT_PREPEND_NAMESPACE(QByteArray) &normalizedTypeName, Destructor destructor, + Constructor constructor, + int size, + QMetaType::TypeFlags flags, + const QMetaObject *metaObject); static int registerTypedef(const char *typeName, int aliasId); static int registerNormalizedTypedef(const QT_PREPEND_NAMESPACE(QByteArray) &normalizedTypeName, int aliasId); static int type(const char *typeName); +#ifndef Q_QDOC + static int type(const QT_PREPEND_NAMESPACE(QByteArray) &typeName); +#else + static int type(const QByteArray &typeName); +#endif static const char *typeName(int type); static int sizeOf(int type); static TypeFlags typeFlags(int type); @@ -661,8 +673,8 @@ public: static void unregisterConverterFunction(int from, int to); private: - Creator m_creator; - Deleter m_deleter; + Creator m_creator_unused; + Deleter m_deleter_unused; SaveOperator m_saveOp; LoadOperator m_loadOp; Constructor m_constructor; @@ -702,18 +714,6 @@ ConverterFunctor<From, To, UnaryFunction>::~ConverterFunctor() namespace QtMetaTypePrivate { template <typename T, bool Accepted = true> struct QMetaTypeFunctionHelper { - static void Delete(void *t) - { - delete static_cast<T*>(t); - } - - static void *Create(const void *t) - { - if (t) - return new T(*static_cast<const T*>(t)); - return new T(); - } - static void Destruct(void *t) { Q_UNUSED(t) // Silence MSVC that warns for POD types. @@ -741,8 +741,6 @@ struct QMetaTypeFunctionHelper { template <typename T> struct QMetaTypeFunctionHelper<T, /* Accepted */ false> { - static void Delete(void *) {} - static void *Create(const void *) { return 0; } static void Destruct(void *) {} static void *Construct(void *, const void *) { return 0; } #ifndef QT_NO_DATASTREAM @@ -1330,14 +1328,27 @@ namespace QtPrivate enum { Value = sizeof(checkType(static_cast<T*>(0))) == sizeof(yes_type) }; }; - template<typename T, bool = IsPointerToTypeDerivedFromQObject<T>::Value> + template<typename T> + struct IsGadgetHelper + { + template<typename X> static typename X::QtGadgetHelper *checkType(X*); + static char checkType(void*); + enum { Value = sizeof(checkType(static_cast<T*>(0))) == sizeof(void*) }; + }; + + template<typename T, typename Enable = void> struct MetaObjectForType { static inline const QMetaObject *value() { return 0; } }; template<typename T> - struct MetaObjectForType<T*, /* isPointerToTypeDerivedFromQObject = */ true> + struct MetaObjectForType<T*, typename QEnableIf<IsPointerToTypeDerivedFromQObject<T*>::Value>::Type> + { + static inline const QMetaObject *value() { return &T::staticMetaObject; } + }; + template<typename T> + struct MetaObjectForType<T, typename QEnableIf<IsGadgetHelper<T>::Value>::Type> { static inline const QMetaObject *value() { return &T::staticMetaObject; } }; @@ -1512,6 +1523,9 @@ struct QMetaTypeId2 template <typename T> struct QMetaTypeId2<const T&> : QMetaTypeId2<T> {}; +template <typename T> +struct QMetaTypeId2<T&> { enum {Defined = false }; }; + namespace QtPrivate { template <typename T, bool Defined = QMetaTypeId2<T>::Defined> struct QMetaTypeIdHelper { @@ -1545,6 +1559,7 @@ namespace QtPrivate { | (IsWeakPointerToTypeDerivedFromQObject<T>::Value ? QMetaType::WeakPointerToQObject : 0) | (IsTrackingPointerToTypeDerivedFromQObject<T>::Value ? QMetaType::TrackingPointerToQObject : 0) | (Q_IS_ENUM(T) ? QMetaType::IsEnumeration : 0) + | (IsGadgetHelper<T>::Value ? QMetaType::IsGadget : 0) }; }; @@ -1594,8 +1609,6 @@ int qRegisterNormalizedMetaType(const QT_PREPEND_NAMESPACE(QByteArray) &normaliz flags |= QMetaType::WasDeclaredAsMetaType; const int id = QMetaType::registerNormalizedType(normalizedTypeName, - QtMetaTypePrivate::QMetaTypeFunctionHelper<T>::Delete, - QtMetaTypePrivate::QMetaTypeFunctionHelper<T>::Create, QtMetaTypePrivate::QMetaTypeFunctionHelper<T>::Destruct, QtMetaTypePrivate::QMetaTypeFunctionHelper<T>::Construct, int(sizeof(T)), @@ -1964,8 +1977,8 @@ inline QMetaType::QMetaType(const ExtensionFlag extensionFlags, const QMetaTypeI uint theTypeFlags, int typeId, const QMetaObject *_metaObject) - : m_creator(creator) - , m_deleter(deleter) + : m_creator_unused(creator) + , m_deleter_unused(deleter) , m_saveOp(saveOp) , m_loadOp(loadOp) , m_constructor(constructor) @@ -1999,16 +2012,14 @@ inline bool QMetaType::isRegistered() const inline void *QMetaType::create(const void *copy) const { - if (Q_UNLIKELY(isExtended(CreateEx))) - return createExtended(copy); - return m_creator(copy); + // ### TODO Qt6 remove the extension + return createExtended(copy); } inline void QMetaType::destroy(void *data) const { - if (Q_UNLIKELY(isExtended(DestroyEx))) - return destroyExtended(data); - m_deleter(data); + // ### TODO Qt6 remove the extension + destroyExtended(data); } inline void *QMetaType::construct(void *where, const void *copy) const |