di 0.1.0
Loading...
Searching...
No Matches
format_string_impl.h
Go to the documentation of this file.
1#pragma once
2
7#include "di/meta/constexpr.h"
8#include "di/meta/util.h"
10
11namespace di::format {
12namespace detail {
13 template<concepts::Encoding Enc, concepts::Formattable... Args>
14 class FormatStringImpl {
15 private:
16 using StringView = container::string::StringViewImpl<Enc>;
17
18 public:
19 consteval FormatStringImpl(StringView view) : m_view(view) {
20 auto parse_context = format::FormatParseContext<Enc> { view, sizeof...(Args) };
21 for (auto part : parse_context) {
22 if (!part) {
23 util::compile_time_fail<FixedString { "Invalid format string." }>();
24 } else if (part->index() == 0) {
25 continue;
26 }
27
28 if constexpr (sizeof...(Args) > 0) {
29 auto arg_index = util::get<1>(*part).index;
30 function::index_dispatch<void, sizeof...(Args)>(arg_index, [&]<size_t index>(Constexpr<index>) {
31 auto formatter = format::formatter<meta::At<meta::List<Args...>, index>>(parse_context);
32 if (!formatter) {
33 util::compile_time_fail<FixedString { "Invalid format string argument format." }>();
34 }
35 });
36 }
37 }
38 }
39
40 constexpr operator StringView() const { return m_view; }
41
42 constexpr auto encoding() const { return m_view.encoding(); }
43
44 private:
45 StringView m_view;
46 };
47
48 template<concepts::Encoding Enc, concepts::Formattable... Args>
49 class FormatStringWithLocationImpl {
50 private:
51 using StringView = container::string::StringViewImpl<Enc>;
52
53 public:
54 consteval FormatStringWithLocationImpl(StringView view,
55 util::SourceLocation location = util::SourceLocation::current())
56 : m_base(view), m_location(location) {}
57
58 constexpr operator StringView() const { return m_base; }
59
60 constexpr auto encoding() const { return m_base.encoding(); }
61 constexpr auto location() const { return m_location; }
62
63 private:
64 FormatStringImpl<Enc, Args...> m_base;
65 util::SourceLocation m_location;
66 };
67}
68
69template<concepts::Encoding Enc, concepts::Formattable... Args>
70using FormatStringImpl = detail::FormatStringImpl<Enc, meta::TypeIdentity<Args>...>;
71
72template<concepts::Encoding Enc, concepts::Formattable... Args>
73using FormatStringWithLocationImpl = detail::FormatStringWithLocationImpl<Enc, meta::TypeIdentity<Args>...>;
74}
75
76namespace di {
78}
constexpr auto encoding() const -> Enc
Definition string_view_impl.h:74
static consteval auto current(char const *file_name=__builtin_FILE(), char const *function_name=__builtin_FUNCTION(), unsigned int line=__builtin_LINE(), unsigned int column=__builtin_COLUMN()) -> SourceLocation
Definition source_location.h:12
Definition encoding.h:205
Definition formattable.h:9
string::StringViewImpl< string::Utf8Encoding > StringView
Definition string_view.h:12
FixedString(char const (&)[size]) -> FixedString< size - 1 >
Definition bounded_format_context.h:7
constexpr auto formatter(FormatParseContext< Enc > &parse_context, bool debug=false)
Definition formatter.h:27
detail::FormatStringImpl< Enc, meta::TypeIdentity< Args >... > FormatStringImpl
Definition format_string_impl.h:70
detail::FormatStringWithLocationImpl< Enc, meta::TypeIdentity< Args >... > FormatStringWithLocationImpl
Definition format_string_impl.h:73
constexpr auto index_dispatch
Definition index_dispatch.h:41
typename T::template At< index > At
Definition list.h:118
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
void compile_time_fail()
Definition compile_time_fail.h:7
Definition any_storable.h:9