|
@@ -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 (options.sensitivity == CaseSensitivity::CaseSensitive) {
|
|
|
+ generator.append(R"~~~(
|
|
|
+ auto hash = key.hash();
|
|
|
+)~~~");
|
|
|
+ } else {
|
|
|
+ generator.append(R"~~~(
|
|
|
+ auto hash = CaseInsensitiveStringViewTraits::hash(key);
|
|
|
+)~~~");
|
|
|
+ }
|
|
|
|
|
|
- if (auto const* value = binary_search(hash_pairs, key.hash(), nullptr, HashValueComparator<@value_type@> {}))
|
|
|
+ generator.append(R"~~~(
|
|
|
+ if (auto const* value = binary_search(hash_pairs, hash, nullptr, HashValueComparator<@value_type@> {}))
|
|
|
return @return_statement@;
|
|
|
return {};
|
|
|
}
|