1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 11:38:11 +00:00

Meta: Support generating case-insensitive value-from-string methods

This also extracts the default parameters for generate_value_from_string
to a structure. This is just to make it cleaner to add new options.
This commit is contained in:
Timothy Flynn 2022-01-10 12:19:58 -05:00 committed by Linus Groh
parent 3dccaa39d8
commit 6da1bfeeea
2 changed files with 27 additions and 5 deletions

View file

@ -1077,7 +1077,11 @@ Optional<StringView> get_locale_@enum_snake@_mapping(StringView locale, StringVi
for (auto const& alias : aliases)
hashes.set(alias.key.hash(), alias.value);
generate_value_from_string(generator, "resolve_{}_alias"sv, s_string_index_type, enum_snake, move(hashes), "StringView"sv, "s_string_list[{}]"sv);
ValueFromStringOptions options {};
options.return_type = "StringView"sv;
options.return_format = "s_string_list[{}]"sv;
generate_value_from_string(generator, "resolve_{}_alias"sv, s_string_index_type, enum_snake, move(hashes), options);
};
append_from_string("Locale"sv, "locale"sv, locale_data.locales.keys(), locale_data.locale_aliases);

View file

@ -293,15 +293,21 @@ struct HashValueComparator
template<typename ValueType>
using HashValueMap = HashMap<unsigned, ValueType>;
struct ValueFromStringOptions {
Optional<StringView> return_type {};
StringView return_format { "{}"sv };
CaseSensitivity sensitivity { CaseSensitivity::CaseSensitive };
};
template<typename ValueType>
void generate_value_from_string(SourceGenerator& generator, StringView method_name_format, StringView value_type, StringView value_name, HashValueMap<ValueType> hashes, Optional<StringView> return_type = {}, StringView return_format = "{}"sv)
void generate_value_from_string(SourceGenerator& generator, StringView method_name_format, StringView value_type, StringView value_name, HashValueMap<ValueType> hashes, ValueFromStringOptions options = {})
{
ensure_from_string_types_are_generated(generator);
generator.set("method_name", String::formatted(method_name_format, value_name));
generator.set("value_type", value_type);
generator.set("value_name", value_name);
generator.set("return_type", return_type.has_value() ? *return_type : value_type);
generator.set("return_type", options.return_type.has_value() ? *options.return_type : value_type);
generator.set("size", String::number(hashes.size()));
generator.append(R"~~~(
@ -334,11 +340,23 @@ Optional<@return_type@> @method_name@(StringView key)
}
}
generator.set("return_statement", String::formatted(return_format, "value->value"sv));
generator.set("return_statement", String::formatted(options.return_format, "value->value"sv));
generator.append(R"~~~(
} };
)~~~");
if (auto const* value = binary_search(hash_pairs, key.hash(), nullptr, HashValueComparator<@value_type@> {}))
if (options.sensitivity == CaseSensitivity::CaseSensitive) {
generator.append(R"~~~(
auto hash = key.hash();
)~~~");
} else {
generator.append(R"~~~(
auto hash = CaseInsensitiveStringViewTraits::hash(key);
)~~~");
}
generator.append(R"~~~(
if (auto const* value = binary_search(hash_pairs, hash, nullptr, HashValueComparator<@value_type@> {}))
return @return_statement@;
return {};
}