diff options
author | Lars Knoll <lars.knoll@qt.io> | 2020-07-14 15:19:30 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2020-08-24 00:18:37 +0200 |
commit | 13c1e3f43441837b1f3b07088358eb658e0e3c3a (patch) | |
tree | df2450b7ab4818ffc1b5f9fe7fc7d4932715bcb0 /src/corelib/kernel/qvariant.h | |
parent | c7ce1bc05c1ec2f63dd2531f23a3e9f6fe866556 (diff) |
Cleanup qvariant_cast<>
Move the last functionality it had (casting between QObject
derived types) over to QMetaType. Now qvariant_cast<> is
nothing but a wrapper around QMetaType::convert().
Change-Id: Iab02b6b97c141d64052823646e18227d1eb403dd
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/kernel/qvariant.h')
-rw-r--r-- | src/corelib/kernel/qvariant.h | 71 |
1 files changed, 7 insertions, 64 deletions
diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h index 218b88cb4a..891243ffb1 100644 --- a/src/corelib/kernel/qvariant.h +++ b/src/corelib/kernel/qvariant.h @@ -94,39 +94,6 @@ class QVariantComparisonHelper; template<typename T> inline T qvariant_cast(const QVariant &); -namespace QtPrivate { - - template <typename Derived, typename Argument, typename ReturnType> - struct ObjectInvoker - { - static ReturnType invoke(Argument a) - { - return Derived::object(a); - } - }; - - template <typename Derived, typename Argument, typename ReturnType> - struct MetaTypeInvoker - { - static ReturnType invoke(Argument a) - { - return Derived::metaType(a); - } - }; - - template <typename Derived, typename T, typename Argument, typename ReturnType, bool = IsPointerToTypeDerivedFromQObject<T>::Value> - struct TreatAsQObjectBeforeMetaType : ObjectInvoker<Derived, Argument, ReturnType> - { - }; - - template <typename Derived, typename T, typename Argument, typename ReturnType> - struct TreatAsQObjectBeforeMetaType<Derived, T, Argument, ReturnType, false> : MetaTypeInvoker<Derived, Argument, ReturnType> - { - }; - - template<typename T> struct QVariantValueHelper; -} - class Q_CORE_EXPORT QVariant { public: @@ -518,7 +485,6 @@ protected: #endif template<typename T> friend inline T qvariant_cast(const QVariant &); - template<typename T> friend struct QtPrivate::QVariantValueHelper; protected: Private d; void create(int type, const void *copy); @@ -722,39 +688,16 @@ public: }; #ifndef QT_MOC -namespace QtPrivate { - template<typename T> - struct QVariantValueHelper : TreatAsQObjectBeforeMetaType<QVariantValueHelper<T>, T, const QVariant &, T> - { - static T metaType(const QVariant &v) - { - const int vid = qMetaTypeId<T>(); - if (vid == v.userType()) - return *reinterpret_cast<const T *>(v.constData()); - T t; - if (v.convert(vid, &t)) - return t; - return T(); - } -#ifndef QT_NO_QOBJECT - static T object(const QVariant &v) - { - return qobject_cast<T>(QMetaType::typeFlags(v.userType()) & QMetaType::PointerToQObject - ? v.d.get<QObject *>() - : QVariantValueHelper::metaType(v)); - } -#endif - }; - - template<typename T> - struct QVariantValueHelperInterface : QVariantValueHelper<T> - { - }; -} template<typename T> inline T qvariant_cast(const QVariant &v) { - return QtPrivate::QVariantValueHelperInterface<T>::invoke(v); + QMetaType targetType = QMetaType::fromType<T>(); + if (v.d.type() == targetType) + return v.d.get<T>(); + + T t{}; + QMetaType::convert(v.constData(), v.userType(), &t, qMetaTypeId<T>()); + return t; } template<> inline QVariant qvariant_cast<QVariant>(const QVariant &v) |