Make sure that special value types can be added to conditions; resolves #63 (#67)

This commit is contained in:
Dr. Patrick Urbanke (劉自成)
2025-10-19 21:38:09 +02:00
committed by GitHub
parent 1bfc4e472b
commit 3076ea2c8c
5 changed files with 90 additions and 21 deletions

View File

@@ -11,26 +11,36 @@
namespace sqlgen::transpilation {
template <class T>
dynamic::Value to_value(const T& _t) {
using Type = std::remove_cvref_t<T>;
if constexpr (std::is_floating_point_v<Type>) {
return dynamic::Value{dynamic::Float{.val = static_cast<double>(_t)}};
struct ToValue;
} else if constexpr (std::is_integral_v<Type>) {
return dynamic::Value{dynamic::Integer{.val = static_cast<int64_t>(_t)}};
template <class T>
struct ToValue {
dynamic::Value operator()(const T& _t) const {
using Type = std::remove_cvref_t<T>;
if constexpr (std::is_floating_point_v<Type>) {
return dynamic::Value{dynamic::Float{.val = static_cast<double>(_t)}};
} else if constexpr (std::is_convertible_v<Type, std::string>) {
return dynamic::Value{dynamic::String{.val = std::string(_t)}};
} else if constexpr (std::is_integral_v<Type>) {
return dynamic::Value{dynamic::Integer{.val = static_cast<int64_t>(_t)}};
} else if constexpr (has_reflection_method<Type>) {
return to_value(_t.reflection());
} else if constexpr (std::is_convertible_v<Type, std::string>) {
return dynamic::Value{dynamic::String{.val = std::string(_t)}};
} else if constexpr (std::is_enum_v<Type>) {
return dynamic::Value{dynamic::String{.val = rfl::enum_to_string(_t)}};
} else if constexpr (has_reflection_method<Type>) {
return ToValue<typename Type::ReflectionType>{}(_t.reflection());
} else {
static_assert(rfl::always_false_v<T>, "Unsupported type");
} else if constexpr (std::is_enum_v<Type>) {
return dynamic::Value{dynamic::String{.val = rfl::enum_to_string(_t)}};
} else {
static_assert(rfl::always_false_v<T>, "Unsupported type");
}
}
};
template <class T>
dynamic::Value to_value(const T& _t) {
return ToValue<std::remove_cvref_t<T>>{}(_t);
}
} // namespace sqlgen::transpilation