12#include "../microfmt.hpp"
42 microfmt::string_view suffix =
"",
bool show_index =
false) noexcept
43 : var_(var), prefix_(prefix), suffix_(suffix), show_index_(show_index) {}
46 bool =
false) =
delete;
49 bool =
false) =
delete;
55 [[nodiscard]]
constexpr const variant_type &
get() const noexcept {
return *var_; }
60 [[nodiscard]]
constexpr microfmt::string_view
prefix() const noexcept {
return prefix_; }
65 [[nodiscard]]
constexpr microfmt::string_view
suffix() const noexcept {
return suffix_; }
70 [[nodiscard]]
constexpr bool show_index() const noexcept {
return show_index_; }
74 value_ref<const variant_type> var_;
76 microfmt::string_view prefix_;
78 microfmt::string_view suffix_;
92template <
typename... Ts>
93[[nodiscard]]
constexpr auto as_variant(
const std::variant<Ts...> &var RELOCO_LIFETIMEBOUND)
noexcept {
97template <
typename... Ts> [[nodiscard]]
constexpr auto as_variant(std::variant<Ts...> &&) noexcept = delete;
99template <typename... Ts> [[nodiscard]] constexpr auto
as_variant(const std::variant<Ts...> &&) noexcept = delete;
109template <typename... Ts>
110[[nodiscard]] constexpr auto
as_variant(const std::variant<Ts...> &var RELOCO_LIFETIMEBOUND,
115template <
typename... Ts>
116[[nodiscard]]
constexpr auto as_variant(std::variant<Ts...> &&, microfmt::string_view,
117 microfmt::string_view)
noexcept =
delete;
119template <
typename... Ts>
120[[nodiscard]]
constexpr auto as_variant(
const std::variant<Ts...> &&, microfmt::string_view,
121 microfmt::string_view)
noexcept =
delete;
130template <
typename... Ts>
131[[nodiscard]]
constexpr auto as_debug_variant(
const std::variant<Ts...> &var RELOCO_LIFETIMEBOUND,
132 bool show_index =
false) noexcept {
133 return variant_view<Ts...>(var,
"variant",
"", show_index);
136template <
typename... Ts>
137[[nodiscard]]
constexpr auto as_debug_variant(std::variant<Ts...> &&,
bool =
false) noexcept = delete;
139template <typename... Ts>
140[[nodiscard]] constexpr auto
as_debug_variant(const std::variant<Ts...> &&,
bool = false) noexcept = delete;
157 char spec_mode{
'\0'};
161 microfmt::string_view elem_spec{
""};
168 auto spec = ctx.spec();
169 if (!spec.empty() && (spec.front() ==
'?' || spec.front() ==
'i' || spec.front() ==
'#')) {
170 spec_mode = spec.front();
171 spec.remove_prefix(1);
182 const auto &var = view.get();
184 if (var.valueless_by_exception()) {
185 out.write(
"valueless");
189 bool print_parens =
false;
190 if (spec_mode ==
'?' || (view.prefix() ==
"variant" && !view.show_index() && spec_mode !=
'i')) {
191 out.write(
"variant(");
193 }
else if (spec_mode ==
'i' || spec_mode ==
'#' || view.show_index()) {
197 }
else if (!view.prefix().empty()) {
198 out.write(view.prefix());
202 [
this, &out](
const auto &val) {
203 using ValueType = std::decay_t<
decltype(val)>;
206 element_fmt.parse(elem_ctx);
207 element_fmt.format(val, out);
213 }
else if (!view.suffix().empty()) {
214 out.write(view.suffix());
227template <
typename... Ts>
struct formatter<std::variant<Ts...>> {
244 void format(
const std::variant<Ts...> &var,
const sink &out)
const noexcept {
262 void format(std::monostate,
const sink &out)
const noexcept { out.write(
"null"); }
Definition microfmt.hpp:881
Non-owning view over a std::variant with optional decorations.
Definition variant.hpp:27
constexpr const variant_type & get() const noexcept
Returns the referenced variant.
Definition variant.hpp:55
constexpr variant_view(const variant_type &&, microfmt::string_view="", microfmt::string_view="", bool=false)=delete
std::variant< Ts... > variant_type
The wrapped std::variant type.
Definition variant.hpp:32
constexpr microfmt::string_view suffix() const noexcept
Returns the suffix decoration.
Definition variant.hpp:65
constexpr microfmt::string_view prefix() const noexcept
Returns the prefix decoration.
Definition variant.hpp:60
constexpr bool show_index() const noexcept
Reports whether the alternative index is displayed.
Definition variant.hpp:70
constexpr variant_view(const variant_type &var RELOCO_LIFETIMEBOUND, microfmt::string_view prefix="", microfmt::string_view suffix="", bool show_index=false) noexcept
Constructs the view.
Definition variant.hpp:41
constexpr variant_view(variant_type &&, microfmt::string_view="", microfmt::string_view="", bool=false)=delete
reloco::sink sink
Type-erased, zero-allocation output sink.
Definition microfmt.hpp:46
RELOCO_CONSTEXPR20 void format_to(const sink &out, microfmt::string_view fmt, const Args &...args) noexcept
Definition microfmt.hpp:1766
constexpr auto as_debug_variant(const std::variant< Ts... > &var RELOCO_LIFETIMEBOUND, bool show_index=false) noexcept
Wraps a variant for debug output (variant(index, ...)).
Definition variant.hpp:131
constexpr auto as_variant(const std::variant< Ts... > &var RELOCO_LIFETIMEBOUND) noexcept
Wraps a variant for plain formatting.
Definition variant.hpp:93