libstdc++
formatfwd.h
Go to the documentation of this file.
1// <format> Formatting -*- C++ -*-
2
3// Copyright The GNU Toolchain Authors.
4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file bits/formatfwd.h
26 * This is an internal header file, included by other library headers.
27 * Do not attempt to use it directly. @headername{format}
28 */
29
30#ifndef _GLIBCXX_FORMAT_FWD_H
31#define _GLIBCXX_FORMAT_FWD_H 1
32
33#ifdef _GLIBCXX_SYSHDR
34#pragma GCC system_header
35#endif
36
37// <bits/version.h> must have been included before this header:
38#ifdef __glibcxx_format // C++ >= 20 && HOSTED
39
40#include <concepts>
41#include <type_traits>
42#if __glibcxx_format_ranges // C++ >= 23 && HOSTED
43# include <bits/ranges_base.h> // input_range, range_reference_t
44#endif
45
46namespace std _GLIBCXX_VISIBILITY(default)
47{
48_GLIBCXX_BEGIN_NAMESPACE_VERSION
49
50 // [format.context], class template basic_format_context
51 template<typename _Out, typename _CharT> class basic_format_context;
52
53 // [format.parse.ctx], class template basic_format_parse_context
54 template<typename _CharT> class basic_format_parse_context;
55
56 // [format.formatter], formatter
57 template<typename _Tp, typename _CharT = char> struct formatter;
58
59/// @cond undocumented
60 [[noreturn]]
61 inline void
62 __throw_format_error(const char* __what);
63
64namespace __format
65{
66#ifdef _GLIBCXX_USE_WCHAR_T
67 template<typename _CharT>
68 concept __char = same_as<_CharT, char> || same_as<_CharT, wchar_t>;
69#else
70 template<typename _CharT>
71 concept __char = same_as<_CharT, char>;
72#endif
73
74 enum class _Align : unsigned char {
75 _Align_default,
76 _Align_left,
77 _Align_right,
78 _Align_centre,
79 };
80 using enum _Align;
81
82 template<typename _CharT> struct _Spec;
83
84 template<__char _CharT> struct __formatter_str;
85 template<__char _CharT> struct __formatter_int;
86 template<__char _CharT> struct __formatter_ptr;
87
88 template<typename _Tp, typename _Context,
89 typename _Formatter
90 = typename _Context::template formatter_type<remove_const_t<_Tp>>,
91 typename _ParseContext
92 = basic_format_parse_context<typename _Context::char_type>>
93 concept __parsable_with
94 = semiregular<_Formatter>
95 && requires (_Formatter __f, _ParseContext __pc)
96 {
97 { __f.parse(__pc) } -> same_as<typename _ParseContext::iterator>;
98 };
99
100 template<typename _Tp, typename _Context,
101 typename _Formatter
102 = typename _Context::template formatter_type<remove_const_t<_Tp>>,
103 typename _ParseContext
104 = basic_format_parse_context<typename _Context::char_type>>
105 concept __formattable_with
106 = semiregular<_Formatter>
107 && requires (const _Formatter __cf, _Tp&& __t, _Context __fc)
108 {
109 { __cf.format(__t, __fc) } -> same_as<typename _Context::iterator>;
110 };
111
112 // An unspecified output iterator type used in the `formattable` concept.
113 template<typename _CharT>
114 struct _Iter_for;
115 template<typename _CharT>
116 using _Iter_for_t = typename _Iter_for<_CharT>::type;
117
118 template<typename _Tp, typename _CharT,
119 typename _Context = basic_format_context<_Iter_for_t<_CharT>, _CharT>>
120 concept __formattable_impl
121 = __parsable_with<_Tp, _Context> && __formattable_with<_Tp, _Context>;
122
123 template<typename _Formatter>
124 concept __has_debug_format = requires(_Formatter __f)
125 {
126 __f.set_debug_format();
127 };
128} // namespace __format
129/// @endcond
130
131#if __glibcxx_format_ranges // C++ >= 23 && HOSTED
132 // [format.formattable], concept formattable
133 template<typename _Tp, typename _CharT>
134 concept formattable
135 = __format::__formattable_impl<remove_reference_t<_Tp>, _CharT>;
136
137 template<typename _Tp, __format::__char _CharT = char>
138 requires same_as<remove_cvref_t<_Tp>, _Tp> && formattable<_Tp, _CharT>
139 class range_formatter;
140
141/// @cond undocumented
142namespace __format
143{
144 template<typename _Rg, typename _CharT>
145 concept __const_formattable_range
146 = ranges::input_range<const _Rg>
147 && formattable<ranges::range_reference_t<const _Rg>, _CharT>;
148
149 // _Rg& and const _Rg& are both formattable and use same formatter
150 // specialization for their references.
151 template<typename _Rg, typename _CharT>
152 concept __simply_formattable_range
153 = __const_formattable_range<_Rg, _CharT>
154 && same_as<remove_cvref_t<ranges::range_reference_t<_Rg>>,
155 remove_cvref_t<ranges::range_reference_t<const _Rg>>>;
156
157 template<typename _Rg, typename _CharT>
158 using __maybe_const_range
159 = __conditional_t<__const_formattable_range<_Rg, _CharT>, const _Rg, _Rg>;
160
161 template<typename _Tp, typename _CharT>
162 using __maybe_const
163 = __conditional_t<formattable<const _Tp, _CharT>, const _Tp, _Tp>;
164}
165
166 // [format.range], formatting of ranges
167 // [format.range.fmtkind], variable template format_kind
168 enum class range_format {
169 disabled,
170 map,
171 set,
172 sequence,
173 string,
174 debug_string
175 };
176
177 /** @brief A constant determining how a range should be formatted.
178 *
179 * The primary template of `std::format_kind` cannot be instantiated.
180 * There is a partial specialization for input ranges and you can
181 * specialize the variable template for your own cv-unqualified types
182 * that satisfy the `ranges::input_range` concept.
183 *
184 * @since C++23
185 */
186 template<typename _Rg>
187 constexpr auto format_kind = []{
188 static_assert(false, "cannot use primary template of 'std::format_kind'");
189 return type_identity<_Rg>{};
190 }();
191#endif // format_ranges
192
193_GLIBCXX_END_NAMESPACE_VERSION
194} // namespace std
195#endif // __glibcxx_format
196#endif // _GLIBCXX_FORMAT_FWD_H
ISO C++ entities toplevel namespace is std.