Iros
 
Loading...
Searching...
No Matches
format_arg.h
Go to the documentation of this file.
1#pragma once
2
7#include "di/util/voidify.h"
9
10namespace di::format {
11template<concepts::Formattable... Types>
12using ConstexprFormatArg = Variant<Types&..., Void>;
13
14template<concepts::FormatContext Context>
15class ErasedArg {
16private:
17 using Encoding = meta::Encoding<Context>;
18
19 template<concepts::Formattable T>
20 constexpr static auto erased_format(void* value, FormatParseContext<Encoding>& parse_context, Context& context,
21 bool debug) -> di::Result<void> {
22 auto formatter = DI_TRY(format::formatter<T, Encoding>(parse_context, debug));
23 return formatter(context, *static_cast<meta::RemoveCVRef<T>*>(value));
24 }
25
26public:
27 template<concepts::Formattable T>
28 constexpr explicit ErasedArg(T&& value)
29 : m_pointer(util::voidify(util::addressof(value))), m_do_format(erased_format<T>) {}
30
31 constexpr auto do_format(FormatParseContext<Encoding>& parse_context, Context& context, bool debug)
32 -> Result<void> {
33 return m_do_format(m_pointer, parse_context, context, debug);
34 }
35
36private:
37 void* m_pointer;
38 Result<void> (*m_do_format)(void*, FormatParseContext<Encoding>&, Context&, bool debug);
39};
40
41template<concepts::FormatContext Context>
43 long long int, unsigned long long int, /* float, double, long double, */
45}
Definition string_view_impl_forward_declaration.h:7
Definition format_arg.h:15
constexpr ErasedArg(T &&value)
Definition format_arg.h:28
constexpr auto do_format(FormatParseContext< Encoding > &parse_context, Context &context, bool debug) -> Result< void >
Definition format_arg.h:31
Definition format_parse_context.h:14
Definition variant_forward_declaration.h:6
#define DI_TRY(...)
Definition monad_try.h:13
Definition bounded_format_context.h:7
Variant< Types &..., Void > ConstexprFormatArg
Definition format_arg.h:12
constexpr auto formatter(FormatParseContext< Enc > &parse_context, bool debug=false)
Definition formatter.h:27
Variant< Void, bool, meta::EncodingCodePoint< meta::Encoding< Context > >, int, unsigned int, long long int, unsigned long long int, container::string::StringViewImpl< meta::Encoding< Context > >, void const *, ErasedArg< Context > > FormatArg
Definition format_arg.h:42
RemoveCV< RemoveReference< T > > RemoveCVRef
Definition core.h:74
meta::RemoveCVRef< T >::Encoding Encoding
Definition encoding.h:230
Definition vocab.h:96
Expected< T, Error > Result
Definition result.h:8
constexpr auto voidify
Definition voidify.h:13
Definition void.h:6