From da6efbb12b8ace783c8dcc8e43c34c7269410829 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 4 Nov 2022 18:03:36 -0700 Subject: 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 --- src/corelib/kernel/qvariant.cpp | 71 ++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 40 deletions(-) (limited to 'src/corelib/kernel/qvariant.cpp') 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(); + case 2: + return d->get(); + case 4: + return d->get(); + case 8: + return d->get(); + } + 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(); case QMetaType::LongLong: - return d->get(); case QMetaType::Char: - return qlonglong(d->get()); case QMetaType::SChar: - return qlonglong(d->get()); case QMetaType::Short: - return qlonglong(d->get()); case QMetaType::Long: - return qlonglong(d->get()); + return qMetaTypeNumberBySize(d); case QMetaType::Float: return qRound64(d->get()); case QMetaType::Double: @@ -86,32 +93,28 @@ static qlonglong qMetaTypeNumber(const QVariant::Private *d) return d->get().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(); - case QMetaType::ULongLong: - return d->get(); - case QMetaType::UChar: + switch (d->typeInterface()->size) { + case 1: return d->get(); - case QMetaType::UShort: + case 2: return d->get(); - case QMetaType::ULong: - return d->get(); + case 4: + return d->get(); + case 8: + return d->get(); } - Q_ASSERT(false); - return 0; + Q_UNREACHABLE_RETURN(0); } static std::optional 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(); if (qlonglong l = s.toLongLong(&ok); ok) @@ -156,24 +159,12 @@ static std::optional 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(); - case 2: - return d->get(); - case 4: - return d->get(); - case 8: - return d->get(); - } - } + if (d->typeInterface()->flags & QMetaType::IsEnumeration + || d->typeInterface()->typeId == QMetaType::QCborSimpleType) + return qMetaTypeNumberBySize(d); return std::nullopt; } @@ -181,7 +172,7 @@ static std::optional qConvertToNumber(const QVariant::Private *d, boo static std::optional qConvertToRealNumber(const QVariant::Private *d) { bool ok; - switch (uint(d->type().id())) { + switch (d->typeInterface()->typeId) { case QMetaType::QString: if (double r = d->get().toDouble(&ok); ok) return qreal(r); -- cgit v1.2.3