summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAhmad Samir <a.samirh78@gmail.com>2023-03-22 00:02:23 +0200
committerAhmad Samir <a.samirh78@gmail.com>2023-07-22 22:29:31 +0200
commit9bc43ba1c69076a4107dd537e269a026c7177384 (patch)
treedbaee47fdc53d4bf7b4ea259923dec362f3d3e20
parent62d1ebe465fb0314daeefb2cfe6f1470817a5365 (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.cpp14
-rw-r--r--src/corelib/text/qlocale.cpp56
-rw-r--r--src/corelib/text/qlocale_p.h15
-rw-r--r--src/corelib/text/qstring.cpp8
-rw-r--r--src/gui/util/qvalidator.cpp14
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);
}
/*!