From 4ccf76ff53a68850772f45a04527694de9f8da18 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 13 Jul 2020 11:33:30 +0200 Subject: 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 --- src/corelib/kernel/qmetatype.cpp | 387 ++++++++++++++ src/corelib/kernel/qmetatype_p.h | 3 + src/corelib/kernel/qvariant.cpp | 594 +-------------------- .../auto/corelib/kernel/qvariant/tst_qvariant.cpp | 5 - 4 files changed, 403 insertions(+), 586 deletions(-) diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index 6d17ceb2b8..edaeed2a0a 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -865,6 +865,393 @@ static const struct : QMetaTypeModuleHelper return nullptr; } } + + bool convert(const void *from, int fromTypeId, void *to, int toTypeId) const override + { + Q_ASSERT(fromTypeId != toTypeId); + + bool onlyCheck = (from == nullptr && to == nullptr); + + using Char = char; + using SChar = signed char; + using UChar = unsigned char; + using Short = short; + using UShort = unsigned short; + using Int = int; + using UInt = unsigned int; + using Long = long; + using LongLong = qlonglong; + using ULong = unsigned long; + using ULongLong = qulonglong; + using Float = float; + using Double = double; + using Bool = bool; + using Nullptr = std::nullptr_t; + +#define QMETATYPE_CONVERTER_ASSIGN_NUMBER(To, From) \ + QMETATYPE_CONVERTER(To, From, result = To::number(source); return true;) + + switch (makePair(toTypeId, fromTypeId)) { +#ifndef QT_BOOTSTRAPPED + QMETATYPE_CONVERTER_ASSIGN(QUrl, QString); + QMETATYPE_CONVERTER(QUrl, QCborValue, + if (source.isUrl()) { + result = source.toUrl(); + return true; + } + return false; + ); +#endif +#if QT_CONFIG(itemmodel) + QMETATYPE_CONVERTER_ASSIGN(QModelIndex, QPersistentModelIndex); + QMETATYPE_CONVERTER_ASSIGN(QPersistentModelIndex, QModelIndex); +#endif // QT_CONFIG(itemmodel) + + // QChar methods +#define QMETATYPE_CONVERTER_ASSIGN_QCHAR(From) \ + QMETATYPE_CONVERTER(QChar, From, result = QChar::fromUcs2(source); return true;) + QMETATYPE_CONVERTER_ASSIGN_QCHAR(Char); + QMETATYPE_CONVERTER_ASSIGN_QCHAR(SChar); + QMETATYPE_CONVERTER_ASSIGN_QCHAR(Short); + QMETATYPE_CONVERTER_ASSIGN_QCHAR(Long); + QMETATYPE_CONVERTER_ASSIGN_QCHAR(Int); + QMETATYPE_CONVERTER_ASSIGN_QCHAR(LongLong); + QMETATYPE_CONVERTER_ASSIGN_QCHAR(Float); + QMETATYPE_CONVERTER_ASSIGN_QCHAR(UChar); + QMETATYPE_CONVERTER_ASSIGN_QCHAR(UShort); + QMETATYPE_CONVERTER_ASSIGN_QCHAR(ULong); + QMETATYPE_CONVERTER_ASSIGN_QCHAR(UInt); + QMETATYPE_CONVERTER_ASSIGN_QCHAR(ULongLong); + + // conversions to QString + QMETATYPE_CONVERTER_ASSIGN(QString, QChar); + QMETATYPE_CONVERTER(QString, Bool, + result = source ? QStringLiteral("true") : QStringLiteral("false"); + return true; + ); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QString, Short); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QString, Long); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QString, Int); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QString, LongLong); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QString, UShort); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QString, ULong); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QString, UInt); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QString, ULongLong); + QMETATYPE_CONVERTER(QString, Float, + result = QString::number(source, 'g', QLocale::FloatingPointShortest); + return true; + ); + QMETATYPE_CONVERTER(QString, Double, + result = QString::number(source, 'g', QLocale::FloatingPointShortest); + return true; + ); + QMETATYPE_CONVERTER(QString, Char, + result = QString::fromLatin1(&source, 1); + return true; + ); + QMETATYPE_CONVERTER(QString, SChar, + char s = source; + result = QString::fromLatin1(&s, 1); + return true; + ); + QMETATYPE_CONVERTER(QString, UChar, + char s = source; + result = QString::fromLatin1(&s, 1); + return true; + ); +#if QT_CONFIG(datestring) + QMETATYPE_CONVERTER(QString, QDate, result = source.toString(Qt::ISODate); return true;); + QMETATYPE_CONVERTER(QString, QTime, result = source.toString(Qt::ISODateWithMs); return true;); + QMETATYPE_CONVERTER(QString, QDateTime, result = source.toString(Qt::ISODateWithMs); return true;); +#endif + QMETATYPE_CONVERTER(QString, QByteArray, result = QString::fromUtf8(source); return true;); + QMETATYPE_CONVERTER(QString, QStringList, + return (source.count() == 1) ? (result = source.at(0), true) : false; + ); +#ifndef QT_BOOTSTRAPPED + QMETATYPE_CONVERTER(QString, QUrl, result = source.toString(); return true;); + QMETATYPE_CONVERTER(QString, QJsonValue, + if (source.isString() || source.isNull()) { + result = source.toString(); + return true; + } + return false; + ); +#endif + QMETATYPE_CONVERTER(QString, Nullptr, Q_UNUSED(source); result = QString(); return true;); + + // QByteArray + QMETATYPE_CONVERTER(QByteArray, QString, result = source.toUtf8(); return true;); + QMETATYPE_CONVERTER(QByteArray, Bool, + result = source ? "true" : "false"; + return true; + ); + QMETATYPE_CONVERTER(QByteArray, Char, result = QByteArray(source, 1); return true;); + QMETATYPE_CONVERTER(QByteArray, SChar, result = QByteArray(source, 1); return true;); + QMETATYPE_CONVERTER(QByteArray, UChar, result = QByteArray(source, 1); return true;); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QByteArray, Short); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QByteArray, Long); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QByteArray, Int); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QByteArray, LongLong); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QByteArray, UShort); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QByteArray, ULong); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QByteArray, UInt); + QMETATYPE_CONVERTER_ASSIGN_NUMBER(QByteArray, ULongLong); + QMETATYPE_CONVERTER(QByteArray, Float, + result = QByteArray::number(source, 'g', QLocale::FloatingPointShortest); + return true; + ); + QMETATYPE_CONVERTER(QByteArray, Double, + result = QByteArray::number(source, 'g', QLocale::FloatingPointShortest); + return true; + ); + QMETATYPE_CONVERTER(QByteArray, Nullptr, Q_UNUSED(source); result = QByteArray(); return true;); + + QMETATYPE_CONVERTER(QString, QUuid, result = source.toString(); return true;); + QMETATYPE_CONVERTER(QUuid, QString, result = QUuid(source); return true;); + QMETATYPE_CONVERTER(QByteArray, QUuid, result = source.toByteArray(); return true;); + QMETATYPE_CONVERTER(QUuid, QByteArray, result = QUuid(source); return true;); + +#ifndef QT_NO_GEOM_VARIANT + QMETATYPE_CONVERTER(QSize, QSizeF, result = source.toSize(); return true;); + QMETATYPE_CONVERTER_ASSIGN(QSizeF, QSize); + QMETATYPE_CONVERTER(QLine, QLineF, result = source.toLine(); return true;); + QMETATYPE_CONVERTER_ASSIGN(QLineF, QLine); + QMETATYPE_CONVERTER(QRect, QRectF, result = source.toRect(); return true;); + QMETATYPE_CONVERTER_ASSIGN(QRectF, QRect); + QMETATYPE_CONVERTER(QPoint, QPointF, result = source.toPoint(); return true;); + QMETATYPE_CONVERTER_ASSIGN(QPointF, QPoint); + #endif + + QMETATYPE_CONVERTER(QStringList, QVariantList, + result.reserve(source.size()); + for (auto v: source) + result.append(v.toString()); + return true; + ); + QMETATYPE_CONVERTER(QVariantList, QStringList, + result.reserve(source.size()); + for (auto v: source) + result.append(QVariant(v)); + return true; + ); + QMETATYPE_CONVERTER(QStringList, QString, result = QStringList() << source; return true;); + + QMETATYPE_CONVERTER(QVariantHash, QVariantMap, + for (auto it = source.begin(); it != source.end(); ++it) + result.insert(it.key(), it.value()); + return true; + ); + QMETATYPE_CONVERTER(QVariantMap, QVariantHash, + for (auto it = source.begin(); it != source.end(); ++it) + result.insert(it.key(), it.value()); + return true; + ); + +#ifndef QT_BOOTSTRAPPED + QMETATYPE_CONVERTER_ASSIGN(QCborValue, QString); + QMETATYPE_CONVERTER(QString, QCborValue, + if (source.isContainer() || source.isTag()) + return false; + result = source.toVariant().toString(); + return true; + ); + QMETATYPE_CONVERTER_ASSIGN(QCborValue, QByteArray); + QMETATYPE_CONVERTER(QByteArray, QCborValue, + if (source.isByteArray()) { + result = source.toByteArray(); + return true; + } + return false; + ); + QMETATYPE_CONVERTER_ASSIGN(QCborValue, QUuid); + QMETATYPE_CONVERTER(QUuid, QCborValue, + if (!source.isUuid()) + return false; + result = source.toUuid(); + return true; + ); + QMETATYPE_CONVERTER(QCborValue, QVariantList, result = QCborArray::fromVariantList(source); return true;); + QMETATYPE_CONVERTER(QVariantList, QCborValue, + if (!source.isArray()) + return false; + result = source.toArray().toVariantList(); + return true; + ); + QMETATYPE_CONVERTER(QCborValue, QVariantMap, result = QCborMap::fromVariantMap(source); return true;); + QMETATYPE_CONVERTER(QVariantMap, QCborValue, + if (!source.isMap()) + return false; + result = source.toMap().toVariantMap(); + return true; + ); + QMETATYPE_CONVERTER(QCborValue, QVariantHash, result = QCborMap::fromVariantHash(source); return true;); + QMETATYPE_CONVERTER(QVariantHash, QCborValue, + if (!source.isMap()) + return false; + result = source.toMap().toVariantHash(); + return true; + ); +#if QT_CONFIG(regularexpression) + QMETATYPE_CONVERTER(QCborValue, QRegularExpression, result = QCborValue(source); return true;); + QMETATYPE_CONVERTER(QRegularExpression, QCborValue, + if (!source.isRegularExpression()) + return false; + result = source.toRegularExpression(); + return true; + ); +#endif + QMETATYPE_CONVERTER(QDateTime, QCborValue, + if (source.isDateTime()) { + result = source.toDateTime(); + return true; + } + return false; + ); + + QMETATYPE_CONVERTER(QCborArray, QVariantList, result = QCborArray::fromVariantList(source); return true;); + QMETATYPE_CONVERTER(QVariantList, QCborArray, result = source.toVariantList(); return true;); + QMETATYPE_CONVERTER(QCborArray, QStringList, result = QCborArray::fromStringList(source); return true;); + QMETATYPE_CONVERTER(QCborMap, QVariantMap, result = QCborMap::fromVariantMap(source); return true;); + QMETATYPE_CONVERTER(QVariantMap, QCborMap, result = source.toVariantMap(); return true;); + QMETATYPE_CONVERTER(QCborMap, QVariantHash, result = QCborMap::fromVariantHash(source); return true;); + QMETATYPE_CONVERTER(QVariantHash, QCborMap, result = source.toVariantHash(); return true;); + + QMETATYPE_CONVERTER(QCborArray, QCborValue, + if (!source.isArray()) + return false; + result = source.toArray(); + return true; + ); + QMETATYPE_CONVERTER(QCborArray, QJsonDocument, + if (!source.isArray()) + return false; + result = QCborArray::fromJsonArray(source.array()); + return true; + ); + QMETATYPE_CONVERTER(QCborArray, QJsonValue, + if (!source.isArray()) + return false; + result = QCborArray::fromJsonArray(source.toArray()); + return true; + ); + QMETATYPE_CONVERTER(QCborArray, QJsonArray, + result = QCborArray::fromJsonArray(source); + return true; + ); + QMETATYPE_CONVERTER(QCborMap, QCborValue, + if (!source.isMap()) + return false; + result = source.toMap(); + return true; + ); + QMETATYPE_CONVERTER(QCborMap, QJsonDocument, + if (source.isArray()) + return false; + result = QCborMap::fromJsonObject(source.object()); + return true; + ); + QMETATYPE_CONVERTER(QCborMap, QJsonValue, + if (!source.isObject()) + return false; + result = QCborMap::fromJsonObject(source.toObject()); + return true; + ); + QMETATYPE_CONVERTER(QCborMap, QJsonObject, + result = QCborMap::fromJsonObject(source); + return true; + ); + + + QMETATYPE_CONVERTER(QVariantList, QJsonValue, + if (!source.isArray()) + return false; + result = source.toArray().toVariantList(); + return true; + ); + QMETATYPE_CONVERTER(QVariantList, QJsonArray, result = source.toVariantList(); return true;); + QMETATYPE_CONVERTER(QVariantMap, QJsonValue, + if (!source.isObject()) + return false; + result = source.toObject().toVariantMap(); + return true; + ); + QMETATYPE_CONVERTER(QVariantMap, QJsonObject, result = source.toVariantMap(); return true;); + QMETATYPE_CONVERTER(QVariantHash, QJsonValue, + if (!source.isObject()) + return false; + result = source.toObject().toVariantHash(); + return true; + ); + QMETATYPE_CONVERTER(QVariantHash, QJsonObject, result = source.toVariantHash(); return true;); + + + QMETATYPE_CONVERTER(QJsonArray, QStringList, result = QJsonArray::fromStringList(source); return true;); + QMETATYPE_CONVERTER(QJsonArray, QVariantList, result = QJsonArray::fromVariantList(source); return true;); + QMETATYPE_CONVERTER(QJsonArray, QJsonValue, + if (!source.isArray()) + return false; + result = source.toArray(); + return true; + ); + QMETATYPE_CONVERTER(QJsonArray, QJsonDocument, + if (!source.isArray()) + return false; + result = source.array(); + return true; + ); + QMETATYPE_CONVERTER(QJsonArray, QCborValue, + if (!source.isArray()) + return false; + result = source.toArray().toJsonArray(); + return true; + ); + QMETATYPE_CONVERTER(QJsonArray, QCborArray, result = source.toJsonArray(); return true;); + QMETATYPE_CONVERTER(QJsonObject, QVariantMap, result = QJsonObject::fromVariantMap(source); return true;); + QMETATYPE_CONVERTER(QJsonObject, QVariantHash, result = QJsonObject::fromVariantHash(source); return true;); + QMETATYPE_CONVERTER(QJsonObject, QJsonValue, + if (!source.isObject()) + return false; + result = source.toObject(); + return true; + ); + QMETATYPE_CONVERTER(QJsonObject, QJsonDocument, + if (source.isArray()) + return false; + result = source.object(); + return true; + ); + QMETATYPE_CONVERTER(QJsonObject, QCborValue, + if (!source.isMap()) + return false; + result = source.toMap().toJsonObject(); + return true; + ); + QMETATYPE_CONVERTER(QJsonObject, QCborMap, result = source.toJsonObject(); return true; ); + +#endif + + QMETATYPE_CONVERTER(QDate, QDateTime, result = source.date(); return true;); + QMETATYPE_CONVERTER(QTime, QDateTime, result = source.time(); return true;); + QMETATYPE_CONVERTER(QDateTime, QDate, result = source.startOfDay(); return true;); +#if QT_CONFIG(datestring) + QMETATYPE_CONVERTER(QDate, QString, + result = QDate::fromString(source, Qt::ISODate); + return result.isValid(); + ); + QMETATYPE_CONVERTER(QTime, QString, + result = QTime::fromString(source, Qt::ISODate); + return result.isValid(); + ); + QMETATYPE_CONVERTER(QDateTime, QString, + result = QDateTime::fromString(source, Qt::ISODate); + return result.isValid(); + ); +#endif + + } + return false; + } } metatypeHelper; static const QMetaTypeModuleHelper *qMetaTypeCoreHelper = &metatypeHelper; diff --git a/src/corelib/kernel/qmetatype_p.h b/src/corelib/kernel/qmetatype_p.h index bda4301afd..7ddad4038d 100644 --- a/src/corelib/kernel/qmetatype_p.h +++ b/src/corelib/kernel/qmetatype_p.h @@ -137,6 +137,9 @@ QT_WARNING_POP To &result = *static_cast(to); \ assign_and_return \ } +#define QMETATYPE_CONVERTER_ASSIGN(To, From) \ + QMETATYPE_CONVERTER(To, From, result = To(source); return true;) + #define QMETATYPE_CONVERTER_FUNCTION(To, assign_and_return) \ { \ To &result = *static_cast(r); \ 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(result) = QUrl(d->get()); - break; - case QMetaType::QCborValue: - if (d->get().isUrl()) { - *static_cast(result) = d->get().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(result) = QModelIndex(d->get()); - break; - default: - return false; - } - break; - case QMetaType::QPersistentModelIndex: - switch (d->typeId()) { - case QMetaType::QModelIndex: - *static_cast(result) = QPersistentModelIndex(d->get()); - break; - default: - return false; - } - break; -#endif // QT_CONFIG(itemmodel) case QMetaType::QString: { QString *str = static_cast(result); - switch (d->typeId()) { - case QMetaType::QChar: - *str = d->get(); - break; - case QMetaType::Char: - case QMetaType::SChar: - case QMetaType::UChar: - *str = QChar::fromLatin1(d->get()); - 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(), 'g', QLocale::FloatingPointShortest); - break; - case QMetaType::Double: - *str = QString::number(d->get(), 'g', QLocale::FloatingPointShortest); - break; -#if QT_CONFIG(datestring) - case QMetaType::QDate: - *str = d->get().toString(Qt::ISODate); - break; - case QMetaType::QTime: - *str = d->get().toString(Qt::ISODateWithMs); - break; - case QMetaType::QDateTime: - *str = d->get().toString(Qt::ISODateWithMs); - break; -#endif - case QMetaType::Bool: - *str = d->get() ? QStringLiteral("true") : QStringLiteral("false"); - break; - case QMetaType::QByteArray: - *str = QString::fromUtf8(d->get().constData()); - break; - case QMetaType::QStringList: - if (d->get().count() == 1) - *str = d->get().at(0); - break; -#ifndef QT_BOOTSTRAPPED - case QMetaType::QUrl: - *str = d->get().toString(); - break; - case QMetaType::QJsonValue: - if (d->get().isString()) - *str = d->get().toString(); - else if (!d->get().isNull()) - return false; - break; - case QMetaType::QCborValue: - if (d->get().isContainer() || d->get().isTag()) - return false; - *str = d->get().toVariant().toString(); - break; -#endif - case QMetaType::QUuid: - *str = d->get().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(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(result); - switch (d->typeId()) { - case QMetaType::QSizeF: - *s = d->get().toSize(); - break; - default: - return false; - } - break; - } - - case QMetaType::QSizeF: { - QSizeF *s = static_cast(result); - switch (d->typeId()) { - case QMetaType::QSize: - *s = QSizeF(d->get()); - break; - default: - return false; - } - break; - } - - case QMetaType::QLine: { - QLine *s = static_cast(result); - switch (d->typeId()) { - case QMetaType::QLineF: - *s = d->get().toLine(); - break; - default: - return false; - } - break; - } - - case QMetaType::QLineF: { - QLineF *s = static_cast(result); - switch (d->typeId()) { - case QMetaType::QLine: - *s = QLineF(d->get()); - break; - default: - return false; - } - break; - } -#endif - case QMetaType::QStringList: - if (d->typeId() == QMetaType::QVariantList) { - QStringList *slst = static_cast(result); - const QVariantList &list = d->get(); - 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(result); - *slst = QStringList(d->get()); - } else { - return false; - } - break; - case QMetaType::QDate: { - QDate *dt = static_cast(result); - if (d->typeId() == QMetaType::QDateTime) - *dt = d->get().date(); -#if QT_CONFIG(datestring) - else if (d->typeId() == QMetaType::QString) - *dt = QDate::fromString(d->get(), Qt::ISODate); -#endif - else - return false; - - return dt->isValid(); - } - case QMetaType::QTime: { - QTime *t = static_cast(result); - switch (d->typeId()) { - case QMetaType::QDateTime: - *t = d->get().time(); - break; -#if QT_CONFIG(datestring) - case QMetaType::QString: - *t = QTime::fromString(d->get(), 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(result); - switch (d->typeId()) { -#if QT_CONFIG(datestring) - case QMetaType::QString: - *dt = QDateTime::fromString(d->get(), Qt::ISODate); - break; -# ifndef QT_BOOTSTRAPPED - case QMetaType::QCborValue: - if (d->get().isDateTime()) - *dt = d->get().toDateTime(); - else - return false; - break; -# endif #endif - case QMetaType::QDate: - *dt = d->get().startOfDay(); - break; - default: - return false; - } - return dt->isValid(); + return false; } case QMetaType::QByteArray: { - QByteArray *ba = static_cast(result); - switch (d->typeId()) { - case QMetaType::QString: - *ba = d->get().toUtf8(); - break; - case QMetaType::Double: - *ba = QByteArray::number(d->get(), 'g', QLocale::FloatingPointShortest); - break; - case QMetaType::Float: - *ba = QByteArray::number(d->get(), 'g', QLocale::FloatingPointShortest); - break; - case QMetaType::Char: - case QMetaType::SChar: - case QMetaType::UChar: - *ba = QByteArray(1, d->get()); - 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() ? "true" : "false"); - break; - case QMetaType::QUuid: - *ba = d->get().toByteArray(); - break; - case QMetaType::Nullptr: - *ba = QByteArray(); - break; -#ifndef QT_BOOTSTRAPPED - case QMetaType::QCborValue: - if (d->get().isByteArray()) - *ba = d->get().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(result); + *ba = en.valueToKey(qConvertToNumber(d, &ok)); + return ok; } +#endif + return false; } - break; case QMetaType::Short: *static_cast(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(result); - const QStringList &slist = d->get(); - 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().isArray()) - return false; - *static_cast(result) = d->get().toArray().toVariantList(); - } else if (d->typeId() == QMetaType::QCborArray) { - *static_cast(result) = d->get().toVariantList(); - } else if (d->typeId() == QMetaType::QJsonValue) { - if (!d->get().isArray()) - return false; - *static_cast(result) = d->get().toArray().toVariantList(); - } else if (d->typeId() == QMetaType::QJsonArray) { - *static_cast(result) = d->get().toVariantList(); -#endif - } else { - return false; - } - break; - case QMetaType::QVariantMap: - if (d->typeId() == QMetaType::QVariantHash) { - QVariantMap *map = static_cast(result); - const QVariantHash &hash = d->get(); - 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().isMap()) - return false; - *static_cast(result) = d->get().toMap().toVariantMap(); - } else if (d->typeId() == QMetaType::QCborMap) { - *static_cast(result) = d->get().toVariantMap(); - } else if (d->typeId() == QMetaType::QJsonValue) { - if (!d->get().isObject()) - return false; - *static_cast(result) = d->get().toObject().toVariantMap(); - } else if (d->typeId() == QMetaType::QJsonObject) { - *static_cast(result) = d->get().toVariantMap(); -#endif - } else { - return false; - } - break; - case QMetaType::QVariantHash: - if (d->typeId() == QMetaType::QVariantMap) { - QVariantHash *hash = static_cast(result); - const QVariantMap &map = d->get(); - 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().isMap()) - return false; - *static_cast(result) = d->get().toMap().toVariantHash(); - } else if (d->typeId() == QMetaType::QCborMap) { - *static_cast(result) = d->get().toVariantHash(); - } else if (d->typeId() == QMetaType::QJsonValue) { - if (!d->get().isObject()) - return false; - *static_cast(result) = d->get().toObject().toVariantHash(); - } else if (d->typeId() == QMetaType::QJsonObject) { - *static_cast(result) = d->get().toVariantHash(); -#endif - } else { - return false; - } - break; -#ifndef QT_NO_GEOM_VARIANT - case QMetaType::QRect: - if (d->typeId() == QMetaType::QRectF) - *static_cast(result) = d->get().toRect(); - else - return false; - break; - case QMetaType::QRectF: - if (d->typeId() == QMetaType::QRect) - *static_cast(result) = d->get(); - else - return false; - break; - case QMetaType::QPointF: - if (d->typeId() == QMetaType::QPoint) - *static_cast(result) = d->get(); - else - return false; - break; - case QMetaType::QPoint: - if (d->typeId() == QMetaType::QPointF) - *static_cast(result) = d->get().toPoint(); - else - return false; - break; case QMetaType::Char: { *static_cast(result) = qint8(qConvertToNumber(d, &ok)); return ok; } -#endif - case QMetaType::QUuid: - switch (d->typeId()) { - case QMetaType::QString: - *static_cast(result) = QUuid(d->get()); - break; - case QMetaType::QByteArray: - *static_cast(result) = QUuid(d->get()); - break; -#ifndef QT_BOOTSTRAPPED - case QMetaType::QCborValue: - if (!d->get().isUuid()) - return false; - *static_cast(result) = d->get().toUuid(); - break; -#endif - default: - return false; - } - break; case QMetaType::Nullptr: *static_cast(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().isRegularExpression()) - return false; - *static_cast(result) = d->get().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(result) = QJsonArray::fromStringList(d->get()); - break; - case QMetaType::QVariantList: - *static_cast(result) = QJsonArray::fromVariantList(d->get()); - break; - case QMetaType::QJsonValue: - if (!d->get().isArray()) - return false; - *static_cast(result) = d->get().toArray(); - break; - case QMetaType::QJsonDocument: - if (!d->get().isArray()) - return false; - *static_cast(result) = d->get().array(); - break; - case QMetaType::QCborValue: - if (!d->get().isArray()) - return false; - *static_cast(result) = d->get().toArray().toJsonArray(); - break; - case QMetaType::QCborArray: - *static_cast(result) = d->get().toJsonArray(); - break; - default: - return false; - } - break; - case QMetaType::QJsonObject: - switch (d->typeId()) { - case QMetaType::QVariantMap: - *static_cast(result) = QJsonObject::fromVariantMap(d->get()); - break; - case QMetaType::QVariantHash: - *static_cast(result) = QJsonObject::fromVariantHash(d->get()); - break; - case QMetaType::QJsonValue: - if (!d->get().isObject()) - return false; - *static_cast(result) = d->get().toObject(); - break; - case QMetaType::QJsonDocument: - if (d->get().isArray()) - return false; - *static_cast(result) = d->get().object(); - break; - case QMetaType::QCborValue: - if (!d->get().isMap()) - return false; - *static_cast(result) = d->get().toMap().toJsonObject(); - break; - case QMetaType::QCborMap: - *static_cast(result) = d->get().toJsonObject(); - break; - default: - return false; - } - break; - case QMetaType::QCborSimpleType: + case QMetaType::QCborSimpleType: if (d->typeId() == QMetaType::QCborValue && d->get().isSimpleType()) { *static_cast(result) = d->get().toSimpleType(); break; @@ -1173,23 +682,6 @@ static bool convert(const QVariant::Private *d, int t, void *result) case QMetaType::QUrl: *static_cast(result) = QCborValue(d->get()); break; -#if QT_CONFIG(regularexpression) - case QMetaType::QRegularExpression: - *static_cast(result) = QCborValue(d->get()); - break; -#endif - case QMetaType::QUuid: - *static_cast(result) = QCborValue(d->get()); - break; - case QMetaType::QVariantList: - *static_cast(result) = QCborArray::fromVariantList(d->get()); - break; - case QMetaType::QVariantMap: - *static_cast(result) = QCborMap::fromVariantMap(d->get()); - break; - case QMetaType::QVariantHash: - *static_cast(result) = QCborMap::fromVariantHash(d->get()); - break; case QMetaType::QJsonValue: *static_cast(result) = QCborValue::fromJsonValue(d->get()); 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(result) = QCborArray::fromStringList(d->get()); - break; - case QMetaType::QVariantList: - *static_cast(result) = QCborArray::fromVariantList(d->get()); - break; - case QMetaType::QCborValue: - if (!d->get().isArray()) - return false; - *static_cast(result) = d->get().toArray(); - break; - case QMetaType::QJsonDocument: - if (!d->get().isArray()) - return false; - *static_cast(result) = QCborArray::fromJsonArray(d->get().array()); - break; - case QMetaType::QJsonValue: - if (!d->get().isArray()) - return false; - *static_cast(result) = QCborArray::fromJsonArray(d->get().toArray()); - break; - case QMetaType::QJsonArray: - *static_cast(result) = QCborArray::fromJsonArray(d->get()); - break; - default: - return false; - } - break; - case QMetaType::QCborMap: - switch (d->typeId()) { - case QMetaType::QVariantMap: - *static_cast(result) = QCborMap::fromVariantMap(d->get()); - break; - case QMetaType::QVariantHash: - *static_cast(result) = QCborMap::fromVariantHash(d->get()); - break; - case QMetaType::QCborValue: - if (!d->get().isMap()) - return false; - *static_cast(result) = d->get().toMap(); - break; - case QMetaType::QJsonDocument: - if (d->get().isArray()) - return false; - *static_cast(result) = QCborMap::fromJsonObject(d->get().object()); - break; - case QMetaType::QJsonValue: - if (!d->get().isObject()) - return false; - *static_cast(result) = QCborMap::fromJsonObject(d->get().toObject()); - break; - case QMetaType::QJsonObject: - *static_cast(result) = QCborMap::fromJsonObject(d->get()); - break; - default: - return false; - } - break; #endif default: diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index c2c8d3f431..c1fa8b0a9a 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -3432,17 +3432,12 @@ void tst_QVariant::moreCustomTypes() // Float is converted to double, adding insignificant bits PLAY_WITH_VARIANT(12.12f, false, "12.119999885559082", 12.12f, true); - PLAY_WITH_VARIANT('a', false, "a", 'a', true); - PLAY_WITH_VARIANT((unsigned char)('a'), false, "a", 'a', true); - PLAY_WITH_VARIANT( quint8(12), false, "\xc", 12, true); - PLAY_WITH_VARIANT( qint8(13), false, "\xd", 13, true); PLAY_WITH_VARIANT(quint16(14), false, "14", 14, true); PLAY_WITH_VARIANT( qint16(15), false, "15", 15, true); PLAY_WITH_VARIANT(quint32(16), false, "16", 16, true); PLAY_WITH_VARIANT( qint32(17), false, "17", 17, true); PLAY_WITH_VARIANT(quint64(18), false, "18", 18, true); PLAY_WITH_VARIANT( qint64(19), false, "19", 19, true); - PLAY_WITH_VARIANT( qint8(-12), false, QLatin1String("\xf4"), -12, true); // qint8 is char, so it gets converted via QChar PLAY_WITH_VARIANT( qint16(-13), false, "-13", -13, true); PLAY_WITH_VARIANT( qint32(-14), false, "-14", -14, true); PLAY_WITH_VARIANT( qint64(-15), false, "-15", -15, true); -- cgit v1.2.3