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:
parent
3dccaa39d8
commit
6da1bfeeea
2 changed files with 27 additions and 5 deletions
|
@ -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