summaryrefslogtreecommitdiffstats
path: root/src/corelib/text
diff options
context:
space:
mode:
authorEdward Welbourne <edward.welbourne@qt.io>2020-10-13 13:25:55 +0200
committerEdward Welbourne <edward.welbourne@qt.io>2020-11-08 03:14:11 +0100
commit8bf36025f5602e3067448941ee4d0ccca3928a40 (patch)
tree182bae6101fba03aa56a0e5e0a2e095b3bb2b5b1 /src/corelib/text
parentd11bf5fc2435819605695722d82f7af6ad70bc8b (diff)
Add some inline methods to make code more readable
Give QLocaleId matchesAny() and isValid() checks and some acceptance tests for their use as filters. Give QLocaleData a QLocaleId id(). A few messy pieces of code get easier to read. In the process, greatly simplify a do-while loop (sacrificing some pretest-before-loop optimizations - benchmarking shows they made negligible difference) and change a while loop to match its form, since it was doing essentially the same iteration and (thus) its condition was guaranteed true on the first iteration. Change-Id: I36b1a6ca8a3cf350b3f3abbe75b177e5a7637cd8 Reviewed-by: Andrei Golubev <andrei.golubev@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/corelib/text')
-rw-r--r--src/corelib/text/qlocale.cpp66
-rw-r--r--src/corelib/text/qlocale_p.h24
2 files changed, 43 insertions, 47 deletions
diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp
index 1ac7742593..7438ed2e61 100644
--- a/src/corelib/text/qlocale.cpp
+++ b/src/corelib/text/qlocale.cpp
@@ -331,8 +331,7 @@ QByteArray QLocalePrivate::bcp47Name(char separator) const
if (m_data->m_language_id == QLocale::C)
return QByteArrayLiteral("en");
- QLocaleId localeId { m_data->m_language_id, m_data->m_script_id, m_data->m_country_id };
- return localeId.withLikelySubtagsRemoved().name(separator);
+ return m_data->id().withLikelySubtagsRemoved().name(separator);
}
/*!
@@ -360,40 +359,13 @@ static const QLocaleData *findLocaleDataById(const QLocaleId &localeId)
return locale_data;
const QLocaleData *data = locale_data + idx;
- Q_ASSERT(localeId.language_id
- ? data->m_language_id == localeId.language_id
- : data->m_language_id);
+ Q_ASSERT(localeId.acceptLanguage(data->m_language_id));
- if (localeId.script_id == QLocale::AnyScript && localeId.country_id == QLocale::AnyCountry)
- return data;
-
- if (localeId.script_id == QLocale::AnyScript) {
- do {
- if (data->m_country_id == localeId.country_id)
- return data;
- ++data;
- } while (localeId.language_id
- ? data->m_language_id == localeId.language_id
- : data->m_language_id);
- } else if (localeId.country_id == QLocale::AnyCountry) {
- do {
- if (data->m_script_id == localeId.script_id)
- return data;
- ++data;
- } while (localeId.language_id
- ? data->m_language_id == localeId.language_id
- : data->m_language_id);
- } else {
- do {
- if (data->m_script_id == localeId.script_id
- && data->m_country_id == localeId.country_id) {
- return data;
- }
- ++data;
- } while (localeId.language_id
- ? data->m_language_id == localeId.language_id
- : data->m_language_id);
- }
+ do {
+ if (localeId.acceptScriptCountry(data->id()))
+ return data;
+ ++data;
+ } while (localeId.acceptLanguage(data->m_language_id));
return nullptr;
}
@@ -2516,28 +2488,28 @@ QList<QLocale> QLocale::matchingLocales(QLocale::Language language,
QLocale::Script script,
QLocale::Country country)
{
- if (uint(language) > QLocale::LastLanguage || uint(script) > QLocale::LastScript ||
- uint(country) > QLocale::LastCountry)
+ const QLocaleId filter { language, script, country };
+ if (!filter.isValid())
return QList<QLocale>();
if (language == QLocale::C)
return QList<QLocale>() << QLocale(QLocale::C);
QList<QLocale> result;
- if (language == QLocale::AnyLanguage && script == QLocale::AnyScript
- && country == QLocale::AnyCountry) {
+ if (filter.matchesAll())
result.reserve(locale_data_size);
- }
+
const QLocaleData *data = locale_data + locale_index[language];
- while ( (data != locale_data + locale_data_size)
- && (language == QLocale::AnyLanguage || data->m_language_id == uint(language))) {
- if ((script == QLocale::AnyScript || data->m_script_id == uint(script))
- && (country == QLocale::AnyCountry || data->m_country_id == uint(country))) {
- result.append(QLocale(*(data->m_language_id == C ? c_private()
+ Q_ASSERT(filter.acceptLanguage(data->m_language_id));
+ do {
+ const QLocaleId id = data->id();
+ if (filter.acceptScriptCountry(id)) {
+ result.append(QLocale(*(id.language_id == C ? c_private()
: QLocalePrivate::create(data))));
}
++data;
- }
+ // Only the terminating entry in locale_data has 0 as language_id:
+ } while (filter.acceptLanguage(data->m_language_id));
return result;
}
@@ -4204,7 +4176,7 @@ QStringList QLocale::uiLanguages() const
}
const auto data = locale.d->m_data;
- QLocaleId id { data->m_language_id, data->m_script_id, data->m_country_id };
+ QLocaleId id = data->id();
const QLocaleId max = id.withLikelySubtagsAdded();
const QLocaleId min = max.withLikelySubtagsRemoved();
id.script_id = 0; // For re-use as script-less variant.
diff --git a/src/corelib/text/qlocale_p.h b/src/corelib/text/qlocale_p.h
index fec7517111..8943edddb8 100644
--- a/src/corelib/text/qlocale_p.h
+++ b/src/corelib/text/qlocale_p.h
@@ -152,6 +152,27 @@ struct QLocaleId
{ return language_id == other.language_id && script_id == other.script_id && country_id == other.country_id; }
inline bool operator!=(QLocaleId other) const
{ return !operator==(other); }
+ inline bool isValid() const
+ {
+ return language_id <= QLocale::LastLanguage && script_id <= QLocale::LastScript
+ && country_id <= QLocale::LastCountry;
+ }
+ inline bool matchesAll() const
+ {
+ return !language_id && !script_id && !country_id;
+ }
+ // Use as: filter.accept...(candidate)
+ inline bool acceptLanguage(quint16 lang) const
+ {
+ // Always reject AnyLanguage (only used for last entry in locale_data array).
+ // So, when searching for AnyLanguage, accept everything *but* AnyLanguage.
+ return language_id ? lang == language_id : lang;
+ }
+ inline bool acceptScriptCountry(QLocaleId other) const
+ {
+ return (!country_id || other.country_id == country_id)
+ && (!script_id || other.script_id == script_id);
+ }
QLocaleId withLikelySubtagsAdded() const;
QLocaleId withLikelySubtagsRemoved() const;
@@ -270,6 +291,9 @@ public:
Q_CORE_EXPORT bool validateChars(QStringView str, NumberMode numMode, QByteArray *buff, int decDigits = -1,
QLocale::NumberOptions number_options = QLocale::DefaultNumberOptions) const;
+ // Access to assorted data members:
+ QLocaleId id() const { return QLocaleId { m_language_id, m_script_id, m_country_id }; }
+
QString decimalPoint() const;
QString groupSeparator() const;
QString listSeparator() const;