6#ifndef MIMICPP_PRINTING_FORMAT_HPP
7#define MIMICPP_PRINTING_FORMAT_HPP
15#ifndef MIMICPP_DETAIL_IS_MODULE
20 #include <type_traits>
23 #ifndef MIMICPP_CONFIG_USE_FMT
27 #if __has_include(<fmt/format.h>)
28 #include <fmt/format.h>
30 #error "The fmt formatting backend is explicitly enabled, but the include <fmt/format.h> can not be found."
40#if MIMICPP_DETAIL_IS_GCC \
55 template <
typename Iter,
typename T>
56 concept output_iterator = std::movable<Iter>
57 && std::indirectly_writable<Iter, T>
58 &&
requires(Iter iter) {
59 typename std::iter_difference_t<Iter>;
60 { ++iter } -> std::same_as<Iter&>;
62 } &&
requires(Iter iter, T&& value) {
63 *iter++ = std::forward<T>(value);
68 concept print_iterator = detail::output_iterator<T, CharT const&>;
74 template <
typename Pr
inter,
typename OutIter,
typename T>
76 &&
requires(OutIter out) {
78 Printer::print(out, std::declval<T&>())
79 } -> std::convertible_to<OutIter>;
83#ifndef MIMICPP_CONFIG_USE_FMT
87 template <
typename... Args>
88 using format_string = std::basic_format_string<CharT, std::type_identity_t<Args>...>;
90 using std::format_args;
92 using std::make_format_args;
94 using std::vformat_to;
96 template <
typename Char>
97 struct format_context;
99 template <
typename Char>
100 using format_context_t =
typename format_context<Char>::type;
103 struct format_context<char>
105 using type = std::format_context;
109 struct format_context<wchar_t>
111 using type = std::wformat_context;
124 template <
class T,
class Char>
125 concept formattable =
126 std::semiregular<std::formatter<std::remove_cvref_t<T>, Char>>
128 std::formatter<std::remove_cvref_t<T>, Char> formatter,
130 format_context_t<Char> formatContext,
131 std::basic_format_parse_context<Char> parseContext) {
132 { formatter.parse(parseContext) } -> std::same_as<typename std::basic_format_parse_context<Char>::iterator>;
134 std::as_const(formatter).format(t, formatContext)
135 } -> std::same_as<
typename std::remove_reference_t<
decltype(formatContext)>::iterator>;
144 template <
typename... Args>
145 using format_string = ::fmt::format_string<Args...>;
146 using vformat_string = ::fmt::basic_string_view<CharT>;
147 using ::fmt::format_args;
148 using ::fmt::formatter;
149 using ::fmt::make_format_args;
150 using ::fmt::vformat;
151 using ::fmt::vformat_to;
153 template <
class T,
class Char>
154 concept formattable =
requires {
155 requires ::fmt::is_formattable<std::remove_reference_t<T>, Char>::value;
163 template <
class T,
typename Char = CharT>
166 using detail::fmt::format_args;
167 using detail::fmt::format_string;
168 using detail::fmt::vformat_string;
169 using detail::fmt::formatter;
170 using detail::fmt::make_format_args;
171 using detail::fmt::vformat_to;
172 using detail::fmt::vformat;
175 OutIter
format_to(OutIter out, format_string<Args...>
const fmt, Args&&... args)
177 return detail::fmt::vformat_to(
180 format::make_format_args(args...));
183 template <
typename... Args>
186 return detail::fmt::vformat(
188 format::make_format_args(args...));
196 template <
typename T>
199 using printer_type = printing::PrintFn;
200 std::remove_reference_t<T> value;
203 constexpr auto& get() const noexcept
209 template <
typename T>
210 requires std::is_lvalue_reference_v<T>
211 struct fallback_formattable<T>
213 using printer_type = printing::PrintFn;
214 std::reference_wrapper<std::remove_reference_t<T>> ref;
217 constexpr auto& get() const noexcept
224 template <
typename T>
229 return std::forward<T>(target);
233 return detail::fallback_formattable<T>{std::forward<T>(target)};
237 template <
typename T>
244 using Target = mimicpp::format::detail::fallback_formattable<T>;
245 using Printer =
typename Target::printer_type;
247 static constexpr auto parse(
auto& ctx)
252 static constexpr auto format(Target
const& target,
auto& ctx)
254 return std::invoke(Printer{}, ctx.out(), target.get());
#define MIMICPP_DETAIL_MODULE_EXPORT
Definition Config.hpp:19
char CharT
Definition Fwd.hpp:395
std::basic_ostringstream< CharT, CharTraitsT > StringStreamT
Definition Format.hpp:38
std::basic_string_view< CharT, CharTraitsT > StringViewT
Definition Fwd.hpp:398
std::basic_string< CharT, CharTraitsT > StringT
Definition Fwd.hpp:397