1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 07:58: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

@ -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 {};
}