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 | |
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')
-rw-r--r-- | src/corelib/kernel/qmetatype.cpp | 9 | ||||
-rw-r--r-- | src/corelib/kernel/qvariant.cpp | 72 | ||||
-rw-r--r-- | src/corelib/kernel/qvariant.h | 71 |
3 files changed, 46 insertions, 106 deletions
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index 072b27b573..cf48e1fd78 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -2048,6 +2048,15 @@ bool QMetaType::convert(const void *from, int fromTypeId, void *to, int toTypeId if (toTypeId == qMetaTypeId<QAssociativeIterable>()) return convertToAssociativeIterable(from, fromTypeId, to); +#ifndef QT_BOOTSTRAPPED + // handle QObject conversion + if ((fromType.flags() & QMetaType::PointerToQObject) && (toType.flags() & QMetaType::PointerToQObject)) { + QObject *fromObject = *static_cast<QObject * const *>(from); + *static_cast<QObject **>(to) = fromObject ? fromObject->metaObject()->cast(fromObject) : nullptr; + return true; + } +#endif + return false; } diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index 6a046dffd3..e59f797f3e 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -1353,18 +1353,6 @@ QDataStream& operator<<(QDataStream &s, const QVariant::Type p) QMetaType::UnknownType; otherwise returns \c false. */ -template<typename T> -inline T qVariantToHelper(const QVariant::Private &d) -{ - QMetaType targetType = QMetaType::fromType<T>(); - if (d.type() == targetType) - return d.get<T>(); - - T ret; - QMetaType::convert(d.storage(), d.typeId(), &ret, targetType.id()); - return ret; -} - /*! \fn QStringList QVariant::toStringList() const @@ -1377,7 +1365,7 @@ inline T qVariantToHelper(const QVariant::Private &d) */ QStringList QVariant::toStringList() const { - return qVariantToHelper<QStringList>(d); + return qvariant_cast<QStringList>(*this); } /*! @@ -1397,7 +1385,7 @@ QStringList QVariant::toStringList() const */ QString QVariant::toString() const { - return qVariantToHelper<QString>(d); + return qvariant_cast<QString>(*this); } /*! @@ -1408,7 +1396,7 @@ QString QVariant::toString() const */ QVariantMap QVariant::toMap() const { - return qVariantToHelper<QVariantMap>(d); + return qvariant_cast<QVariantMap>(*this); } /*! @@ -1419,7 +1407,7 @@ QVariantMap QVariant::toMap() const */ QVariantHash QVariant::toHash() const { - return qVariantToHelper<QVariantHash>(d); + return qvariant_cast<QVariantHash>(*this); } /*! @@ -1436,7 +1424,7 @@ QVariantHash QVariant::toHash() const */ QDate QVariant::toDate() const { - return qVariantToHelper<QDate>(d); + return qvariant_cast<QDate>(*this); } /*! @@ -1453,7 +1441,7 @@ QDate QVariant::toDate() const */ QTime QVariant::toTime() const { - return qVariantToHelper<QTime>(d); + return qvariant_cast<QTime>(*this); } /*! @@ -1470,7 +1458,7 @@ QTime QVariant::toTime() const */ QDateTime QVariant::toDateTime() const { - return qVariantToHelper<QDateTime>(d); + return qvariant_cast<QDateTime>(*this); } /*! @@ -1485,7 +1473,7 @@ QDateTime QVariant::toDateTime() const #if QT_CONFIG(easingcurve) QEasingCurve QVariant::toEasingCurve() const { - return qVariantToHelper<QEasingCurve>(d); + return qvariant_cast<QEasingCurve>(*this); } #endif @@ -1500,7 +1488,7 @@ QEasingCurve QVariant::toEasingCurve() const */ QByteArray QVariant::toByteArray() const { - return qVariantToHelper<QByteArray>(d); + return qvariant_cast<QByteArray>(*this); } #ifndef QT_NO_GEOM_VARIANT @@ -1515,7 +1503,7 @@ QByteArray QVariant::toByteArray() const */ QPoint QVariant::toPoint() const { - return qVariantToHelper<QPoint>(d); + return qvariant_cast<QPoint>(*this); } /*! @@ -1528,7 +1516,7 @@ QPoint QVariant::toPoint() const */ QRect QVariant::toRect() const { - return qVariantToHelper<QRect>(d); + return qvariant_cast<QRect>(*this); } /*! @@ -1541,7 +1529,7 @@ QRect QVariant::toRect() const */ QSize QVariant::toSize() const { - return qVariantToHelper<QSize>(d); + return qvariant_cast<QSize>(*this); } /*! @@ -1554,7 +1542,7 @@ QSize QVariant::toSize() const */ QSizeF QVariant::toSizeF() const { - return qVariantToHelper<QSizeF>(d); + return qvariant_cast<QSizeF>(*this); } /*! @@ -1568,7 +1556,7 @@ QSizeF QVariant::toSizeF() const */ QRectF QVariant::toRectF() const { - return qVariantToHelper<QRectF>(d); + return qvariant_cast<QRectF>(*this); } /*! @@ -1581,7 +1569,7 @@ QRectF QVariant::toRectF() const */ QLineF QVariant::toLineF() const { - return qVariantToHelper<QLineF>(d); + return qvariant_cast<QLineF>(*this); } /*! @@ -1594,7 +1582,7 @@ QLineF QVariant::toLineF() const */ QLine QVariant::toLine() const { - return qVariantToHelper<QLine>(d); + return qvariant_cast<QLine>(*this); } /*! @@ -1608,7 +1596,7 @@ QLine QVariant::toLine() const */ QPointF QVariant::toPointF() const { - return qVariantToHelper<QPointF>(d); + return qvariant_cast<QPointF>(*this); } #endif // QT_NO_GEOM_VARIANT @@ -1624,7 +1612,7 @@ QPointF QVariant::toPointF() const */ QUrl QVariant::toUrl() const { - return qVariantToHelper<QUrl>(d); + return qvariant_cast<QUrl>(*this); } #endif @@ -1638,7 +1626,7 @@ QUrl QVariant::toUrl() const */ QLocale QVariant::toLocale() const { - return qVariantToHelper<QLocale>(d); + return qvariant_cast<QLocale>(*this); } #if QT_CONFIG(regularexpression) @@ -1653,7 +1641,7 @@ QLocale QVariant::toLocale() const */ QRegularExpression QVariant::toRegularExpression() const { - return qVariantToHelper<QRegularExpression>(d); + return qvariant_cast<QRegularExpression>(*this); } #endif // QT_CONFIG(regularexpression) @@ -1668,7 +1656,7 @@ QRegularExpression QVariant::toRegularExpression() const */ QModelIndex QVariant::toModelIndex() const { - return qVariantToHelper<QModelIndex>(d); + return qvariant_cast<QModelIndex>(*this); } /*! @@ -1681,7 +1669,7 @@ QModelIndex QVariant::toModelIndex() const */ QPersistentModelIndex QVariant::toPersistentModelIndex() const { - return qVariantToHelper<QPersistentModelIndex>(d); + return qvariant_cast<QPersistentModelIndex>(*this); } #endif // QT_CONFIG(itemmodel) @@ -1696,7 +1684,7 @@ QPersistentModelIndex QVariant::toPersistentModelIndex() const */ QUuid QVariant::toUuid() const { - return qVariantToHelper<QUuid>(d); + return qvariant_cast<QUuid>(*this); } #ifndef QT_BOOTSTRAPPED @@ -1710,7 +1698,7 @@ QUuid QVariant::toUuid() const */ QJsonValue QVariant::toJsonValue() const { - return qVariantToHelper<QJsonValue>(d); + return qvariant_cast<QJsonValue>(*this); } /*! @@ -1723,7 +1711,7 @@ QJsonValue QVariant::toJsonValue() const */ QJsonObject QVariant::toJsonObject() const { - return qVariantToHelper<QJsonObject>(d); + return qvariant_cast<QJsonObject>(*this); } /*! @@ -1736,7 +1724,7 @@ QJsonObject QVariant::toJsonObject() const */ QJsonArray QVariant::toJsonArray() const { - return qVariantToHelper<QJsonArray>(d); + return qvariant_cast<QJsonArray>(*this); } /*! @@ -1749,7 +1737,7 @@ QJsonArray QVariant::toJsonArray() const */ QJsonDocument QVariant::toJsonDocument() const { - return qVariantToHelper<QJsonDocument>(d); + return qvariant_cast<QJsonDocument>(*this); } #endif // QT_BOOTSTRAPPED @@ -1764,7 +1752,7 @@ QJsonDocument QVariant::toJsonDocument() const */ QChar QVariant::toChar() const { - return qVariantToHelper<QChar>(d); + return qvariant_cast<QChar>(*this); } /*! @@ -1775,7 +1763,7 @@ QChar QVariant::toChar() const */ QBitArray QVariant::toBitArray() const { - return qVariantToHelper<QBitArray>(d); + return qvariant_cast<QBitArray>(*this); } template <typename T> @@ -1959,7 +1947,7 @@ qreal QVariant::toReal(bool *ok) const */ QVariantList QVariant::toList() const { - return qVariantToHelper<QVariantList>(d); + return qvariant_cast<QVariantList>(*this); } /*! 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) |