diff options
author | Timothy Flynn <trflynn89@pm.me> | 2021-12-13 12:12:18 -0500 |
---|---|---|
committer | Brian Gianforcaro <b.gianfo@gmail.com> | 2021-12-13 21:28:56 -0800 |
commit | 0c6cc4ad9659c94211bdb01d3323493d8140d0f0 (patch) | |
tree | 441c75d9996a6dcb774c7f82d742ce11ef3eacd3 /Meta/Lagom/Tools | |
parent | a45f2ccc25af3fd65279411a6437093745795946 (diff) | |
download | serenity-0c6cc4ad9659c94211bdb01d3323493d8140d0f0.zip |
LibUnicode: Generate unique lists of localized currencies
Diffstat (limited to 'Meta/Lagom/Tools')
-rw-r--r-- | Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp | 67 |
1 files changed, 46 insertions, 21 deletions
diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp index d30e059d9b..818b3a7388 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp @@ -33,6 +33,9 @@ constexpr auto s_territory_list_index_type = "u8"sv; using ScriptListIndexType = u8; constexpr auto s_script_list_index_type = "u8"sv; +using CurrencyListIndexType = u16; +constexpr auto s_currency_list_index_type = "u16"sv; + struct ListPatterns { String type; String style; @@ -45,6 +48,7 @@ struct ListPatterns { using LanguageList = Vector<StringIndexType>; using TerritoryList = Vector<StringIndexType>; using ScriptList = Vector<StringIndexType>; +using CurrencyList = Vector<StringIndexType>; struct Locale { String language; @@ -53,10 +57,10 @@ struct Locale { LanguageListIndexType languages { 0 }; TerritoryListIndexType territories { 0 }; ScriptListIndexType scripts { 0 }; - HashMap<String, StringIndexType> long_currencies; - HashMap<String, StringIndexType> short_currencies; - HashMap<String, StringIndexType> narrow_currencies; - HashMap<String, StringIndexType> numeric_currencies; + CurrencyListIndexType long_currencies { 0 }; + CurrencyListIndexType short_currencies { 0 }; + CurrencyListIndexType narrow_currencies { 0 }; + CurrencyListIndexType numeric_currencies { 0 }; HashMap<String, StringIndexType> keywords; Vector<ListPatterns> list_patterns; }; @@ -71,6 +75,7 @@ struct UnicodeLocaleData { UniqueStorage<LanguageList, LanguageListIndexType> unique_language_lists; UniqueStorage<TerritoryList, TerritoryListIndexType> unique_territory_lists; UniqueStorage<ScriptList, ScriptListIndexType> unique_script_lists; + UniqueStorage<CurrencyList, CurrencyListIndexType> unique_currency_lists; HashMap<String, Locale> locales; Vector<Alias> locale_aliases; @@ -339,28 +344,47 @@ static ErrorOr<void> parse_locale_currencies(String numbers_path, UnicodeLocaleD currencies_path = currencies_path.append("currencies.json"sv); auto currencies_file = TRY(Core::File::open(currencies_path.string(), Core::OpenMode::ReadOnly)); - auto currencies = TRY(JsonValue::from_string(currencies_file->read_all())); + auto locale_currencies = TRY(JsonValue::from_string(currencies_file->read_all())); - auto const& main_object = currencies.as_object().get("main"sv); + auto const& main_object = locale_currencies.as_object().get("main"sv); auto const& locale_object = main_object.as_object().get(currencies_path.parent().basename()); auto const& locale_numbers_object = locale_object.as_object().get("numbers"sv); auto const& currencies_object = locale_numbers_object.as_object().get("currencies"sv); + currencies_object.as_object().for_each_member([&](auto const& key, JsonValue const&) { + if (!locale_data.currencies.contains_slow(key)) + locale_data.currencies.append(key); + }); + + CurrencyList long_currencies {}; + long_currencies.resize(locale_data.currencies.size()); + + CurrencyList short_currencies {}; + short_currencies.resize(locale_data.currencies.size()); + + CurrencyList narrow_currencies {}; + narrow_currencies.resize(locale_data.currencies.size()); + + CurrencyList numeric_currencies {}; + numeric_currencies.resize(locale_data.currencies.size()); + currencies_object.as_object().for_each_member([&](auto const& key, JsonValue const& value) { auto const& long_name = value.as_object().get("displayName"sv); auto const& short_name = value.as_object().get("symbol"sv); auto const& narrow_name = value.as_object().get("symbol-alt-narrow"sv); auto const& numeric_name = value.as_object().get("displayName-count-other"sv); - locale.long_currencies.set(key, locale_data.unique_strings.ensure(long_name.as_string())); - locale.short_currencies.set(key, locale_data.unique_strings.ensure(short_name.as_string())); - locale.narrow_currencies.set(key, narrow_name.is_null() ? 0 : locale_data.unique_strings.ensure(narrow_name.as_string())); - locale.numeric_currencies.set(key, locale_data.unique_strings.ensure(numeric_name.is_null() ? long_name.as_string() : numeric_name.as_string())); - - if (!locale_data.currencies.contains_slow(key)) - locale_data.currencies.append(key); + auto index = locale_data.currencies.find_first_index(key).value(); + long_currencies[index] = locale_data.unique_strings.ensure(long_name.as_string()); + short_currencies[index] = locale_data.unique_strings.ensure(short_name.as_string()); + narrow_currencies[index] = narrow_name.is_null() ? 0 : locale_data.unique_strings.ensure(narrow_name.as_string()); + numeric_currencies[index] = locale_data.unique_strings.ensure(numeric_name.is_null() ? long_name.as_string() : numeric_name.as_string()); }); + locale.long_currencies = locale_data.unique_currency_lists.ensure(move(long_currencies)); + locale.short_currencies = locale_data.unique_currency_lists.ensure(move(short_currencies)); + locale.narrow_currencies = locale_data.unique_currency_lists.ensure(move(narrow_currencies)); + locale.numeric_currencies = locale_data.unique_currency_lists.ensure(move(numeric_currencies)); return {}; } @@ -732,6 +756,7 @@ struct Patterns { locale_data.unique_language_lists.generate(generator, s_string_index_type, "s_language_lists"sv); locale_data.unique_territory_lists.generate(generator, s_string_index_type, "s_territory_lists"sv); locale_data.unique_script_lists.generate(generator, s_string_index_type, "s_script_lists"sv); + locale_data.unique_currency_lists.generate(generator, s_string_index_type, "s_currency_lists"sv); auto append_index = [&](auto index) { generator.append(String::formatted(", {}", index)); @@ -836,10 +861,10 @@ static constexpr Array<Patterns, @size@> @name@ { {)~~~"); append_mapping(locales, locale_data.locales, s_language_list_index_type, "s_languages"sv, [&](auto const& locale) { return locale.languages; }); append_mapping(locales, locale_data.locales, s_territory_list_index_type, "s_territories"sv, [&](auto const& locale) { return locale.territories; }); append_mapping(locales, locale_data.locales, s_script_list_index_type, "s_scripts"sv, [&](auto const& locale) { return locale.scripts; }); - generate_mapping(generator, locale_data.locales, s_string_index_type, "s_long_currencies"sv, "s_long_currencies_{}", [&](auto const& name, auto const& value) { append_string_index_list(name, locale_data.currencies, value.long_currencies); }); - generate_mapping(generator, locale_data.locales, s_string_index_type, "s_short_currencies"sv, "s_short_currencies_{}", [&](auto const& name, auto const& value) { append_string_index_list(name, locale_data.currencies, value.short_currencies); }); - generate_mapping(generator, locale_data.locales, s_string_index_type, "s_narrow_currencies"sv, "s_narrow_currencies_{}", [&](auto const& name, auto const& value) { append_string_index_list(name, locale_data.currencies, value.narrow_currencies); }); - generate_mapping(generator, locale_data.locales, s_string_index_type, "s_numeric_currencies"sv, "s_numeric_currencies_{}", [&](auto const& name, auto const& value) { append_string_index_list(name, locale_data.currencies, value.numeric_currencies); }); + append_mapping(locales, locale_data.locales, s_currency_list_index_type, "s_long_currencies"sv, [&](auto const& locale) { return locale.long_currencies; }); + append_mapping(locales, locale_data.locales, s_currency_list_index_type, "s_short_currencies"sv, [&](auto const& locale) { return locale.short_currencies; }); + append_mapping(locales, locale_data.locales, s_currency_list_index_type, "s_narrow_currencies"sv, [&](auto const& locale) { return locale.narrow_currencies; }); + append_mapping(locales, locale_data.locales, s_currency_list_index_type, "s_numeric_currencies"sv, [&](auto const& locale) { return locale.numeric_currencies; }); generate_mapping(generator, locale_data.locales, s_string_index_type, "s_keywords"sv, "s_keywords_{}", [&](auto const& name, auto const& value) { append_string_index_list(name, locale_data.keywords, value.keywords); }); generate_mapping(generator, locale_data.locales, "Patterns"sv, "s_list_patterns"sv, "s_list_patterns_{}", [&](auto const& name, auto const& value) { append_list_patterns(name, value.list_patterns); }); @@ -1101,10 +1126,10 @@ Optional<StringView> get_locale_@enum_snake@_mapping(StringView locale, StringVi append_from_string("ScriptTag"sv, "script_tag"sv, locale_data.scripts); append_alias_search("script_tag"sv, locale_data.script_aliases); - append_mapping_search("long_currency"sv, "currency"sv, "s_long_currencies"sv); - append_mapping_search("short_currency"sv, "currency"sv, "s_short_currencies"sv); - append_mapping_search("narrow_currency"sv, "currency"sv, "s_narrow_currencies"sv); - append_mapping_search("numeric_currency"sv, "currency"sv, "s_numeric_currencies"sv); + append_mapping_search("long_currency"sv, "currency"sv, "s_long_currencies"sv, "s_currency_lists"sv); + append_mapping_search("short_currency"sv, "currency"sv, "s_short_currencies"sv, "s_currency_lists"sv); + append_mapping_search("narrow_currency"sv, "currency"sv, "s_narrow_currencies"sv, "s_currency_lists"sv); + append_mapping_search("numeric_currency"sv, "currency"sv, "s_numeric_currencies"sv, "s_currency_lists"sv); append_from_string("Currency"sv, "currency"sv, locale_data.currencies); append_mapping_search("key"sv, "key"sv, "s_keywords"sv); |