diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeNumberFormat.cpp b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeNumberFormat.cpp index f9d0d4f537..310a0165b4 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeNumberFormat.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeNumberFormat.cpp @@ -803,6 +803,7 @@ static ErrorOr generate_unicode_locale_implementation(Core::Stream::Buffer #include #include #include +#include #include namespace Unicode { @@ -911,22 +912,31 @@ static constexpr Array<@type@, @size@> @name@ { {)~~~"); generate_mapping(generator, locale_data.locales, s_number_system_index_type, "s_locale_number_systems"sv, "s_number_systems_{}", nullptr, [&](auto const& name, auto const& value) { append_map(name, s_number_system_index_type, value.number_systems); }); generate_mapping(generator, locale_data.locales, s_unit_index_type, "s_locale_units"sv, "s_units_{}", nullptr, [&](auto const& name, auto const& value) { append_map(name, s_unit_index_type, value.units); }); - auto append_from_string = [&](StringView enum_title, StringView enum_snake, auto const& values) { - HashValueMap hashes; - hashes.ensure_capacity(values.size()); + generator.append(R"~~~( +static Optional keyword_to_number_system(KeywordNumbers keyword) +{ + switch (keyword) {)~~~"); - for (auto const& value : values) - hashes.set(value.hash(), format_identifier(enum_title, value)); - - generate_value_from_string(generator, "{}_from_string"sv, enum_title, enum_snake, move(hashes)); - }; - - append_from_string("NumberSystem"sv, "number_system"sv, locale_data.number_systems); + for (auto const& number_system : locale_data.number_systems) { + generator.set("name"sv, format_identifier({}, number_system)); + generator.append(R"~~~( + case KeywordNumbers::@name@: + return NumberSystem::@name@;)~~~"); + } generator.append(R"~~~( + default: + return {}; + } +} + Optional> get_digits_for_number_system(StringView system) { - auto number_system_value = number_system_from_string(system); + auto number_system_keyword = keyword_nu_from_string(system); + if (!number_system_keyword.has_value()) + return {}; + + auto number_system_value = keyword_to_number_system(*number_system_keyword); if (!number_system_value.has_value()) return {}; @@ -940,9 +950,13 @@ static NumberSystemData const* find_number_system(StringView locale, StringView if (!locale_value.has_value()) return nullptr; - auto number_system_value = number_system_from_string(system); + auto number_system_keyword = keyword_nu_from_string(system); + if (!number_system_keyword.has_value()) + return {}; + + auto number_system_value = keyword_to_number_system(*number_system_keyword); if (!number_system_value.has_value()) - return nullptr; + return {}; auto locale_index = to_underlying(*locale_value) - 1; // Subtract 1 because 0 == Locale::None. auto number_system_index = to_underlying(*number_system_value); diff --git a/Userland/Libraries/LibUnicode/Forward.h b/Userland/Libraries/LibUnicode/Forward.h index 52140c7d24..d801c5e70b 100644 --- a/Userland/Libraries/LibUnicode/Forward.h +++ b/Userland/Libraries/LibUnicode/Forward.h @@ -35,7 +35,6 @@ enum class ListPatternStyle : u8; enum class ListPatternType : u8; enum class Locale : u16; enum class Month : u8; -enum class NumberSystem : u8; enum class NumericSymbol : u8; enum class Property : u8; enum class Script : u8; diff --git a/Userland/Libraries/LibUnicode/NumberFormat.cpp b/Userland/Libraries/LibUnicode/NumberFormat.cpp index 13b5199000..6e398eab0e 100644 --- a/Userland/Libraries/LibUnicode/NumberFormat.cpp +++ b/Userland/Libraries/LibUnicode/NumberFormat.cpp @@ -16,7 +16,6 @@ namespace Unicode { -Optional __attribute__((weak)) number_system_from_string(StringView) { return {}; } Optional __attribute__((weak)) get_number_system_symbol(StringView, StringView, NumericSymbol) { return {}; } Optional __attribute__((weak)) get_number_system_groupings(StringView, StringView) { return {}; } Optional __attribute__((weak)) get_standard_number_system_format(StringView, StringView, StandardNumberFormatType) { return {}; } diff --git a/Userland/Libraries/LibUnicode/NumberFormat.h b/Userland/Libraries/LibUnicode/NumberFormat.h index 96670cd78e..6246a46c62 100644 --- a/Userland/Libraries/LibUnicode/NumberFormat.h +++ b/Userland/Libraries/LibUnicode/NumberFormat.h @@ -66,7 +66,6 @@ enum class NumericSymbol : u8 { PlusSign, }; -Optional number_system_from_string(StringView system); Optional get_default_number_system(StringView locale); Optional get_number_system_symbol(StringView locale, StringView system, NumericSymbol symbol);