30 #ifndef _GLIBCXX_FORMAT_FWD_H 31 #define _GLIBCXX_FORMAT_FWD_H 1 33 #ifdef _GLIBCXX_SYSHDR 34 #pragma GCC system_header 38 #ifdef __glibcxx_format // C++ >= 20 && HOSTED 41 #include <type_traits> 42 #if __glibcxx_format_ranges // C++ >= 23 && HOSTED 46 namespace std _GLIBCXX_VISIBILITY(default)
48 _GLIBCXX_BEGIN_NAMESPACE_VERSION
51 template<
typename _Out,
typename _CharT>
class basic_format_context;
54 template<
typename _CharT>
class basic_format_parse_context;
57 template<
typename _Tp,
typename _CharT =
char>
struct formatter;
61 #ifdef _GLIBCXX_USE_WCHAR_T 62 template<
typename _CharT>
63 concept __char = same_as<_CharT, char> || same_as<_CharT, wchar_t>;
65 template<
typename _CharT>
66 concept __char = same_as<_CharT, char>;
69 enum class _Align : unsigned char {
77 template<
typename _CharT>
struct _Spec;
79 template<__
char _CharT>
struct __formatter_str;
80 template<__
char _CharT>
struct __formatter_int;
81 template<__
char _CharT>
struct __formatter_ptr;
83 template<
typename _Tp,
typename _Context,
85 =
typename _Context::template formatter_type<remove_const_t<_Tp>>,
86 typename _ParseContext
87 = basic_format_parse_context<typename _Context::char_type>>
88 concept __parsable_with
89 = semiregular<_Formatter>
90 && requires (_Formatter __f, _ParseContext __pc)
92 { __f.parse(__pc) } -> same_as<typename _ParseContext::iterator>;
95 template<
typename _Tp,
typename _Context,
97 =
typename _Context::template formatter_type<remove_const_t<_Tp>>,
98 typename _ParseContext
99 = basic_format_parse_context<typename _Context::char_type>>
100 concept __formattable_with
101 = semiregular<_Formatter>
102 && requires (
const _Formatter __cf, _Tp&& __t, _Context __fc)
104 { __cf.format(__t, __fc) } -> same_as<typename _Context::iterator>;
108 template<
typename _CharT>
110 template<
typename _CharT>
111 using _Iter_for_t =
typename _Iter_for<_CharT>::type;
113 template<
typename _Tp,
typename _CharT,
114 typename _Context = basic_format_context<_Iter_for_t<_CharT>, _CharT>>
115 concept __formattable_impl
116 = __parsable_with<_Tp, _Context> && __formattable_with<_Tp, _Context>;
118 template<
typename _Formatter>
119 concept __has_debug_format = requires(_Formatter __f)
121 __f.set_debug_format();
126 #if __glibcxx_format_ranges // C++ >= 23 && HOSTED 128 template<
typename _Tp,
typename _CharT>
130 = __format::__formattable_impl<remove_reference_t<_Tp>, _CharT>;
132 template<
typename _Tp, __format::__
char _CharT =
char>
133 requires same_as<remove_cvref_t<_Tp>, _Tp> && formattable<_Tp, _CharT>
134 class range_formatter;
139 template<
typename _Rg,
typename _CharT>
140 concept __const_formattable_range
141 = ranges::input_range<const _Rg>
142 && formattable<ranges::range_reference_t<const _Rg>, _CharT>;
146 template<
typename _Rg,
typename _CharT>
147 concept __simply_formattable_range
148 = __const_formattable_range<_Rg, _CharT>
149 && same_as<remove_cvref_t<ranges::range_reference_t<_Rg>>,
150 remove_cvref_t<ranges::range_reference_t<const _Rg>>>;
152 template<
typename _Rg,
typename _CharT>
153 using __maybe_const_range
154 = __conditional_t<__const_formattable_range<_Rg, _CharT>,
const _Rg, _Rg>;
156 template<
typename _Tp,
typename _CharT>
158 = __conditional_t<formattable<const _Tp, _CharT>,
const _Tp, _Tp>;
163 enum class range_format {
181 template<
typename _Rg>
182 constexpr
auto format_kind = []{
183 static_assert(
false,
"cannot use primary template of 'std::format_kind'");
184 return type_identity<_Rg>{};
186 #endif // format_ranges 188 #if __glibcxx_print >= 202403L 190 constexpr
bool enable_nonlocking_formatter_optimization =
false;
193 _GLIBCXX_END_NAMESPACE_VERSION
195 #endif // __glibcxx_format 196 #endif // _GLIBCXX_FORMAT_FWD_H basic_string< char > string
A string of char.
ISO C++ entities toplevel namespace is std.