Moved countries to singleton.

This commit is contained in:
23rd 2021-08-26 18:15:49 +03:00
parent a230e83778
commit 86aaa9673d
12 changed files with 71 additions and 49 deletions

View file

@ -10,6 +10,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace Countries { namespace Countries {
namespace { namespace {
auto SingleInstance = CountriesInstance();
const std::array<Info, 231> FallbackList = { { const std::array<Info, 231> FallbackList = { {
{ "Afghanistan", "AF", "93" }, { "Afghanistan", "AF", "93" },
{ "Albania", "AL", "355" }, { "Albania", "AL", "355" },
@ -244,40 +246,37 @@ const std::array<Info, 231> FallbackList = { {
{ "Zimbabwe", "ZW", "263" }, { "Zimbabwe", "ZW", "263" },
} }; } };
QHash<QString, const Info *> ByCode;
QHash<QString, const Info *> ByISO2;
} // namespace } // namespace
const std::array<Info, 231> &List() { const std::array<Info, 231> &CountriesInstance::list() {
return FallbackList; return FallbackList;
} }
const QHash<QString, const Info *> &InfoByCode() { const CountriesInstance::Map &CountriesInstance::byCode() {
if (ByCode.isEmpty()) { if (_byCode.empty()) {
ByCode.reserve(FallbackList.size()); _byCode.reserve(FallbackList.size());
for (const auto &entry : FallbackList) { for (const auto &entry : FallbackList) {
ByCode.insert(entry.code, &entry); _byCode.insert(entry.code, &entry);
} }
} }
return ByCode; return _byCode;
} }
const QHash<QString, const Info *> &InfoByISO2() { const CountriesInstance::Map &CountriesInstance::byISO2() {
if (ByISO2.isEmpty()) { if (_byISO2.empty()) {
ByISO2.reserve(FallbackList.size()); _byISO2.reserve(FallbackList.size());
for (const auto &entry : FallbackList) { for (const auto &entry : FallbackList) {
ByISO2.insert(entry.iso2, &entry); _byISO2.insert(entry.iso2, &entry);
} }
} }
return ByISO2; return _byISO2;
} }
QString ValidPhoneCode(QString fullCode) { QString CountriesInstance::validPhoneCode(QString fullCode) {
const auto &byCode = InfoByCode(); const auto &listByCode = byCode();
while (fullCode.length()) { while (fullCode.length()) {
const auto i = byCode.constFind(fullCode); const auto i = listByCode.constFind(fullCode);
if (i != byCode.cend()) { if (i != listByCode.cend()) {
return (*i)->code; return (*i)->code;
} }
fullCode.chop(1); fullCode.chop(1);
@ -285,17 +284,25 @@ QString ValidPhoneCode(QString fullCode) {
return QString(); return QString();
} }
QString CountryNameByISO2(const QString &iso) { QString CountriesInstance::countryNameByISO2(const QString &iso) {
const auto &byISO2 = InfoByISO2(); const auto &listByISO2 = byISO2();
const auto i = byISO2.constFind(iso); const auto i = listByISO2.constFind(iso);
return (i != byISO2.cend()) ? QString::fromUtf8((*i)->name) : QString(); return (i != listByISO2.cend())
? QString::fromUtf8((*i)->name)
: QString();
} }
QString CountryISO2ByPhone(const QString &phone) { QString CountriesInstance::countryISO2ByPhone(const QString &phone) {
const auto &byCode = InfoByCode(); const auto &listByCode = byCode();
const auto code = ValidPhoneCode(phone); const auto code = validPhoneCode(phone);
const auto i = byCode.find(code); const auto i = listByCode.find(code);
return (i != byCode.cend()) ? QString::fromUtf8((*i)->iso2) : QString(); return (i != listByCode.cend())
? QString::fromUtf8((*i)->iso2)
: QString();
}
CountriesInstance &Instance() {
return SingleInstance;
} }
} // namespace Countries } // namespace Countries

View file

@ -17,13 +17,26 @@ struct Info {
const char *alternativeName = nullptr; const char *alternativeName = nullptr;
}; };
[[nodiscard]] const std::array<Info, 231> &List(); class CountriesInstance final {
public:
using Map = QHash<QString, const Info *>;
[[nodiscard]] const QHash<QString, const Info *> &InfoByCode(); CountriesInstance() = default;
[[nodiscard]] const QHash<QString, const Info *> &InfoByISO2(); [[nodiscard]] const std::array<Info, 231> &list();
[[nodiscard]] QString ValidPhoneCode(QString fullCode); [[nodiscard]] const Map &byCode();
[[nodiscard]] QString CountryNameByISO2(const QString &iso); [[nodiscard]] const Map &byISO2();
[[nodiscard]] QString CountryISO2ByPhone(const QString &phone);
[[nodiscard]] QString validPhoneCode(QString fullCode);
[[nodiscard]] QString countryNameByISO2(const QString &iso);
[[nodiscard]] QString countryISO2ByPhone(const QString &phone);
private:
Map _byCode;
Map _byISO2;
};
CountriesInstance &Instance();
} // namespace Countries } // namespace Countries

View file

@ -54,7 +54,7 @@ using namespace ::Intro::details;
if (const auto parent if (const auto parent
= Core::App().domain().maybeLastOrSomeAuthedAccount()) { = Core::App().domain().maybeLastOrSomeAuthedAccount()) {
if (const auto session = parent->maybeSession()) { if (const auto session = parent->maybeSession()) {
const auto iso = Countries::CountryISO2ByPhone( const auto iso = Countries::Instance().countryISO2ByPhone(
session->user()->phone()); session->user()->phone());
if (!iso.isEmpty()) { if (!iso.isEmpty()) {
return iso; return iso;

View file

@ -123,7 +123,7 @@ EditDocumentScheme GetDocumentScheme(
using ValueClass = Scheme::ValueClass; using ValueClass = Scheme::ValueClass;
const auto DontFormat = nullptr; const auto DontFormat = nullptr;
const auto CountryFormat = [](const QString &value) { const auto CountryFormat = [](const QString &value) {
const auto result = Countries::CountryNameByISO2(value); const auto result = Countries::Instance().countryNameByISO2(value);
return result.isEmpty() ? value : result; return result.isEmpty() ? value : result;
}; };
const auto GenderFormat = [](const QString &value) { const auto GenderFormat = [](const QString &value) {
@ -322,7 +322,8 @@ EditDocumentScheme GetDocumentScheme(
if (!language.isEmpty()) { if (!language.isEmpty()) {
return tr::lng_passport_native_name_language_about(tr::now); return tr::lng_passport_native_name_language_about(tr::now);
} }
const auto name = Countries::CountryNameByISO2(countryCode); const auto name = Countries::Instance().countryNameByISO2(
countryCode);
Assert(!name.isEmpty()); Assert(!name.isEmpty());
return tr::lng_passport_native_name_about( return tr::lng_passport_native_name_about(
tr::now, tr::now,

View file

@ -520,7 +520,7 @@ void PanelEditDocument::createDetailsRow(
object_ptr<Ui::BoxContent> box) { object_ptr<Ui::BoxContent> box) {
controller->show(std::move(box)); controller->show(std::move(box));
}; };
const auto isoByPhone = Countries::CountryISO2ByPhone( const auto isoByPhone = Countries::Instance().countryISO2ByPhone(
_controller->bot()->session().user()->phone()); _controller->bot()->session().user()->phone());
const auto [it, ok] = _details.emplace( const auto [it, ok] = _details.emplace(

View file

@ -304,7 +304,7 @@ void AbstractTextRow<Input>::finishInnerAnimating() {
} }
QString CountryString(const QString &code) { QString CountryString(const QString &code) {
const auto name = Countries::CountryNameByISO2(code); const auto name = Countries::Instance().countryNameByISO2(code);
return name.isEmpty() ? tr::lng_passport_country_choose(tr::now) : name; return name.isEmpty() ? tr::lng_passport_country_choose(tr::now) : name;
} }
@ -383,7 +383,7 @@ void CountryRow::errorAnimationCallback() {
void CountryRow::chooseCountry() { void CountryRow::chooseCountry() {
const auto top = _value.current(); const auto top = _value.current();
const auto name = Countries::CountryNameByISO2(top); const auto name = Countries::Instance().countryNameByISO2(top);
const auto country = !name.isEmpty() const auto country = !name.isEmpty()
? top ? top
: !_defaultCountry.isEmpty() : !_defaultCountry.isEmpty()

View file

@ -465,7 +465,7 @@ QString Form::defaultPhone() const {
} }
QString Form::defaultCountry() const { QString Form::defaultCountry() const {
return Countries::CountryISO2ByPhone(defaultPhone()); return Countries::Instance().countryISO2ByPhone(defaultPhone());
} }
void Form::fillPaymentMethodInformation() { void Form::fillPaymentMethodInformation() {

View file

@ -189,7 +189,7 @@ struct SimpleFieldState {
[[nodiscard]] QString Parse(const FieldConfig &config) { [[nodiscard]] QString Parse(const FieldConfig &config) {
if (config.type == FieldType::Country) { if (config.type == FieldType::Country) {
return Countries::CountryNameByISO2(config.value); return Countries::Instance().countryNameByISO2(config.value);
} else if (config.type == FieldType::Money) { } else if (config.type == FieldType::Money) {
const auto amount = config.value.toLongLong(); const auto amount = config.value.toLongLong();
if (!amount) { if (!amount) {
@ -490,7 +490,8 @@ void Field::setupCountry() {
QObject::connect(_masked, &MaskedInputField::focused, [=] { QObject::connect(_masked, &MaskedInputField::focused, [=] {
setFocus(); setFocus();
const auto name = Countries::CountryNameByISO2(_countryIso2); const auto name = Countries::Instance().countryNameByISO2(
_countryIso2);
const auto country = !name.isEmpty() const auto country = !name.isEmpty()
? _countryIso2 ? _countryIso2
: !_config.defaultCountry.isEmpty() : !_config.defaultCountry.isEmpty()
@ -503,7 +504,7 @@ void Field::setupCountry() {
raw->countryChosen( raw->countryChosen(
) | rpl::start_with_next([=](QString iso2) { ) | rpl::start_with_next([=](QString iso2) {
_countryIso2 = iso2; _countryIso2 = iso2;
_masked->setText(Countries::CountryNameByISO2(iso2)); _masked->setText(Countries::Instance().countryNameByISO2(iso2));
_masked->hideError(); _masked->hideError();
raw->closeBox(); raw->closeBox();
if (!iso2.isEmpty()) { if (!iso2.isEmpty()) {

View file

@ -508,7 +508,7 @@ void FormSummary::setupSections(not_null<VerticalLayout*> layout) {
push(_information.shippingAddress.address2); push(_information.shippingAddress.address2);
push(_information.shippingAddress.city); push(_information.shippingAddress.city);
push(_information.shippingAddress.state); push(_information.shippingAddress.state);
push(Countries::CountryNameByISO2( push(Countries::Instance().countryNameByISO2(
_information.shippingAddress.countryIso2)); _information.shippingAddress.countryIso2));
push(_information.shippingAddress.postcode); push(_information.shippingAddress.postcode);
add( add(

View file

@ -174,7 +174,7 @@ CountrySelectBox::Inner::Inner(
, _rowHeight(st::countryRowHeight) { , _rowHeight(st::countryRowHeight) {
setAttribute(Qt::WA_OpaquePaintEvent); setAttribute(Qt::WA_OpaquePaintEvent);
const auto &byISO2 = Countries::InfoByISO2(); const auto &byISO2 = Countries::Instance().byISO2();
if (byISO2.contains(iso)) { if (byISO2.contains(iso)) {
LastValidISO = iso; LastValidISO = iso;
@ -188,7 +188,7 @@ CountrySelectBox::Inner::Inner(
if (lastValid) { if (lastValid) {
_list.emplace_back(lastValid); _list.emplace_back(lastValid);
} }
for (const auto &entry : Countries::List()) { for (const auto &entry : Countries::Instance().list()) {
if (&entry != lastValid) { if (&entry != lastValid) {
_list.emplace_back(&entry); _list.emplace_back(&entry);
} }

View file

@ -114,7 +114,7 @@ void CountryInput::onChooseCode(const QString &code) {
Ui::hideLayer(); Ui::hideLayer();
_chosenIso = QString(); _chosenIso = QString();
if (code.length()) { if (code.length()) {
const auto &byCode = Countries::InfoByCode(); const auto &byCode = Countries::Instance().byCode();
const auto i = byCode.constFind(code); const auto i = byCode.constFind(code);
if (i != byCode.cend()) { if (i != byCode.cend()) {
const auto info = *i; const auto info = *i;
@ -132,7 +132,7 @@ void CountryInput::onChooseCode(const QString &code) {
bool CountryInput::chooseCountry(const QString &iso) { bool CountryInput::chooseCountry(const QString &iso) {
Ui::hideLayer(); Ui::hideLayer();
const auto &byISO2 = Countries::InfoByISO2(); const auto &byISO2 = Countries::Instance().byISO2();
const auto i = byISO2.constFind(iso); const auto i = byISO2.constFind(iso);
const auto info = (i != byISO2.cend()) ? (*i) : nullptr; const auto info = (i != byISO2.cend()) ? (*i) : nullptr;

View file

@ -83,7 +83,7 @@ void CountryCodeInput::correctValue(
} }
} }
if (!addToNumber.isEmpty()) { if (!addToNumber.isEmpty()) {
auto validCode = Countries::ValidPhoneCode(newText.mid(1)); auto validCode = Countries::Instance().validPhoneCode(newText.mid(1));
addToNumber = newText.mid(1 + validCode.length()) + addToNumber; addToNumber = newText.mid(1 + validCode.length()) + addToNumber;
newText = '+' + validCode; newText = '+' + validCode;
} }