diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2022-11-04 18:03:36 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2022-11-09 04:05:50 -0700 |
commit | da6efbb12b8ace783c8dcc8e43c34c7269410829 (patch) | |
tree | 9922776b71a568a1b748266f9231804e141826bd /src/corelib/kernel/qvariant.cpp | |
parent | 8a3a87d13c39d4540801d9b6833af07db8dc8051 (diff) |
QVariant: simplify getting integer contents by using the type size
This reduces the chances of mistakes in forgetting a type. Plus, this
makes it easier to add char16_t and char32_t.
Drive-by change some type().id() code that doesn't need the ID for user
types to typeInterface()->typeId.
Change-Id: I3d74c753055744deb8acfffd17248aa81bf8ce55
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/corelib/kernel/qvariant.cpp')
-rw-r--r-- | src/corelib/kernel/qvariant.cpp | 71 |
1 files changed, 31 insertions, 40 deletions
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index a7d95174f4..91a17335fd 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -57,24 +57,31 @@ using namespace Qt::StringLiterals; namespace { // anonymous used to hide QVariant handlers -/*! - \internal - */ +static qlonglong qMetaTypeNumberBySize(const QVariant::Private *d) +{ + switch (d->typeInterface()->size) { + case 1: + return d->get<signed char>(); + case 2: + return d->get<short>(); + case 4: + return d->get<int>(); + case 8: + return d->get<qlonglong>(); + } + Q_UNREACHABLE_RETURN(0); +} + static qlonglong qMetaTypeNumber(const QVariant::Private *d) { - switch (d->type().id()) { + switch (d->typeInterface()->typeId) { case QMetaType::Int: - return d->get<int>(); case QMetaType::LongLong: - return d->get<qlonglong>(); case QMetaType::Char: - return qlonglong(d->get<char>()); case QMetaType::SChar: - return qlonglong(d->get<signed char>()); case QMetaType::Short: - return qlonglong(d->get<short>()); case QMetaType::Long: - return qlonglong(d->get<long>()); + return qMetaTypeNumberBySize(d); case QMetaType::Float: return qRound64(d->get<float>()); case QMetaType::Double: @@ -86,32 +93,28 @@ static qlonglong qMetaTypeNumber(const QVariant::Private *d) return d->get<QCborValue>().toInteger(); #endif } - Q_ASSERT(false); - return 0; + Q_UNREACHABLE_RETURN(0); } static qulonglong qMetaTypeUNumber(const QVariant::Private *d) { - switch (d->type().id()) { - case QMetaType::UInt: - return d->get<unsigned int>(); - case QMetaType::ULongLong: - return d->get<qulonglong>(); - case QMetaType::UChar: + switch (d->typeInterface()->size) { + case 1: return d->get<unsigned char>(); - case QMetaType::UShort: + case 2: return d->get<unsigned short>(); - case QMetaType::ULong: - return d->get<unsigned long>(); + case 4: + return d->get<unsigned int>(); + case 8: + return d->get<qulonglong>(); } - Q_ASSERT(false); - return 0; + Q_UNREACHABLE_RETURN(0); } static std::optional<qlonglong> qConvertToNumber(const QVariant::Private *d, bool allowStringToBool = false) { bool ok; - switch (uint(d->type().id())) { + switch (d->typeInterface()->typeId) { case QMetaType::QString: { const QString &s = d->get<QString>(); if (qlonglong l = s.toLongLong(&ok); ok) @@ -156,24 +159,12 @@ static std::optional<qlonglong> qConvertToNumber(const QVariant::Private *d, boo case QMetaType::UChar: case QMetaType::UShort: case QMetaType::ULong: - return qlonglong(qMetaTypeUNumber(d)); } - QMetaType typeInfo = d->type(); - if (typeInfo.flags() & QMetaType::IsEnumeration - || d->type().id() == QMetaType::QCborSimpleType) { - switch (typeInfo.sizeOf()) { - case 1: - return d->get<signed char>(); - case 2: - return d->get<short>(); - case 4: - return d->get<int>(); - case 8: - return d->get<qlonglong>(); - } - } + if (d->typeInterface()->flags & QMetaType::IsEnumeration + || d->typeInterface()->typeId == QMetaType::QCborSimpleType) + return qMetaTypeNumberBySize(d); return std::nullopt; } @@ -181,7 +172,7 @@ static std::optional<qlonglong> qConvertToNumber(const QVariant::Private *d, boo static std::optional<qreal> qConvertToRealNumber(const QVariant::Private *d) { bool ok; - switch (uint(d->type().id())) { + switch (d->typeInterface()->typeId) { case QMetaType::QString: if (double r = d->get<QString>().toDouble(&ok); ok) return qreal(r); |