summaryrefslogtreecommitdiffstats
path: root/src/corelib/text/qlocale.cpp
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/qlocale.cpp
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/qlocale.cpp')
-rw-r--r--src/corelib/text/qlocale.cpp66
1 files changed, 19 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.