diff options
author | Jędrzej Nowacki <jedrzej.nowacki@nokia.com> | 2011-11-01 12:58:42 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-11-17 14:48:20 +0100 |
commit | e70457fc4f60a17358e280f9b222f36bcd4f591f (patch) | |
tree | 20387dd74ace7d66624853354a4a717a99e5bb16 /src/corelib | |
parent | 7c670aa88bffa79fd43664cc8a9a2393001cb1d7 (diff) |
Reimplement some QMetaType methods.
Methods of QMetaType; sizeOf, construct and destruct were reimplement
using QMetaTypeSwitcher. The change should have impact only on
maintenance (by removing 3 type switches).
Change-Id: Iac3eb52de75d46f12ac32f229a26aec5b5bc7af2
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/kernel/qmetatype.cpp | 574 |
1 files changed, 205 insertions, 369 deletions
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index 07bc32b7be..ebb4548934 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -40,6 +40,7 @@ ****************************************************************************/ #include "qmetatype.h" +#include "qmetatype_p.h" #include "qobjectdefs.h" #include "qdatetime.h" #include "qbytearray.h" @@ -50,6 +51,7 @@ #include "qlocale.h" #include "qeasingcurve.h" #include "qvariant.h" +#include "qmetatypeswitcher_p.h" #ifdef QT_BOOTSTRAPPED # ifndef QT_NO_GEOM_VARIANT @@ -72,6 +74,46 @@ QT_BEGIN_NAMESPACE #define NS(x) QT_PREPEND_NAMESPACE(x) + +namespace { +template<typename T> +struct TypeDefiniton { + static const bool IsAvailable = true; +}; + +struct DefinedTypesFilter { + template<typename T> + struct Acceptor { + static const bool IsAccepted = TypeDefiniton<T>::IsAvailable && QTypeModuleInfo<T>::IsCore; + }; +}; + +// Ignore these types, as incomplete +#ifdef QT_NO_GEOM_VARIANT +template<> struct TypeDefiniton<QRect> { static const bool IsAvailable = false; }; +template<> struct TypeDefiniton<QRectF> { static const bool IsAvailable = false; }; +template<> struct TypeDefiniton<QSize> { static const bool IsAvailable = false; }; +template<> struct TypeDefiniton<QSizeF> { static const bool IsAvailable = false; }; +template<> struct TypeDefiniton<QLine> { static const bool IsAvailable = false; }; +template<> struct TypeDefiniton<QLineF> { static const bool IsAvailable = false; }; +template<> struct TypeDefiniton<QPoint> { static const bool IsAvailable = false; }; +template<> struct TypeDefiniton<QPointF> { static const bool IsAvailable = false; }; +#endif +#ifdef QT_BOOTSTRAPPED +template<> struct TypeDefiniton<QVariantMap> { static const bool IsAvailable = false; }; +template<> struct TypeDefiniton<QVariantHash> { static const bool IsAvailable = false; }; +template<> struct TypeDefiniton<QVariantList> { static const bool IsAvailable = false; }; +template<> struct TypeDefiniton<QVariant> { static const bool IsAvailable = false; }; +template<> struct TypeDefiniton<QBitArray> { static const bool IsAvailable = false; }; +template<> struct TypeDefiniton<QUrl> { static const bool IsAvailable = false; }; +template<> struct TypeDefiniton<QEasingCurve> { static const bool IsAvailable = false; }; +#endif +#ifdef QT_NO_REGEXP +template<> struct TypeDefiniton<QRegExp> { static const bool IsAvailable = false; }; +#endif +} // namespace + + /*! \macro Q_DECLARE_METATYPE(Type) \relates QMetaType @@ -1372,6 +1414,62 @@ void QMetaType::destroy(int type, void *data) } } +namespace { +template<class Filter> +class TypeConstructor { + template<typename T, bool IsAcceptedType = Filter::template Acceptor<T>::IsAccepted> + struct ConstructorImpl { + static void *Construct(const int /*type*/, void *where, const T *copy) { return qMetaTypeConstructHelper(where, copy); } + }; + template<typename T> + struct ConstructorImpl<T, /* IsAcceptedType = */ false> { + static void *Construct(const int type, void *where, const T *copy) + { + QMetaType::Constructor ctor = 0; + if (type >= QMetaType::FirstGuiType && type <= QMetaType::LastGuiType) { + Q_ASSERT(qMetaTypeGuiHelper); + if (!qMetaTypeGuiHelper) + return 0; + ctor = qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].constructor; + } else if (type >= QMetaType::FirstWidgetsType && type <= QMetaType::LastWidgetsType) { + Q_ASSERT(qMetaTypeWidgetsHelper); + if (!qMetaTypeWidgetsHelper) + return 0; + ctor = qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].constructor; + } else + return customTypeConstructor(type, where, copy); + + return ctor(where, copy); + } + }; +public: + TypeConstructor(const int type, void *where) + : m_type(type) + , m_where(where) + {} + + template<typename T> + void *delegate(const T *copy) { return ConstructorImpl<T>::Construct(m_type, m_where, copy); } + void *delegate(const void *) { return m_where; } + void *delegate(const QMetaTypeSwitcher::UnknownType *copy) { return customTypeConstructor(m_type, m_where, copy); } + +private: + static void *customTypeConstructor(const int type, void *where, const void *copy) + { + QMetaType::Constructor ctor = 0; + const QVector<QCustomTypeInfo> * const ct = customTypes(); + QReadLocker locker(customTypesLock()); + if (type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User) + return 0; + ctor = ct->at(type - QMetaType::User).constructor; + return ctor ? ctor(where, copy) : 0; + } + + const int m_type; + void *m_where; +}; +} // namespace + /*! \since 5.0 @@ -1402,126 +1500,65 @@ void *QMetaType::construct(int type, void *where, const void *copy) { if (!where) return 0; - switch (type) { - case QMetaType::VoidStar: - case QMetaType::QObjectStar: - case QMetaType::QWidgetStar: - return qMetaTypeConstructHelper<void*>(where, static_cast<void* const *>(copy)); - case QMetaType::Long: - return qMetaTypeConstructHelper<long>(where, static_cast<const long *>(copy)); - case QMetaType::Int: - return qMetaTypeConstructHelper<int>(where, static_cast<const int *>(copy)); - case QMetaType::Short: - return qMetaTypeConstructHelper<short>(where, static_cast<const short *>(copy)); - case QMetaType::Char: - return qMetaTypeConstructHelper<char>(where, static_cast<const char *>(copy)); - case QMetaType::ULong: - return qMetaTypeConstructHelper<ulong>(where, static_cast<const ulong *>(copy)); - case QMetaType::UInt: - return qMetaTypeConstructHelper<uint>(where, static_cast<const uint *>(copy)); - case QMetaType::LongLong: - return qMetaTypeConstructHelper<qlonglong>(where, static_cast<const qlonglong *>(copy)); - case QMetaType::ULongLong: - return qMetaTypeConstructHelper<qulonglong>(where, static_cast<const qulonglong *>(copy)); - case QMetaType::UShort: - return qMetaTypeConstructHelper<ushort>(where, static_cast<const ushort *>(copy)); - case QMetaType::UChar: - return qMetaTypeConstructHelper<uchar>(where, static_cast<const uchar *>(copy)); - case QMetaType::Bool: - return qMetaTypeConstructHelper<bool>(where, static_cast<const bool *>(copy)); - case QMetaType::Float: - return qMetaTypeConstructHelper<float>(where, static_cast<const float *>(copy)); - case QMetaType::Double: - return qMetaTypeConstructHelper<double>(where, static_cast<const double *>(copy)); - case QMetaType::QChar: - return qMetaTypeConstructHelper<NS(QChar)>(where, static_cast<const NS(QChar) *>(copy)); -#ifndef QT_BOOTSTRAPPED - case QMetaType::QVariantMap: - return qMetaTypeConstructHelper<NS(QVariantMap)>(where, static_cast<const NS(QVariantMap) *>(copy)); - case QMetaType::QVariantHash: - return qMetaTypeConstructHelper<NS(QVariantHash)>(where, static_cast<const NS(QVariantHash) *>(copy)); - case QMetaType::QVariantList: - return qMetaTypeConstructHelper<NS(QVariantList)>(where, static_cast<const NS(QVariantList) *>(copy)); - case QMetaType::QVariant: - return qMetaTypeConstructHelper<NS(QVariant)>(where, static_cast<const NS(QVariant) *>(copy)); -#endif - case QMetaType::QByteArray: - return qMetaTypeConstructHelper<NS(QByteArray)>(where, static_cast<const NS(QByteArray) *>(copy)); - case QMetaType::QString: - return qMetaTypeConstructHelper<NS(QString)>(where, static_cast<const NS(QString) *>(copy)); - case QMetaType::QStringList: - return qMetaTypeConstructHelper<NS(QStringList)>(where, static_cast<const NS(QStringList) *>(copy)); -#ifndef QT_BOOTSTRAPPED - case QMetaType::QBitArray: - return qMetaTypeConstructHelper<NS(QBitArray)>(where, static_cast<const NS(QBitArray) *>(copy)); -#endif - case QMetaType::QDate: - return qMetaTypeConstructHelper<NS(QDate)>(where, static_cast<const NS(QDate) *>(copy)); - case QMetaType::QTime: - return qMetaTypeConstructHelper<NS(QTime)>(where, static_cast<const NS(QTime) *>(copy)); - case QMetaType::QDateTime: - return qMetaTypeConstructHelper<NS(QDateTime)>(where, static_cast<const NS(QDateTime) *>(copy)); -#ifndef QT_BOOTSTRAPPED - case QMetaType::QUrl: - return qMetaTypeConstructHelper<NS(QUrl)>(where, static_cast<const NS(QUrl) *>(copy)); -#endif - case QMetaType::QLocale: - return qMetaTypeConstructHelper<NS(QLocale)>(where, static_cast<const NS(QLocale) *>(copy)); -#ifndef QT_NO_GEOM_VARIANT - case QMetaType::QRect: - return qMetaTypeConstructHelper<NS(QRect)>(where, static_cast<const NS(QRect) *>(copy)); - case QMetaType::QRectF: - return qMetaTypeConstructHelper<NS(QRectF)>(where, static_cast<const NS(QRectF) *>(copy)); - case QMetaType::QSize: - return qMetaTypeConstructHelper<NS(QSize)>(where, static_cast<const NS(QSize) *>(copy)); - case QMetaType::QSizeF: - return qMetaTypeConstructHelper<NS(QSizeF)>(where, static_cast<const NS(QSizeF) *>(copy)); - case QMetaType::QLine: - return qMetaTypeConstructHelper<NS(QLine)>(where, static_cast<const NS(QLine) *>(copy)); - case QMetaType::QLineF: - return qMetaTypeConstructHelper<NS(QLineF)>(where, static_cast<const NS(QLineF) *>(copy)); - case QMetaType::QPoint: - return qMetaTypeConstructHelper<NS(QPoint)>(where, static_cast<const NS(QPoint) *>(copy)); - case QMetaType::QPointF: - return qMetaTypeConstructHelper<NS(QPointF)>(where, static_cast<const NS(QPointF) *>(copy)); -#endif -#ifndef QT_NO_REGEXP - case QMetaType::QRegExp: - return qMetaTypeConstructHelper<NS(QRegExp)>(where, static_cast<const NS(QRegExp) *>(copy)); -#endif -#ifndef QT_BOOTSTRAPPED - case QMetaType::QEasingCurve: - return qMetaTypeConstructHelper<NS(QEasingCurve)>(where, static_cast<const NS(QEasingCurve) *>(copy)); -#endif - case QMetaType::Void: - return where; - default: - ; - } + TypeConstructor<DefinedTypesFilter> constructor(type, where); + return QMetaTypeSwitcher::switcher<void*>(constructor, type, copy); +} - Constructor ctor = 0; - if (type >= FirstGuiType && type <= LastGuiType) { - Q_ASSERT(qMetaTypeGuiHelper); - if (!qMetaTypeGuiHelper) - return 0; - ctor = qMetaTypeGuiHelper[type - FirstGuiType].constructor; - } else if (type >= FirstWidgetsType && type <= LastWidgetsType) { - Q_ASSERT(qMetaTypeWidgetsHelper); - if (!qMetaTypeWidgetsHelper) - return 0; - ctor = qMetaTypeWidgetsHelper[type - FirstWidgetsType].constructor; - } else { + +namespace { +template<class Filter> +class TypeDestructor { + template<typename T, bool IsAcceptedType = Filter::template Acceptor<T>::IsAccepted> + struct DestructorImpl { + static void Destruct(const int /* type */, T *where) { qMetaTypeDestructHelper(where); } + }; + template<typename T> + struct DestructorImpl<T, /* IsAcceptedType = */ false> { + static void Destruct(const int type, void *where) + { + QMetaType::Destructor dtor = 0; + if (type >= QMetaType::FirstGuiType && type <= QMetaType::LastGuiType) { + Q_ASSERT(qMetaTypeGuiHelper); + if (!qMetaTypeGuiHelper) + return; + dtor = qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].destructor; + } else if (type >= QMetaType::FirstWidgetsType && type <= QMetaType::LastWidgetsType) { + Q_ASSERT(qMetaTypeWidgetsHelper); + if (!qMetaTypeWidgetsHelper) + return; + dtor = qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].destructor; + } else + customTypeDestructor(type, where); + dtor(where); + } + }; +public: + TypeDestructor(const int type) + : m_type(type) + {} + + template<typename T> + void delegate(const T *where) { DestructorImpl<T>::Destruct(m_type, const_cast<T*>(where)); } + void delegate(const void *) {} + void delegate(const QMetaTypeSwitcher::UnknownType *where) { customTypeDestructor(m_type, (void*)where); } + +private: + static void customTypeDestructor(const int type, void *where) + { + QMetaType::Destructor dtor = 0; const QVector<QCustomTypeInfo> * const ct = customTypes(); QReadLocker locker(customTypesLock()); - if (type < User || !ct || ct->count() <= type - User) - return 0; - ctor = ct->at(type - User).constructor; - if (!ctor) - return 0; + if (type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User) + return; + dtor = ct->at(type - QMetaType::User).destructor; + if (!dtor) + return; + dtor(where); } - return ctor(where, copy); -} + const int m_type; +}; +} // namespace /*! \since 5.0 @@ -1537,148 +1574,59 @@ void QMetaType::destruct(int type, void *where) { if (!where) return; - switch (type) { - case QMetaType::VoidStar: - case QMetaType::QObjectStar: - case QMetaType::QWidgetStar: - break; - case QMetaType::Long: - break; - case QMetaType::Int: - break; - case QMetaType::Short: - break; - case QMetaType::Char: - break; - case QMetaType::ULong: - break; - case QMetaType::LongLong: - break; - case QMetaType::ULongLong: - break; - case QMetaType::UInt: - break; - case QMetaType::UShort: - break; - case QMetaType::UChar: - break; - case QMetaType::Bool: - break; - case QMetaType::Float: - break; - case QMetaType::Double: - break; - case QMetaType::QChar: - static_cast< NS(QChar)* >(where)->NS(QChar)::~QChar(); - break; -#ifndef QT_BOOTSTRAPPED - case QMetaType::QVariantMap: - static_cast< NS(QVariantMap)* >(where)->NS(QVariantMap)::~QMap<class QString, class QVariant>(); - break; - case QMetaType::QVariantHash: - static_cast< NS(QVariantHash)* >(where)->NS(QVariantHash)::~QHash<class QString, class QVariant>(); - break; - case QMetaType::QVariantList: { - static_cast< NS(QVariantList)* >(where)->NS(QVariantList)::~QList<class QVariant>(); - break; } - case QMetaType::QVariant: - static_cast< NS(QVariant)* >(where)->NS(QVariant)::~QVariant(); - break; -#endif - case QMetaType::QByteArray: - static_cast< NS(QByteArray)* >(where)->NS(QByteArray)::~QByteArray(); - break; - case QMetaType::QString: - static_cast< NS(QString)* >(where)->NS(QString)::~QString(); - break; - case QMetaType::QStringList: - static_cast< NS(QStringList)* >(where)->NS(QStringList)::~QStringList(); - break; -#ifndef QT_BOOTSTRAPPED - case QMetaType::QBitArray: - static_cast< NS(QBitArray)* >(where)->NS(QBitArray)::~QBitArray(); - break; -#endif - case QMetaType::QDate: - static_cast< NS(QDate)* >(where)->NS(QDate)::~QDate(); - break; - case QMetaType::QTime: - static_cast< NS(QTime)* >(where)->NS(QTime)::~QTime(); - break; - case QMetaType::QDateTime: - static_cast< NS(QDateTime)* >(where)->NS(QDateTime)::~QDateTime(); - break; -#ifndef QT_BOOTSTRAPPED - case QMetaType::QUrl: - static_cast< NS(QUrl)* >(where)->NS(QUrl)::~QUrl(); -#endif - break; - case QMetaType::QLocale: - static_cast< NS(QLocale)* >(where)->NS(QLocale)::~QLocale(); - break; -#ifndef QT_NO_GEOM_VARIANT - case QMetaType::QRect: - static_cast< NS(QRect)* >(where)->NS(QRect)::~QRect(); - break; - case QMetaType::QRectF: - static_cast< NS(QRectF)* >(where)->NS(QRectF)::~QRectF(); - break; - case QMetaType::QSize: - static_cast< NS(QSize)* >(where)->NS(QSize)::~QSize(); - break; - case QMetaType::QSizeF: - static_cast< NS(QSizeF)* >(where)->NS(QSizeF)::~QSizeF(); - break; - case QMetaType::QLine: - static_cast< NS(QLine)* >(where)->NS(QLine)::~QLine(); - break; - case QMetaType::QLineF: - static_cast< NS(QLineF)* >(where)->NS(QLineF)::~QLineF(); - break; - case QMetaType::QPoint: - static_cast< NS(QPoint)* >(where)->NS(QPoint)::~QPoint(); - break; - case QMetaType::QPointF: - static_cast< NS(QPointF)* >(where)->NS(QPointF)::~QPointF(); - break; -#endif -#ifndef QT_NO_REGEXP - case QMetaType::QRegExp: - static_cast< NS(QRegExp)* >(where)->NS(QRegExp)::~QRegExp(); - break; -#endif -#ifndef QT_BOOTSTRAPPED - case QMetaType::QEasingCurve: - static_cast< NS(QEasingCurve)* >(where)->NS(QEasingCurve)::~QEasingCurve(); - break; -#endif - case QMetaType::Void: - break; - default: { - const QVector<QCustomTypeInfo> * const ct = customTypes(); - Destructor dtor = 0; - if (type >= FirstGuiType && type <= LastGuiType) { - Q_ASSERT(qMetaTypeGuiHelper); - if (!qMetaTypeGuiHelper) - return; - dtor = qMetaTypeGuiHelper[type - FirstGuiType].destructor; - } else if (type >= FirstWidgetsType && type <= LastWidgetsType) { - Q_ASSERT(qMetaTypeWidgetsHelper); - if (!qMetaTypeWidgetsHelper) - return; - dtor = qMetaTypeWidgetsHelper[type - FirstWidgetsType].destructor; - } else { - QReadLocker locker(customTypesLock()); - if (type < User || !ct || ct->count() <= type - User) - break; - dtor = ct->at(type - User).destructor; - if (!dtor) - break; + TypeDestructor<DefinedTypesFilter> destructor(type); + QMetaTypeSwitcher::switcher<void>(destructor, type, where); +} + + +namespace { +template<class Filter> +class SizeOf { + template<typename T, bool IsAcceptedType = Filter::template Acceptor<T>::IsAccepted> + struct SizeOfImpl { + static int Size(const int) { return sizeof(T); } + }; + template<typename T> + struct SizeOfImpl<T, /* IsAcceptedType = */ false> { + static int Size(const int type) + { + if (type >= QMetaType::FirstGuiType && type <= QMetaType::LastGuiType) { + Q_ASSERT(qMetaTypeGuiHelper); + if (!qMetaTypeGuiHelper) + return 0; + return qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].size; + } else if (type >= QMetaType::FirstWidgetsType && type <= QMetaType::LastWidgetsType) { + Q_ASSERT(qMetaTypeWidgetsHelper); + if (!qMetaTypeWidgetsHelper) + return 0; + return qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].size; + } + return customTypeSizeOf(type); } - dtor(where); - break; } + }; + +public: + SizeOf(int type) + : m_type(type) + {} + + template<typename T> + int delegate(const T*) { return SizeOfImpl<T>::Size(m_type); } + int delegate(const void*) { return 0; } + int delegate(const QMetaTypeSwitcher::UnknownType*) { return customTypeSizeOf(m_type); } +private: + static int customTypeSizeOf(const int type) + { + const QVector<QCustomTypeInfo> * const ct = customTypes(); + QReadLocker locker(customTypesLock()); + if (type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User) + return 0; + return ct->at(type - QMetaType::User).size; } -} + + const int m_type; +}; +} // namespace /*! \since 5.0 @@ -1693,120 +1641,8 @@ void QMetaType::destruct(int type, void *where) */ int QMetaType::sizeOf(int type) { - switch (type) { - case QMetaType::VoidStar: - case QMetaType::QObjectStar: - case QMetaType::QWidgetStar: - return sizeof(void *); - case QMetaType::Long: - return sizeof(long); - case QMetaType::Int: - return sizeof(int); - case QMetaType::Short: - return sizeof(short); - case QMetaType::Char: - return sizeof(char); - case QMetaType::ULong: - return sizeof(ulong); - case QMetaType::UInt: - return sizeof(uint); - case QMetaType::LongLong: - return sizeof(qlonglong); - case QMetaType::ULongLong: - return sizeof(qulonglong); - case QMetaType::UShort: - return sizeof(ushort); - case QMetaType::UChar: - return sizeof(uchar); - case QMetaType::Bool: - return sizeof(bool); - case QMetaType::Float: - return sizeof(float); - case QMetaType::Double: - return sizeof(double); - case QMetaType::QChar: - return sizeof(NS(QChar)); -#ifndef QT_BOOTSTRAPPED - case QMetaType::QVariantMap: - return sizeof(NS(QVariantMap)); - case QMetaType::QVariantHash: - return sizeof(NS(QVariantHash)); - case QMetaType::QVariantList: - return sizeof(NS(QVariantList)); - case QMetaType::QVariant: - return sizeof(NS(QVariant)); -#endif - case QMetaType::QByteArray: - return sizeof(NS(QByteArray)); - case QMetaType::QString: - return sizeof(NS(QString)); - case QMetaType::QStringList: - return sizeof(NS(QStringList)); -#ifndef QT_BOOTSTRAPPED - case QMetaType::QBitArray: - return sizeof(NS(QBitArray)); -#endif - case QMetaType::QDate: - return sizeof(NS(QDate)); - case QMetaType::QTime: - return sizeof(NS(QTime)); - case QMetaType::QDateTime: - return sizeof(NS(QDateTime)); -#ifndef QT_BOOTSTRAPPED - case QMetaType::QUrl: - return sizeof(NS(QUrl)); -#endif - case QMetaType::QLocale: - return sizeof(NS(QLocale)); -#ifndef QT_NO_GEOM_VARIANT - case QMetaType::QRect: - return sizeof(NS(QRect)); - case QMetaType::QRectF: - return sizeof(NS(QRectF)); - case QMetaType::QSize: - return sizeof(NS(QSize)); - case QMetaType::QSizeF: - return sizeof(NS(QSizeF)); - case QMetaType::QLine: - return sizeof(NS(QLine)); - case QMetaType::QLineF: - return sizeof(NS(QLineF)); - case QMetaType::QPoint: - return sizeof(NS(QPoint)); - case QMetaType::QPointF: - return sizeof(NS(QPointF)); -#endif -#ifndef QT_NO_REGEXP - case QMetaType::QRegExp: - return sizeof(NS(QRegExp)); -#endif -#ifndef QT_BOOTSTRAPPED - case QMetaType::QEasingCurve: - return sizeof(NS(QEasingCurve)); -#endif - case QMetaType::Void: - return 0; - default: - ; - } - - if (type >= FirstGuiType && type <= LastGuiType) { - Q_ASSERT(qMetaTypeGuiHelper); - if (!qMetaTypeGuiHelper) - return 0; - return qMetaTypeGuiHelper[type - FirstGuiType].size; - } else if (type >= FirstWidgetsType && type <= LastWidgetsType) { - Q_ASSERT(qMetaTypeWidgetsHelper); - if (!qMetaTypeWidgetsHelper) - return 0; - return qMetaTypeWidgetsHelper[type - FirstWidgetsType].size; - } - - const QVector<QCustomTypeInfo> * const ct = customTypes(); - QReadLocker locker(customTypesLock()); - if (type < User || !ct || ct->count() <= type - User) - return 0; - return ct->at(type - User).size; + SizeOf<DefinedTypesFilter> sizeOf(type); + return QMetaTypeSwitcher::switcher<int>(sizeOf, type, 0); } /*! |