summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy Flynn <trflynn89@pm.me>2021-12-07 08:40:06 -0500
committerLinus Groh <mail@linusgroh.de>2021-12-08 11:29:36 +0000
commit6ace4000bf9127c43fe1ce4c5c49015e0467deaa (patch)
tree76d7bbd732df394750d626406b1f874888ce2b99
parent80ea6e664d32522c6e2bfa3f638c669237d56c5b (diff)
downloadserenity-6ace4000bf9127c43fe1ce4c5c49015e0467deaa.zip
LibJS+LibUnicode: Supply field type in CalendarPattern's for-each method
Some callers will want different behavior depending on what field is being provided to the callback.
-rw-r--r--Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp4
-rw-r--r--Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormat.cpp10
-rw-r--r--Userland/Libraries/LibUnicode/DateTimeFormat.h36
3 files changed, 32 insertions, 18 deletions
diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp
index 8f4a268735..b54772dbf8 100644
--- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp
+++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp
@@ -499,11 +499,11 @@ static void generate_missing_patterns(Calendar& calendar, Vector<CalendarPattern
format.pattern12_index = replace_pattern(format.pattern_index, time_format.pattern12_index, date_format.pattern_index);
format.pattern_index = replace_pattern(format.pattern_index, time_format.pattern_index, date_format.pattern_index);
- format.for_each_calendar_field_zipped_with(date_format, [](auto& field, auto const& date_field) {
+ format.for_each_calendar_field_zipped_with(date_format, [](auto& field, auto const& date_field, auto) {
if (date_field.has_value())
field = date_field;
});
- format.for_each_calendar_field_zipped_with(time_format, [](auto& field, auto const& time_field) {
+ format.for_each_calendar_field_zipped_with(time_format, [](auto& field, auto const& time_field, auto) {
if (time_field.has_value())
field = time_field;
});
diff --git a/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormat.cpp b/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormat.cpp
index dd4bfa5894..9f7ad9c14f 100644
--- a/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormat.cpp
+++ b/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormat.cpp
@@ -249,7 +249,7 @@ ThrowCompletionOr<DateTimeFormat*> initialize_date_time_format(GlobalObject& glo
return &date_time_format;
// 38. For each row in Table 4, except the header row, in table order, do
- date_time_format.for_each_calendar_field_zipped_with(*best_format, [&](auto& date_time_format_field, auto const& best_format_field) {
+ date_time_format.for_each_calendar_field_zipped_with(*best_format, [&](auto& date_time_format_field, auto const& best_format_field, auto) {
// a. Let prop be the name given in the Property column of the row.
// b. If bestFormat has a field [[<prop>]], then
if (best_format_field.has_value()) {
@@ -490,12 +490,12 @@ Optional<Unicode::CalendarPattern> date_time_style_format(StringView data_locale
Unicode::CalendarPattern format {};
// b. Add to format all fields from dateFormat except [[pattern]] and [[rangePatterns]].
- format.for_each_calendar_field_zipped_with(date_format, [](auto& format_field, auto const& date_format_field) {
+ format.for_each_calendar_field_zipped_with(date_format, [](auto& format_field, auto const& date_format_field, auto) {
format_field = date_format_field;
});
// c. Add to format all fields from timeFormat except [[pattern]], [[rangePatterns]], [[pattern12]], and [[rangePatterns12]], if present.
- format.for_each_calendar_field_zipped_with(time_format, [](auto& format_field, auto const& time_format_field) {
+ format.for_each_calendar_field_zipped_with(time_format, [](auto& format_field, auto const& time_format_field, auto) {
if (time_format_field.has_value())
format_field = time_format_field;
});
@@ -577,7 +577,7 @@ Optional<Unicode::CalendarPattern> basic_format_matcher(Unicode::CalendarPattern
int score = 0;
// b. For each property name property shown in Table 4, do
- format.for_each_calendar_field_zipped_with(options, [&](auto const& format_prop, auto const& options_prop) {
+ format.for_each_calendar_field_zipped_with(options, [&](auto const& format_prop, auto const& options_prop, auto) {
using ValueType = typename RemoveReference<decltype(options_prop)>::ValueType;
// i. If options has a field [[<property>]], let optionsProp be options.[[<property>]]; else let optionsProp be undefined.
@@ -659,7 +659,7 @@ Optional<Unicode::CalendarPattern> basic_format_matcher(Unicode::CalendarPattern
//
// Rather than generating an prohibitively large amount of nearly-duplicate patterns, which only
// differ by field length, we expand the field lengths here.
- best_format->for_each_calendar_field_zipped_with(options, [](auto& best_format_field, auto const& option_field) {
+ best_format->for_each_calendar_field_zipped_with(options, [](auto& best_format_field, auto const& option_field, auto) {
if (best_format_field.has_value() && option_field.has_value())
best_format_field = option_field;
});
diff --git a/Userland/Libraries/LibUnicode/DateTimeFormat.h b/Userland/Libraries/LibUnicode/DateTimeFormat.h
index 37209de79c..25c2453c85 100644
--- a/Userland/Libraries/LibUnicode/DateTimeFormat.h
+++ b/Userland/Libraries/LibUnicode/DateTimeFormat.h
@@ -31,20 +31,34 @@ enum class CalendarPatternStyle : u8 {
};
struct CalendarPattern {
+ enum class Field {
+ Era,
+ Year,
+ Month,
+ Weekday,
+ Day,
+ DayPeriod,
+ Hour,
+ Minute,
+ Second,
+ FractionalSecondDigits,
+ TimeZoneName,
+ };
+
template<typename Callback>
void for_each_calendar_field_zipped_with(CalendarPattern const& other, Callback&& callback)
{
- callback(era, other.era);
- callback(year, other.year);
- callback(month, other.month);
- callback(weekday, other.weekday);
- callback(day, other.day);
- callback(day_period, other.day_period);
- callback(hour, other.hour);
- callback(minute, other.minute);
- callback(second, other.second);
- callback(fractional_second_digits, other.fractional_second_digits);
- callback(time_zone_name, other.time_zone_name);
+ callback(era, other.era, Field::Era);
+ callback(year, other.year, Field::Year);
+ callback(month, other.month, Field::Month);
+ callback(weekday, other.weekday, Field::Weekday);
+ callback(day, other.day, Field::Day);
+ callback(day_period, other.day_period, Field::DayPeriod);
+ callback(hour, other.hour, Field::Hour);
+ callback(minute, other.minute, Field::Minute);
+ callback(second, other.second, Field::Second);
+ callback(fractional_second_digits, other.fractional_second_digits, Field::FractionalSecondDigits);
+ callback(time_zone_name, other.time_zone_name, Field::TimeZoneName);
}
String pattern {};