diff options
author | Lars Knoll <lars.knoll@qt.io> | 2020-07-13 11:33:30 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2020-08-24 00:17:33 +0200 |
commit | 4ccf76ff53a68850772f45a04527694de9f8da18 (patch) | |
tree | 18f1d45d0270a3007087160ad50db47d58fd8f58 /src/corelib/kernel/qvariant.cpp | |
parent | e45fa5aaf0abdbd87c3d68175fc5171a7d96a49f (diff) |
Start porting conversions over from QVariant to QMetaType
This will ensure full symmetry in what QVariant and
QMetaType support. With this done, QVariant will become
simply a container that can hold any QMetaType with fully
symmetric functionality between both.
Change-Id: I796d4368a2bc0f08cf4f70f4465ed6a0e07bdd76
Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
Diffstat (limited to 'src/corelib/kernel/qvariant.cpp')
-rw-r--r-- | src/corelib/kernel/qvariant.cpp | 594 |
1 files changed, 13 insertions, 581 deletions
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index 0a320a905d..f904879190 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -349,330 +349,28 @@ static bool convert(const QVariant::Private *d, int t, void *result) bool ok = true; switch (uint(t)) { -#ifndef QT_BOOTSTRAPPED - case QMetaType::QUrl: - switch (d->typeId()) { - case QMetaType::QString: - *static_cast<QUrl *>(result) = QUrl(d->get<QString>()); - break; - case QMetaType::QCborValue: - if (d->get<QCborValue>().isUrl()) { - *static_cast<QUrl *>(result) = d->get<QCborValue>().toUrl(); - break; - } - return false; - default: - return false; - } - break; -#endif // QT_BOOTSTRAPPED -#if QT_CONFIG(itemmodel) - case QMetaType::QModelIndex: - switch (d->typeId()) { - case QMetaType::QPersistentModelIndex: - *static_cast<QModelIndex *>(result) = QModelIndex(d->get<QPersistentModelIndex>()); - break; - default: - return false; - } - break; - case QMetaType::QPersistentModelIndex: - switch (d->typeId()) { - case QMetaType::QModelIndex: - *static_cast<QPersistentModelIndex *>(result) = QPersistentModelIndex(d->get<QModelIndex>()); - break; - default: - return false; - } - break; -#endif // QT_CONFIG(itemmodel) case QMetaType::QString: { QString *str = static_cast<QString *>(result); - switch (d->typeId()) { - case QMetaType::QChar: - *str = d->get<QChar>(); - break; - case QMetaType::Char: - case QMetaType::SChar: - case QMetaType::UChar: - *str = QChar::fromLatin1(d->get<char>()); - break; - case QMetaType::Short: - case QMetaType::Long: - case QMetaType::Int: - case QMetaType::LongLong: - *str = QString::number(qMetaTypeNumber(d)); - break; - case QMetaType::UInt: - case QMetaType::ULongLong: - case QMetaType::UShort: - case QMetaType::ULong: - *str = QString::number(qMetaTypeUNumber(d)); - break; - case QMetaType::Float: - *str = QString::number(d->get<float>(), 'g', QLocale::FloatingPointShortest); - break; - case QMetaType::Double: - *str = QString::number(d->get<double>(), 'g', QLocale::FloatingPointShortest); - break; -#if QT_CONFIG(datestring) - case QMetaType::QDate: - *str = d->get<QDate>().toString(Qt::ISODate); - break; - case QMetaType::QTime: - *str = d->get<QTime>().toString(Qt::ISODateWithMs); - break; - case QMetaType::QDateTime: - *str = d->get<QDateTime>().toString(Qt::ISODateWithMs); - break; -#endif - case QMetaType::Bool: - *str = d->get<bool>() ? QStringLiteral("true") : QStringLiteral("false"); - break; - case QMetaType::QByteArray: - *str = QString::fromUtf8(d->get<QByteArray>().constData()); - break; - case QMetaType::QStringList: - if (d->get<QStringList>().count() == 1) - *str = d->get<QStringList>().at(0); - break; -#ifndef QT_BOOTSTRAPPED - case QMetaType::QUrl: - *str = d->get<QUrl>().toString(); - break; - case QMetaType::QJsonValue: - if (d->get<QJsonValue>().isString()) - *str = d->get<QJsonValue>().toString(); - else if (!d->get<QJsonValue>().isNull()) - return false; - break; - case QMetaType::QCborValue: - if (d->get<QCborValue>().isContainer() || d->get<QCborValue>().isTag()) - return false; - *str = d->get<QCborValue>().toVariant().toString(); - break; -#endif - case QMetaType::QUuid: - *str = d->get<QUuid>().toString(); - break; - case QMetaType::Nullptr: - *str = QString(); - break; - default: #ifndef QT_NO_QOBJECT - { - QMetaEnum en = metaEnumFromType(d->type()); - if (en.isValid()) { - *str = QString::fromUtf8(en.valueToKey(qConvertToNumber(d, &ok))); - return ok; - } - } -#endif - return false; - } - break; - } - case QMetaType::QChar: { - QChar *c = static_cast<QChar *>(result); - switch (d->typeId()) { - case QMetaType::Int: - case QMetaType::LongLong: - case QMetaType::Char: - case QMetaType::SChar: - case QMetaType::Short: - case QMetaType::Long: - case QMetaType::Float: - *c = QChar::fromUcs2(qMetaTypeNumber(d)); - break; - case QMetaType::UInt: - case QMetaType::ULongLong: - case QMetaType::UChar: - case QMetaType::UShort: - case QMetaType::ULong: - *c = QChar::fromUcs2(qMetaTypeUNumber(d)); - break; - default: - return false; - } - break; - } -#ifndef QT_NO_GEOM_VARIANT - case QMetaType::QSize: { - QSize *s = static_cast<QSize *>(result); - switch (d->typeId()) { - case QMetaType::QSizeF: - *s = d->get<QSizeF>().toSize(); - break; - default: - return false; - } - break; - } - - case QMetaType::QSizeF: { - QSizeF *s = static_cast<QSizeF *>(result); - switch (d->typeId()) { - case QMetaType::QSize: - *s = QSizeF(d->get<QSize>()); - break; - default: - return false; - } - break; - } - - case QMetaType::QLine: { - QLine *s = static_cast<QLine *>(result); - switch (d->typeId()) { - case QMetaType::QLineF: - *s = d->get<QLineF>().toLine(); - break; - default: - return false; - } - break; - } - - case QMetaType::QLineF: { - QLineF *s = static_cast<QLineF *>(result); - switch (d->typeId()) { - case QMetaType::QLine: - *s = QLineF(d->get<QLine>()); - break; - default: - return false; - } - break; - } -#endif - case QMetaType::QStringList: - if (d->typeId() == QMetaType::QVariantList) { - QStringList *slst = static_cast<QStringList *>(result); - const QVariantList &list = d->get<QVariantList >(); - const int size = list.size(); - slst->reserve(size); - for (int i = 0; i < size; ++i) - slst->append(list.at(i).toString()); - } else if (d->typeId() == QMetaType::QString) { - QStringList *slst = static_cast<QStringList *>(result); - *slst = QStringList(d->get<QString>()); - } else { - return false; - } - break; - case QMetaType::QDate: { - QDate *dt = static_cast<QDate *>(result); - if (d->typeId() == QMetaType::QDateTime) - *dt = d->get<QDateTime>().date(); -#if QT_CONFIG(datestring) - else if (d->typeId() == QMetaType::QString) - *dt = QDate::fromString(d->get<QString>(), Qt::ISODate); -#endif - else - return false; - - return dt->isValid(); - } - case QMetaType::QTime: { - QTime *t = static_cast<QTime *>(result); - switch (d->typeId()) { - case QMetaType::QDateTime: - *t = d->get<QDateTime>().time(); - break; -#if QT_CONFIG(datestring) - case QMetaType::QString: - *t = QTime::fromString(d->get<QString>(), Qt::ISODate); - break; -#endif - default: - return false; + QMetaEnum en = metaEnumFromType(d->type()); + if (en.isValid()) { + *str = QString::fromUtf8(en.valueToKey(qConvertToNumber(d, &ok))); + return ok; } - return t->isValid(); - } - case QMetaType::QDateTime: { - QDateTime *dt = static_cast<QDateTime *>(result); - switch (d->typeId()) { -#if QT_CONFIG(datestring) - case QMetaType::QString: - *dt = QDateTime::fromString(d->get<QString>(), Qt::ISODate); - break; -# ifndef QT_BOOTSTRAPPED - case QMetaType::QCborValue: - if (d->get<QCborValue>().isDateTime()) - *dt = d->get<QCborValue>().toDateTime(); - else - return false; - break; -# endif #endif - case QMetaType::QDate: - *dt = d->get<QDate>().startOfDay(); - break; - default: - return false; - } - return dt->isValid(); + return false; } case QMetaType::QByteArray: { - QByteArray *ba = static_cast<QByteArray *>(result); - switch (d->typeId()) { - case QMetaType::QString: - *ba = d->get<QString>().toUtf8(); - break; - case QMetaType::Double: - *ba = QByteArray::number(d->get<double>(), 'g', QLocale::FloatingPointShortest); - break; - case QMetaType::Float: - *ba = QByteArray::number(d->get<float>(), 'g', QLocale::FloatingPointShortest); - break; - case QMetaType::Char: - case QMetaType::SChar: - case QMetaType::UChar: - *ba = QByteArray(1, d->get<char>()); - break; - case QMetaType::Int: - case QMetaType::LongLong: - case QMetaType::Short: - case QMetaType::Long: - *ba = QByteArray::number(qMetaTypeNumber(d)); - break; - case QMetaType::UInt: - case QMetaType::ULongLong: - case QMetaType::UShort: - case QMetaType::ULong: - *ba = QByteArray::number(qMetaTypeUNumber(d)); - break; - case QMetaType::Bool: - *ba = QByteArray(d->get<bool>() ? "true" : "false"); - break; - case QMetaType::QUuid: - *ba = d->get<QUuid>().toByteArray(); - break; - case QMetaType::Nullptr: - *ba = QByteArray(); - break; -#ifndef QT_BOOTSTRAPPED - case QMetaType::QCborValue: - if (d->get<QCborValue>().isByteArray()) - *ba = d->get<QCborValue>().toByteArray(); - else - return false; - break; -#endif - default: #ifndef QT_NO_QOBJECT - { - QMetaEnum en = metaEnumFromType(d->type()); - if (en.isValid()) { - *ba = en.valueToKey(qConvertToNumber(d, &ok)); - return ok; - } - } -#endif - return false; + QMetaEnum en = metaEnumFromType(d->type()); + if (en.isValid()) { + QByteArray *ba = static_cast<QByteArray *>(result); + *ba = en.valueToKey(qConvertToNumber(d, &ok)); + return ok; } +#endif + return false; } - break; case QMetaType::Short: *static_cast<short *>(result) = short(qConvertToNumber(d, &ok)); return ok; @@ -850,132 +548,11 @@ static bool convert(const QVariant::Private *d, int t, void *result) } break; } - case QMetaType::QVariantList: - if (d->typeId() == QMetaType::QStringList) { - QVariantList *lst = static_cast<QVariantList *>(result); - const QStringList &slist = d->get<QStringList>(); - const int size = slist.size(); - lst->reserve(size); - for (int i = 0; i < size; ++i) - lst->append(QVariant(slist.at(i))); -#ifndef QT_BOOTSTRAPPED - } else if (d->typeId() == QMetaType::QCborValue) { - if (!d->get<QCborValue>().isArray()) - return false; - *static_cast<QVariantList *>(result) = d->get<QCborValue>().toArray().toVariantList(); - } else if (d->typeId() == QMetaType::QCborArray) { - *static_cast<QVariantList *>(result) = d->get<QCborArray>().toVariantList(); - } else if (d->typeId() == QMetaType::QJsonValue) { - if (!d->get<QJsonValue>().isArray()) - return false; - *static_cast<QVariantList *>(result) = d->get<QJsonValue>().toArray().toVariantList(); - } else if (d->typeId() == QMetaType::QJsonArray) { - *static_cast<QVariantList *>(result) = d->get<QJsonArray>().toVariantList(); -#endif - } else { - return false; - } - break; - case QMetaType::QVariantMap: - if (d->typeId() == QMetaType::QVariantHash) { - QVariantMap *map = static_cast<QVariantMap *>(result); - const QVariantHash &hash = d->get<QVariantHash>(); - const auto end = hash.end(); - for (auto it = hash.begin(); it != end; ++it) - map->insert(it.key(), it.value()); -#ifndef QT_BOOTSTRAPPED - } else if (d->typeId() == QMetaType::QCborValue) { - if (!d->get<QCborValue>().isMap()) - return false; - *static_cast<QVariantMap *>(result) = d->get<QCborValue>().toMap().toVariantMap(); - } else if (d->typeId() == QMetaType::QCborMap) { - *static_cast<QVariantMap *>(result) = d->get<QCborMap>().toVariantMap(); - } else if (d->typeId() == QMetaType::QJsonValue) { - if (!d->get<QJsonValue>().isObject()) - return false; - *static_cast<QVariantMap *>(result) = d->get<QJsonValue>().toObject().toVariantMap(); - } else if (d->typeId() == QMetaType::QJsonObject) { - *static_cast<QVariantMap *>(result) = d->get<QJsonObject>().toVariantMap(); -#endif - } else { - return false; - } - break; - case QMetaType::QVariantHash: - if (d->typeId() == QMetaType::QVariantMap) { - QVariantHash *hash = static_cast<QVariantHash *>(result); - const QVariantMap &map = d->get<QVariantMap>(); - const auto end = map.end(); - for (auto it = map.begin(); it != end; ++it) - hash->insert(it.key(), it.value()); -#ifndef QT_BOOTSTRAPPED - } else if (d->typeId() == QMetaType::QCborValue) { - if (!d->get<QCborValue>().isMap()) - return false; - *static_cast<QVariantHash *>(result) = d->get<QCborValue>().toMap().toVariantHash(); - } else if (d->typeId() == QMetaType::QCborMap) { - *static_cast<QVariantHash *>(result) = d->get<QCborMap>().toVariantHash(); - } else if (d->typeId() == QMetaType::QJsonValue) { - if (!d->get<QJsonValue>().isObject()) - return false; - *static_cast<QVariantHash *>(result) = d->get<QJsonValue>().toObject().toVariantHash(); - } else if (d->typeId() == QMetaType::QJsonObject) { - *static_cast<QVariantHash *>(result) = d->get<QJsonObject>().toVariantHash(); -#endif - } else { - return false; - } - break; -#ifndef QT_NO_GEOM_VARIANT - case QMetaType::QRect: - if (d->typeId() == QMetaType::QRectF) - *static_cast<QRect *>(result) = d->get<QRectF>().toRect(); - else - return false; - break; - case QMetaType::QRectF: - if (d->typeId() == QMetaType::QRect) - *static_cast<QRectF *>(result) = d->get<QRect>(); - else - return false; - break; - case QMetaType::QPointF: - if (d->typeId() == QMetaType::QPoint) - *static_cast<QPointF *>(result) = d->get<QPoint>(); - else - return false; - break; - case QMetaType::QPoint: - if (d->typeId() == QMetaType::QPointF) - *static_cast<QPoint *>(result) = d->get<QPointF>().toPoint(); - else - return false; - break; case QMetaType::Char: { *static_cast<qint8 *>(result) = qint8(qConvertToNumber(d, &ok)); return ok; } -#endif - case QMetaType::QUuid: - switch (d->typeId()) { - case QMetaType::QString: - *static_cast<QUuid *>(result) = QUuid(d->get<QString>()); - break; - case QMetaType::QByteArray: - *static_cast<QUuid *>(result) = QUuid(d->get<QByteArray>()); - break; -#ifndef QT_BOOTSTRAPPED - case QMetaType::QCborValue: - if (!d->get<QCborValue>().isUuid()) - return false; - *static_cast<QUuid *>(result) = d->get<QCborValue>().toUuid(); - break; -#endif - default: - return false; - } - break; case QMetaType::Nullptr: *static_cast<std::nullptr_t *>(result) = nullptr; if (QMetaType::typeFlags(t) & (QMetaType::PointerToGadget | QMetaType::PointerToQObject) @@ -990,14 +567,6 @@ static bool convert(const QVariant::Private *d, int t, void *result) return false; #ifndef QT_BOOTSTRAPPED -#if QT_CONFIG(regularexpression) - case QMetaType::QRegularExpression: - if (d->typeId() != QMetaType::QCborValue - || !d->get<QCborValue>().isRegularExpression()) - return false; - *static_cast<QRegularExpression *>(result) = d->get<QCborValue>().toRegularExpression(); - break; -#endif case QMetaType::QJsonValue: switch (d->typeId()) { case QMetaType::Nullptr: @@ -1062,67 +631,7 @@ static bool convert(const QVariant::Private *d, int t, void *result) return false; } break; - case QMetaType::QJsonArray: - switch (d->typeId()) { - case QMetaType::QStringList: - *static_cast<QJsonArray *>(result) = QJsonArray::fromStringList(d->get<QStringList>()); - break; - case QMetaType::QVariantList: - *static_cast<QJsonArray *>(result) = QJsonArray::fromVariantList(d->get<QVariantList>()); - break; - case QMetaType::QJsonValue: - if (!d->get<QJsonValue>().isArray()) - return false; - *static_cast<QJsonArray *>(result) = d->get<QJsonValue>().toArray(); - break; - case QMetaType::QJsonDocument: - if (!d->get<QJsonDocument>().isArray()) - return false; - *static_cast<QJsonArray *>(result) = d->get<QJsonDocument>().array(); - break; - case QMetaType::QCborValue: - if (!d->get<QCborValue>().isArray()) - return false; - *static_cast<QJsonArray *>(result) = d->get<QCborValue>().toArray().toJsonArray(); - break; - case QMetaType::QCborArray: - *static_cast<QJsonArray *>(result) = d->get<QCborArray>().toJsonArray(); - break; - default: - return false; - } - break; - case QMetaType::QJsonObject: - switch (d->typeId()) { - case QMetaType::QVariantMap: - *static_cast<QJsonObject *>(result) = QJsonObject::fromVariantMap(d->get<QVariantMap>()); - break; - case QMetaType::QVariantHash: - *static_cast<QJsonObject *>(result) = QJsonObject::fromVariantHash(d->get<QVariantHash>()); - break; - case QMetaType::QJsonValue: - if (!d->get<QJsonValue>().isObject()) - return false; - *static_cast<QJsonObject *>(result) = d->get<QJsonValue>().toObject(); - break; - case QMetaType::QJsonDocument: - if (d->get<QJsonDocument>().isArray()) - return false; - *static_cast<QJsonObject *>(result) = d->get<QJsonDocument>().object(); - break; - case QMetaType::QCborValue: - if (!d->get<QCborValue>().isMap()) - return false; - *static_cast<QJsonObject *>(result) = d->get<QCborValue>().toMap().toJsonObject(); - break; - case QMetaType::QCborMap: - *static_cast<QJsonObject *>(result) = d->get<QCborMap>().toJsonObject(); - break; - default: - return false; - } - break; - case QMetaType::QCborSimpleType: + case QMetaType::QCborSimpleType: if (d->typeId() == QMetaType::QCborValue && d->get<QCborValue>().isSimpleType()) { *static_cast<QCborSimpleType *>(result) = d->get<QCborValue>().toSimpleType(); break; @@ -1173,23 +682,6 @@ static bool convert(const QVariant::Private *d, int t, void *result) case QMetaType::QUrl: *static_cast<QCborValue *>(result) = QCborValue(d->get<QUrl>()); break; -#if QT_CONFIG(regularexpression) - case QMetaType::QRegularExpression: - *static_cast<QCborValue *>(result) = QCborValue(d->get<QRegularExpression>()); - break; -#endif - case QMetaType::QUuid: - *static_cast<QCborValue *>(result) = QCborValue(d->get<QUuid>()); - break; - case QMetaType::QVariantList: - *static_cast<QCborValue *>(result) = QCborArray::fromVariantList(d->get<QVariantList>()); - break; - case QMetaType::QVariantMap: - *static_cast<QCborValue *>(result) = QCborMap::fromVariantMap(d->get<QVariantMap>()); - break; - case QMetaType::QVariantHash: - *static_cast<QCborValue *>(result) = QCborMap::fromVariantHash(d->get<QVariantHash>()); - break; case QMetaType::QJsonValue: *static_cast<QCborValue *>(result) = QCborValue::fromJsonValue(d->get<QJsonValue>()); break; @@ -1221,66 +713,6 @@ static bool convert(const QVariant::Private *d, int t, void *result) return false; } break; - case QMetaType::QCborArray: - switch (d->typeId()) { - case QMetaType::QStringList: - *static_cast<QCborArray *>(result) = QCborArray::fromStringList(d->get<QStringList>()); - break; - case QMetaType::QVariantList: - *static_cast<QCborArray *>(result) = QCborArray::fromVariantList(d->get<QVariantList>()); - break; - case QMetaType::QCborValue: - if (!d->get<QCborValue>().isArray()) - return false; - *static_cast<QCborArray *>(result) = d->get<QCborValue>().toArray(); - break; - case QMetaType::QJsonDocument: - if (!d->get<QJsonDocument>().isArray()) - return false; - *static_cast<QCborArray *>(result) = QCborArray::fromJsonArray(d->get<QJsonDocument>().array()); - break; - case QMetaType::QJsonValue: - if (!d->get<QJsonValue>().isArray()) - return false; - *static_cast<QCborArray *>(result) = QCborArray::fromJsonArray(d->get<QJsonValue>().toArray()); - break; - case QMetaType::QJsonArray: - *static_cast<QCborArray *>(result) = QCborArray::fromJsonArray(d->get<QJsonArray>()); - break; - default: - return false; - } - break; - case QMetaType::QCborMap: - switch (d->typeId()) { - case QMetaType::QVariantMap: - *static_cast<QCborMap *>(result) = QCborMap::fromVariantMap(d->get<QVariantMap>()); - break; - case QMetaType::QVariantHash: - *static_cast<QCborMap *>(result) = QCborMap::fromVariantHash(d->get<QVariantHash>()); - break; - case QMetaType::QCborValue: - if (!d->get<QCborValue>().isMap()) - return false; - *static_cast<QCborMap *>(result) = d->get<QCborValue>().toMap(); - break; - case QMetaType::QJsonDocument: - if (d->get<QJsonDocument>().isArray()) - return false; - *static_cast<QCborMap *>(result) = QCborMap::fromJsonObject(d->get<QJsonDocument>().object()); - break; - case QMetaType::QJsonValue: - if (!d->get<QJsonValue>().isObject()) - return false; - *static_cast<QCborMap *>(result) = QCborMap::fromJsonObject(d->get<QJsonValue>().toObject()); - break; - case QMetaType::QJsonObject: - *static_cast<QCborMap *>(result) = QCborMap::fromJsonObject(d->get<QJsonObject>()); - break; - default: - return false; - } - break; #endif default: |