diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2020-09-16 13:06:57 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-09-16 14:56:01 +0200 |
commit | c430fc856964b8d07cd5bebe874095c7e3a0fc54 (patch) | |
tree | 633d95973379998530114ae2129d853e54ab7699 /src/qml/qml | |
parent | ae9bef00159fa3362309ccf3a9999f75bd45e81e (diff) |
QQmlValueTypeProvider: Use QMetaType
We can create, compare, convert registered types without going through
special virtual value type providers.
Change-Id: I0431256540b8dd6861ff3a945570ea7df45ed98d
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/qml/qml')
-rw-r--r-- | src/qml/qml/qqmlglobal.cpp | 52 | ||||
-rw-r--r-- | src/qml/qml/qqmlglobal_p.h | 4 |
2 files changed, 18 insertions, 38 deletions
diff --git a/src/qml/qml/qqmlglobal.cpp b/src/qml/qml/qqmlglobal.cpp index 1c0bb41804..cd08a5270c 100644 --- a/src/qml/qml/qqmlglobal.cpp +++ b/src/qml/qml/qqmlglobal.cpp @@ -70,13 +70,11 @@ const QMetaObject *QQmlValueTypeProvider::metaObjectForMetaType(int type) bool QQmlValueTypeProvider::initValueType(int type, QVariant& dst) { - QQmlValueTypeProvider *p = this; - do { - if (p->init(type, dst)) - return true; - } while ((p = p->next)); - - return false; + const QMetaType metaType(type); + if (!metaType.isValid()) + return false; + dst = QVariant(QMetaType(type)); + return true; } QVariant QQmlValueTypeProvider::createValueType(int type, int argc, const void *argv[]) @@ -141,14 +139,7 @@ QVariant QQmlValueTypeProvider::createVariantFromJsObject(int type, const QV4::V bool QQmlValueTypeProvider::equalValueType(int type, const void *lhs, const QVariant& rhs) { Q_ASSERT(lhs); - - QQmlValueTypeProvider *p = this; - do { - if (p->equal(type, lhs, rhs)) - return true; - } while ((p = p->next)); - - return false; + return QMetaType(type).equals(lhs, rhs.constData()); } bool QQmlValueTypeProvider::storeValueType(int type, const void *src, void *dst, size_t dstSize) @@ -165,42 +156,35 @@ bool QQmlValueTypeProvider::storeValueType(int type, const void *src, void *dst, return false; } -bool QQmlValueTypeProvider::readValueType(const QVariant& src, void *dst, int dstType) +bool QQmlValueTypeProvider::readValueType(const QVariant& src, void *dst, int type) { Q_ASSERT(dst); + const QMetaType dstType(type); + if (!dstType.isValid() || (src.metaType() == dstType && dstType.equals(src.constData(), dst))) + return false; - QQmlValueTypeProvider *p = this; - do { - if (p->read(src, dst, dstType)) - return true; - } while ((p = p->next)); - - return false; + dstType.destruct(dst); + dstType.construct(dst, src.metaType() == dstType ? src.constData() : nullptr); + return true; } bool QQmlValueTypeProvider::writeValueType(int type, const void *src, QVariant& dst) { Q_ASSERT(src); + const QMetaType srcType(type); + if (!srcType.isValid() || (dst.metaType() == srcType && srcType.equals(src, dst.constData()))) + return false; - QQmlValueTypeProvider *p = this; - do { - if (p->write(type, src, dst)) - return true; - } while ((p = p->next)); - - return false; + dst = QVariant(srcType, src); + return true; } const QMetaObject *QQmlValueTypeProvider::getMetaObjectForMetaType(int) { return nullptr; } -bool QQmlValueTypeProvider::init(int, QVariant&) { return false; } bool QQmlValueTypeProvider::create(int, int, const void *[], QVariant *) { return false; } bool QQmlValueTypeProvider::createFromString(int, const QString &, void *, size_t) { return false; } bool QQmlValueTypeProvider::variantFromString(int, const QString &, QVariant *) { return false; } bool QQmlValueTypeProvider::variantFromJsObject(int, const QV4::Value &, QV4::ExecutionEngine *, QVariant *) { return false; } -bool QQmlValueTypeProvider::equal(int, const void *, const QVariant&) { return false; } bool QQmlValueTypeProvider::store(int, const void *, void *, size_t) { return false; } -bool QQmlValueTypeProvider::read(const QVariant&, void *, int) { return false; } -bool QQmlValueTypeProvider::write(int, const void *, QVariant&) { return false; } struct ValueTypeProviderList { QQmlValueTypeProvider nullProvider; diff --git a/src/qml/qml/qqmlglobal_p.h b/src/qml/qml/qqmlglobal_p.h index f2a11e5456..3c03753d08 100644 --- a/src/qml/qml/qqmlglobal_p.h +++ b/src/qml/qml/qqmlglobal_p.h @@ -239,7 +239,6 @@ public: private: virtual const QMetaObject *getMetaObjectForMetaType(int); - virtual bool init(int, QVariant&); virtual bool create(int, int, const void *[], QVariant *); virtual bool createFromString(int, const QString &, void *, size_t); @@ -247,10 +246,7 @@ private: virtual bool variantFromString(int, const QString &, QVariant *); virtual bool variantFromJsObject(int, const QV4::Value &, QV4::ExecutionEngine *, QVariant *); - virtual bool equal(int, const void *, const QVariant&); virtual bool store(int, const void *, void *, size_t); - virtual bool read(const QVariant&, void *, int); - virtual bool write(int, const void *, QVariant&); friend Q_QML_PRIVATE_EXPORT void QQml_addValueTypeProvider(QQmlValueTypeProvider *); friend Q_QML_PRIVATE_EXPORT void QQml_removeValueTypeProvider(QQmlValueTypeProvider *); |