This commit is contained in:
2026-01-31 13:03:48 +03:00
parent 0d3b8b6454
commit bfd668cff2

View File

@@ -12,10 +12,14 @@ namespace mcc
struct mcc_serializer_interface_t { struct mcc_serializer_interface_t {
virtual ~mcc_serializer_interface_t() = default; virtual ~mcc_serializer_interface_t() = default;
template <std::derived_from<mcc_serializer_interface_t> SelfT, traits::mcc_output_char_range R, typename ValueT> template <std::derived_from<mcc_serializer_interface_t> SelfT,
mcc_error_c auto operator()(this SelfT&& self, R& output, ValueT&& value) traits::mcc_output_char_range R,
typename ValueT,
typename FmtT = std::format_string<ValueT>>
requires(std::same_as<FmtT, std::format_string<ValueT>> || std::same_as<FmtT, std::string_view>)
mcc_error_c auto operator()(this SelfT&& self, R& output, ValueT&& value, FmtT fmt = "{}")
{ {
return std::forward<SelfT>(self).operator=(output, std::forward<ValueT>(value)); return std::forward<SelfT>(self).operator=(output, std::forward<ValueT>(value), std::move(fmt));
} }
}; };
@@ -23,6 +27,10 @@ template <typename T>
concept mcc_serializer_c = std::derived_from<T, mcc_serializer_interface_t>; concept mcc_serializer_c = std::derived_from<T, mcc_serializer_interface_t>;
template <typename VT>
class MccSerializer;
template <typename VT> template <typename VT>
class MccSerializer : public mcc_serializer_interface_t class MccSerializer : public mcc_serializer_interface_t
{ {
@@ -35,10 +43,15 @@ public:
~MccSerializer() = default; ~MccSerializer() = default;
error_t operator()(traits::mcc_output_char_range auto& output, VT&& value) template <typename FmtT = std::format_string<VT>>
error_t operator()(traits::mcc_output_char_range auto& output, VT&& value, FmtT fmt = "{}")
requires std::formattable<VT, char> requires std::formattable<VT, char>
{ {
std::format_to(std::back_inserter(output), "{}", value); if constexpr (std::same_as<FmtT, std::format_string<VT>>) {
std::format_to(std::back_inserter(output), fmt, value);
} else if constexpr (std::same_as<FmtT, std::string_view>) {
std::vformat_to(std::back_inserter(output), fmt, std::make_format_args(value));
}
return {}; return {};
} }
@@ -48,7 +61,6 @@ protected:
}; };
template <mcc_angle_c T> template <mcc_angle_c T>
class MccSerializer<T> : public mcc_serializer_interface_t class MccSerializer<T> : public mcc_serializer_interface_t
{ {