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 
46 namespace 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 namespace __format
60 {
61 #ifdef _GLIBCXX_USE_WCHAR_T
62  template<typename _CharT>
63  concept __char = same_as<_CharT, char> || same_as<_CharT, wchar_t>;
64 #else
65  template<typename _CharT>
66  concept __char = same_as<_CharT, char>;
67 #endif
68 
69  enum class _Align : unsigned char {
70  _Align_default,
71  _Align_left,
72  _Align_right,
73  _Align_centre,
74  };
75  using enum _Align;
76 
77  template<typename _CharT> struct _Spec;
78 
79  template<__char _CharT> struct __formatter_str;
80  template<__char _CharT> struct __formatter_int;
81  template<__char _CharT> struct __formatter_ptr;
82 
83  template<typename _Tp, typename _Context,
84  typename _Formatter
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)
91  {
92  { __f.parse(__pc) } -> same_as<typename _ParseContext::iterator>;
93  };
94 
95  template<typename _Tp, typename _Context,
96  typename _Formatter
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)
103  {
104  { __cf.format(__t, __fc) } -> same_as<typename _Context::iterator>;
105  };
106 
107  // An unspecified output iterator type used in the `formattable` concept.
108  template<typename _CharT>
109  struct _Iter_for;
110  template<typename _CharT>
111  using _Iter_for_t = typename _Iter_for<_CharT>::type;
112 
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>;
117 
118  template<typename _Formatter>
119  concept __has_debug_format = requires(_Formatter __f)
120  {
121  __f.set_debug_format();
122  };
123 } // namespace __format
124 /// @endcond
125 
126 #if __glibcxx_format_ranges // C++ >= 23 && HOSTED
127  // [format.formattable], concept formattable
128  template<typename _Tp, typename _CharT>
129  concept formattable
130  = __format::__formattable_impl<remove_reference_t<_Tp>, _CharT>;
131 
132  template<typename _Tp, __format::__char _CharT = char>
133  requires same_as<remove_cvref_t<_Tp>, _Tp> && formattable<_Tp, _CharT>
134  class range_formatter;
135 
136 /// @cond undocumented
137 namespace __format
138 {
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>;
143 
144  // _Rg& and const _Rg& are both formattable and use same formatter
145  // specialization for their references.
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>>>;
151 
152  template<typename _Rg, typename _CharT>
153  using __maybe_const_range
154  = __conditional_t<__const_formattable_range<_Rg, _CharT>, const _Rg, _Rg>;
155 
156  template<typename _Tp, typename _CharT>
157  using __maybe_const
158  = __conditional_t<formattable<const _Tp, _CharT>, const _Tp, _Tp>;
159 }
160 
161  // [format.range], formatting of ranges
162  // [format.range.fmtkind], variable template format_kind
163  enum class range_format {
164  disabled,
165  map,
166  set,
167  sequence,
168  string,
169  debug_string
170  };
171 
172  /** @brief A constant determining how a range should be formatted.
173  *
174  * The primary template of `std::format_kind` cannot be instantiated.
175  * There is a partial specialization for input ranges and you can
176  * specialize the variable template for your own cv-unqualified types
177  * that satisfy the `ranges::input_range` concept.
178  *
179  * @since C++23
180  */
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>{};
185  }();
186 #endif // format_ranges
187 
188 #if __glibcxx_print >= 202403L
189  template<typename>
190  constexpr bool enable_nonlocking_formatter_optimization = false;
191 #endif
192 
193 _GLIBCXX_END_NAMESPACE_VERSION
194 } // namespace std
195 #endif // __glibcxx_format
196 #endif // _GLIBCXX_FORMAT_FWD_H
concepts
std::string
basic_string< char > string
A string of char.
Definition: stringfwd.h:74
std
ISO C++ entities toplevel namespace is std.
ranges_base.h