diff options
author | Ahmad Samir <a.samirh78@gmail.com> | 2023-03-22 00:02:23 +0200 |
---|---|---|
committer | Ahmad Samir <a.samirh78@gmail.com> | 2023-07-22 22:29:31 +0200 |
commit | 9bc43ba1c69076a4107dd537e269a026c7177384 (patch) | |
tree | dbaee47fdc53d4bf7b4ea259923dec362f3d3e20 | |
parent | 62d1ebe465fb0314daeefb2cfe6f1470817a5365 (diff) |
QLocaleData:: port bytearray/stringTo{U}LongLong to QSimpleParsedNumber
Change-Id: I97fe38d9b676cf92003a7323ebb5f56b9b79abad
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
-rw-r--r-- | src/corelib/text/qbytearray.cpp | 14 | ||||
-rw-r--r-- | src/corelib/text/qlocale.cpp | 56 | ||||
-rw-r--r-- | src/corelib/text/qlocale_p.h | 15 | ||||
-rw-r--r-- | src/corelib/text/qstring.cpp | 8 | ||||
-rw-r--r-- | src/gui/util/qvalidator.cpp | 14 |
5 files changed, 54 insertions, 53 deletions
diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index 3766d68adc..7f8349131d 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -3746,10 +3746,9 @@ auto QtPrivate::toSignedInteger(QByteArrayView data, int base) -> ParsedNumber<q if (data.isEmpty()) return {}; - bool ok = false; - const auto i = QLocaleData::bytearrayToLongLong(data, base, &ok); - if (ok) - return ParsedNumber(i); + const QSimpleParsedNumber r = QLocaleData::bytearrayToLongLong(data, base); + if (r.ok()) + return ParsedNumber(r.result); return {}; } @@ -3764,10 +3763,9 @@ auto QtPrivate::toUnsignedInteger(QByteArrayView data, int base) -> ParsedNumber if (data.isEmpty()) return {}; - bool ok = false; - const auto u = QLocaleData::bytearrayToUnsLongLong(data, base, &ok); - if (ok) - return ParsedNumber(u); + const QSimpleParsedNumber r = QLocaleData::bytearrayToUnsLongLong(data, base); + if (r.ok()) + return ParsedNumber(r.result); return {}; } diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp index 87a6585421..0ba597f742 100644 --- a/src/corelib/text/qlocale.cpp +++ b/src/corelib/text/qlocale.cpp @@ -1363,12 +1363,16 @@ T toIntegral_helper(const QLocalePrivate *d, QStringView str, bool *ok) constexpr bool isUnsigned = std::is_unsigned_v<T>; using Int64 = typename std::conditional_t<isUnsigned, quint64, qint64>; - Int64 val = 0; + QSimpleParsedNumber<Int64> r{}; if constexpr (isUnsigned) - val = d->m_data->stringToUnsLongLong(str, 10, ok, d->m_numberOptions); + r = d->m_data->stringToUnsLongLong(str, 10, d->m_numberOptions); else - val = d->m_data->stringToLongLong(str, 10, ok, d->m_numberOptions); + r = d->m_data->stringToLongLong(str, 10, d->m_numberOptions); + if (ok) + *ok = r.ok(); + + Int64 val = r.result; if (T(val) != val) { if (ok != nullptr) *ok = false; @@ -4311,30 +4315,26 @@ double QLocaleData::stringToDouble(QStringView str, bool *ok, return r.result; } -qlonglong QLocaleData::stringToLongLong(QStringView str, int base, bool *ok, - QLocale::NumberOptions number_options) const +QSimpleParsedNumber<qint64> +QLocaleData::stringToLongLong(QStringView str, int base, + QLocale::NumberOptions number_options) const { CharBuff buff; - if (!numberToCLocale(str, number_options, IntegerMode, &buff)) { - if (ok != nullptr) - *ok = false; - return 0; - } + if (!numberToCLocale(str, number_options, IntegerMode, &buff)) + return {}; - return bytearrayToLongLong(QByteArrayView(buff.constData(), buff.size()), base, ok); + return bytearrayToLongLong(QByteArrayView(buff), base); } -qulonglong QLocaleData::stringToUnsLongLong(QStringView str, int base, bool *ok, - QLocale::NumberOptions number_options) const +QSimpleParsedNumber<quint64> +QLocaleData::stringToUnsLongLong(QStringView str, int base, + QLocale::NumberOptions number_options) const { CharBuff buff; - if (!numberToCLocale(str, number_options, IntegerMode, &buff)) { - if (ok != nullptr) - *ok = false; - return 0; - } + if (!numberToCLocale(str, number_options, IntegerMode, &buff)) + return {}; - return bytearrayToUnsLongLong(QByteArrayView(buff.constData(), buff.size()), base, ok); + return bytearrayToUnsLongLong(QByteArrayView(buff), base); } static bool checkParsed(QByteArrayView num, qsizetype used) @@ -4355,22 +4355,20 @@ static bool checkParsed(QByteArrayView num, qsizetype used) return true; } -qlonglong QLocaleData::bytearrayToLongLong(QByteArrayView num, int base, bool *ok) +QSimpleParsedNumber<qint64> QLocaleData::bytearrayToLongLong(QByteArrayView num, int base) { auto r = qstrntoll(num.data(), num.size(), base); - const bool parsed = checkParsed(num, r.used); - if (ok) - *ok = parsed; - return parsed ? r.result : 0; + if (!checkParsed(num, r.used)) + return {}; + return r; } -qulonglong QLocaleData::bytearrayToUnsLongLong(QByteArrayView num, int base, bool *ok) +QSimpleParsedNumber<quint64> QLocaleData::bytearrayToUnsLongLong(QByteArrayView num, int base) { auto r = qstrntoull(num.data(), num.size(), base); - const bool parsed = checkParsed(num, r.used); - if (ok) - *ok = parsed; - return parsed ? r.result : 0; + if (!checkParsed(num, r.used)) + return {}; + return r; } /*! diff --git a/src/corelib/text/qlocale_p.h b/src/corelib/text/qlocale_p.h index 45983e9cd5..6c1826c846 100644 --- a/src/corelib/text/qlocale_p.h +++ b/src/corelib/text/qlocale_p.h @@ -321,15 +321,16 @@ public: [[nodiscard]] double stringToDouble(QStringView str, bool *ok, QLocale::NumberOptions options) const; - [[nodiscard]] qint64 stringToLongLong(QStringView str, int base, bool *ok, - QLocale::NumberOptions options) const; - [[nodiscard]] quint64 stringToUnsLongLong(QStringView str, int base, bool *ok, - QLocale::NumberOptions options) const; + [[nodiscard]] QSimpleParsedNumber<qint64> + stringToLongLong(QStringView str, int base, QLocale::NumberOptions options) const; + [[nodiscard]] QSimpleParsedNumber<quint64> + stringToUnsLongLong(QStringView str, int base, QLocale::NumberOptions options) const; // this function is used in QIntValidator (QtGui) - [[nodiscard]] Q_CORE_EXPORT static qint64 bytearrayToLongLong(QByteArrayView num, int base, - bool *ok); - [[nodiscard]] static quint64 bytearrayToUnsLongLong(QByteArrayView num, int base, bool *ok); + [[nodiscard]] Q_CORE_EXPORT + static QSimpleParsedNumber<qint64> bytearrayToLongLong(QByteArrayView num, int base); + [[nodiscard]] static QSimpleParsedNumber<quint64> + bytearrayToUnsLongLong(QByteArrayView num, int base); [[nodiscard]] bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options, NumberMode mode, CharBuff *result) const; diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index 55bb99087b..4daca106ae 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -7392,10 +7392,14 @@ static Int toIntegral(QStringView string, bool *ok, int base) QVarLengthArray<uchar> latin1(string.size()); qt_to_latin1(latin1.data(), string.utf16(), string.size()); + QSimpleParsedNumber<Int> r; if constexpr (std::is_signed_v<Int>) - return QLocaleData::bytearrayToLongLong(latin1, base, ok); + r = QLocaleData::bytearrayToLongLong(latin1, base); else - return QLocaleData::bytearrayToUnsLongLong(latin1, base, ok); + r = QLocaleData::bytearrayToUnsLongLong(latin1, base); + if (ok) + *ok = r.ok(); + return r.result; } qlonglong QString::toIntegral_helper(QStringView string, bool *ok, int base) diff --git a/src/gui/util/qvalidator.cpp b/src/gui/util/qvalidator.cpp index 4f788c5190..079c0dedc3 100644 --- a/src/gui/util/qvalidator.cpp +++ b/src/gui/util/qvalidator.cpp @@ -397,12 +397,13 @@ QValidator::State QIntValidator::validate(QString & input, int&) const return *opt; const CharBuff &buff = result.buff; - bool ok; - qlonglong entered = QLocaleData::bytearrayToLongLong(buff, 10, &ok); - if (!ok) + QSimpleParsedNumber r = QLocaleData::bytearrayToLongLong(buff, 10); + if (!r.ok()) return Invalid; + qint64 entered = r.result; if (entered >= b && entered <= t) { + bool ok = false; locale().toInt(input, &ok); return ok ? Acceptable : Intermediate; } @@ -433,10 +434,9 @@ void QIntValidator::fixup(QString &input) const if (parseState == ParsingResult::Invalid) return; - bool ok; - qlonglong entered = QLocaleData::bytearrayToLongLong(buff, 10, &ok); - if (ok) - input = locale().toString(entered); + QSimpleParsedNumber r = QLocaleData::bytearrayToLongLong(buff, 10); + if (r.ok()) + input = locale().toString(r.result); } /*! |