14 inline constexpr
bool always_false_v =
false;
16 char const* TypeStr() noexcept;
18 char const* TypeStr<uint64_t>() noexcept {
22 char const* TypeStr<int64_t>() noexcept {
26 char const* TypeStr<double>() noexcept {
34 template struct BasicKeyword<ValueKeywordTraits>;
35 template struct BasicKeyword<EsoKeywordTraits>;
37 template std::ostream&
40 template std::ostream&
43 template <
class Trait>
45 char const* string_value,
46 std::optional<std::string> comment_arg)
47 : name(std::move(name_arg)), value(std::string(string_value)), comment(std::move(comment_arg)) {
50 template <
class Trait>
53 std::optional<std::string> comment_arg) noexcept
54 : name(std::move(name_arg)), value(std::move(value_arg)), comment(std::move(comment_arg)) {
57 template <
class Trait>
59 return name == rhs.name && value == rhs.value && comment == rhs.comment;
62 template <
class Trait>
64 return !(*
this == rhs);
67 template <
class Trait>
69 return name < rhs.name;
74 if (lhs.index() != rhs.index()) {
78 [&](
auto const& lhs,
auto const& rhs) noexcept ->
bool {
79 return lhs.name == rhs.name;
86 [&](
auto const& var)
mutable {
87 using T = std::decay_t<decltype(var)>;
88 if constexpr (std::is_same_v<T, std::string>) {
89 os <<
"(str)'" << var <<
"'";
90 }
else if constexpr (std::is_same_v<T, bool>) {
91 os <<
"(bool)" << (var ?
"true" :
"false");
93 os <<
"(" << TypeStr<T>() <<
")" << var;
100 template <
class Trait>
102 os <<
"name='" << kw.
name <<
"', value=" << kw.
value <<
", comment=";
104 os <<
"'" << *kw.
comment <<
"'";
113 [&](
auto const& var)
mutable {
121 for (
auto const& kw : from) {
122 if (
auto it = std::find_if(
123 to.begin(), to.end(), [&](
auto const& val) { return NameEquals(val, kw); });