51struct std::formatter<
ultra::value_t, char>
53 constexpr auto parse(std::format_parse_context &ctx)
57 if (it != ctx.end() && *it !=
'}')
58 throw std::format_error(
"Invalid format specifier for ultra::value_t");
62 template<
class FormatContext>
66 [&ctx](
const auto &x) ->
typename FormatContext::iterator
68 using T = std::remove_cvref_t<
decltype(x)>;
70 if constexpr (std::is_same_v<T, ultra::D_VOID>)
71 return std::format_to(ctx.out(),
"{{}}");
73 else if constexpr (std::is_same_v<T, ultra::D_INT>
74 || std::is_same_v<T, ultra::D_DOUBLE>)
75 return std::format_to(ctx.out(),
"{}", x);
77 else if constexpr (std::is_same_v<T, ultra::D_STRING>)
78 return ultra::detail::format_quoted(ctx.out(), x);
80 else if constexpr (std::is_same_v<T, const ultra::D_NULLARY *>)
81 return x ? std::format_to(ctx.out(),
"{}", x->to_string())
82 : std::format_to(ctx.out(),
"<nullary:null>");
84 else if constexpr (std::is_same_v<T, ultra::D_ADDRESS>)
85 return std::format_to(ctx.out(),
"[{}]", std::to_underlying(x));
87 else if constexpr (std::is_same_v<T, const ultra::D_VARIABLE *>)
88 return x ? std::format_to(ctx.out(),
"{}", x->to_string())
89 : std::format_to(ctx.out(),
"<var:null>");
91 else if constexpr (std::is_same_v<T, ultra::D_IVECTOR>)
98 out = std::format_to(
out,
"{}", x[0]);
100 for (std::size_t i(1); i < x.size(); ++i)
101 out = std::format_to(
out,
" {}", x[i]);
109 static_assert(!
sizeof(T),
"Unhandled alternative in ultra::value_t");
std::variant< D_VOID, D_INT, D_DOUBLE, D_STRING, const D_NULLARY *, D_ADDRESS, const D_VARIABLE *, D_IVECTOR > value_t
Definition value.h:54