From 09547f4084b5674a291856faf002967ef8aac521 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Sun, 12 Dec 2021 14:20:51 -0500 Subject: [PATCH] LibUnicode: Generate unique lists of calendar symbols structures Of the 374 generated lists, 120 are unique. --- .../GenerateUnicodeDateTimeFormat.cpp | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp index 9ae77a6576d..700333e1a1c 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp @@ -43,6 +43,9 @@ constexpr auto s_symbol_list_index_type = "u16"sv; using CalendarSymbolsIndexType = u16; constexpr auto s_calendar_symbols_index_type = "u16"sv; +using CalendarSymbolsListIndexType = u8; +constexpr auto s_calendar_symbols_list_index_type = "u8"sv; + struct CalendarPattern : public Unicode::CalendarPattern { bool contains_only_date_fields() const { @@ -285,6 +288,8 @@ struct AK::Traits : public GenericTraits { static unsigned hash(CalendarSymbols const& c) { return c.hash(); } }; +using CalendarSymbolsList = Vector; + struct Calendar { StringIndexType calendar { 0 }; @@ -297,7 +302,7 @@ struct Calendar { Vector range_formats {}; Vector range12_formats {}; - Vector symbols {}; + CalendarSymbolsListIndexType symbols { 0 }; }; struct TimeZone { @@ -325,6 +330,7 @@ struct UnicodeLocaleData { UniqueStorage unique_formats; UniqueStorage unique_symbol_lists; UniqueStorage unique_calendar_symbols; + UniqueStorage unique_calendar_symbols_lists; HashMap locales; @@ -931,10 +937,12 @@ static void parse_calendar_symbols(Calendar& calendar, JsonObject const& calenda } }; }; + CalendarSymbolsList symbols_list {}; + auto store_symbol_lists = [&](auto symbol, auto symbol_lists) { auto symbol_index = to_underlying(symbol); - if (symbol_index >= calendar.symbols.size()) - calendar.symbols.resize(symbol_index + 1); + if (symbol_index >= symbols_list.size()) + symbols_list.resize(symbol_index + 1); CalendarSymbols symbols {}; symbols.narrow_symbols = locale_data.unique_symbol_lists.ensure(move(symbol_lists[0])); @@ -942,7 +950,7 @@ static void parse_calendar_symbols(Calendar& calendar, JsonObject const& calenda symbols.long_symbols = locale_data.unique_symbol_lists.ensure(move(symbol_lists[2])); auto calendar_symbols_index = locale_data.unique_calendar_symbols.ensure(move(symbols)); - calendar.symbols[symbol_index] = calendar_symbols_index; + symbols_list[symbol_index] = calendar_symbols_index; }; auto parse_era_symbols = [&](auto const& symbols_object) { @@ -1057,6 +1065,8 @@ static void parse_calendar_symbols(Calendar& calendar, JsonObject const& calenda parse_month_symbols(calendar_object.get("months"sv).as_object().get("format"sv).as_object()); parse_weekday_symbols(calendar_object.get("days"sv).as_object().get("format"sv).as_object()); parse_day_period_symbols(calendar_object.get("dayPeriods"sv).as_object().get("format"sv).as_object()); + + calendar.symbols = locale_data.unique_calendar_symbols_lists.ensure(move(symbols_list)); } static ErrorOr parse_calendars(String locale_calendars_path, UnicodeLocaleData& locale_data, Locale& locale) @@ -1379,6 +1389,7 @@ static void generate_unicode_locale_implementation(Core::File& file, UnicodeLoca generator.set("calendar_format_index_type"sv, s_calendar_format_index_type); generator.set("symbol_list_index_type"sv, s_symbol_list_index_type); generator.set("calendar_symbols_index_type"sv, s_calendar_symbols_index_type); + generator.set("calendar_symbols_list_index_type"sv, s_calendar_symbols_list_index_type); generator.append(R"~~~( #include @@ -1524,7 +1535,7 @@ struct CalendarData { Span<@calendar_range_pattern_index_type@ const> range_formats {}; Span<@calendar_range_pattern_index_type@ const> range12_formats {}; - Array<@calendar_symbols_index_type@, 4> symbols {}; + @calendar_symbols_list_index_type@ symbols { 0 }; }; struct TimeZoneData { @@ -1543,6 +1554,7 @@ struct DayPeriodData { locale_data.unique_formats.generate(generator, "CalendarFormat"sv, "s_calendar_formats"sv, 10); locale_data.unique_symbol_lists.generate(generator, s_string_index_type, "s_symbol_lists"sv); locale_data.unique_calendar_symbols.generate(generator, "CalendarSymbols"sv, "s_calendar_symbols"sv, 10); + locale_data.unique_calendar_symbols_lists.generate(generator, s_calendar_symbols_index_type, "s_calendar_symbol_lists"sv); auto append_pattern_list = [&](auto name, auto type, auto const& formats) { generator.set("name", move(name)); @@ -1593,21 +1605,14 @@ static constexpr Array @name@ { {)~~~"); generator.set("default_range_format", String::number(calendar.default_range_format)); generator.set("range_formats", format_name(calendar_key, "range_formats"sv)); generator.set("range12_formats", format_name(calendar_key, "range12_formats"sv)); + generator.set("symbols"sv, String::number(calendar.symbols)); generator.append(R"~~~( { @calendar@, )~~~"); generator.append("@date_formats@, @time_formats@, @date_time_formats@, @formats@.span(), "); - generator.append("@default_range_format@, @range_formats@.span(), @range12_formats@.span(), {"); - - bool first = true; - for (auto symbols : calendar.symbols) { - generator.append(first ? " " : ", "); - generator.append(String::number(symbols)); - first = false; - } - - generator.append(" } },"); + generator.append("@default_range_format@, @range_formats@.span(), @range12_formats@.span(), "); + generator.append("@symbols@ }, "); } generator.append(R"~~~( @@ -1826,9 +1831,10 @@ Vector get_calendar_range12_formats(StringView lo static Span<@string_index_type@ const> find_calendar_symbols(StringView locale, StringView calendar, CalendarSymbol symbol, CalendarPatternStyle style) { if (auto const* data = find_calendar_data(locale, calendar); data != nullptr) { + auto const& symbols_list = s_calendar_symbol_lists[data->symbols]; auto symbol_index = to_underlying(symbol); - auto calendar_symbols_index = data->symbols.at(symbol_index); + auto calendar_symbols_index = symbols_list.at(symbol_index); auto const& symbols = s_calendar_symbols.at(calendar_symbols_index); @symbol_list_index_type@ symbol_list_index = 0;