mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 11:58:12 +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:
parent
3dccaa39d8
commit
6da1bfeeea
2 changed files with 27 additions and 5 deletions
|
@ -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);
|
||||
|
|
|
@ -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 {};
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue