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 /// @cond undocumented
60 namespace __format
61 {
62 #ifdef _GLIBCXX_USE_WCHAR_T
63  template<typename _CharT>
64  concept __char = same_as<_CharT, char> || same_as<_CharT, wchar_t>;
65 #else
66  template<typename _CharT>
67  concept __char = same_as<_CharT, char>;
68 #endif
69 
70  template<typename _Tp, typename _Context,
71  typename _Formatter
72  = typename _Context::template formatter_type<remove_const_t<_Tp>>,
73  typename _ParseContext
74  = basic_format_parse_context<typename _Context::char_type>>
75  concept __parsable_with
76  = semiregular<_Formatter>
77  && requires (_Formatter __f, _ParseContext __pc)
78  {
79  { __f.parse(__pc) } -> same_as<typename _ParseContext::iterator>;
80  };
81 
82  template<typename _Tp, typename _Context,
83  typename _Formatter
84  = typename _Context::template formatter_type<remove_const_t<_Tp>>,
85  typename _ParseContext
86  = basic_format_parse_context<typename _Context::char_type>>
87  concept __formattable_with
88  = semiregular<_Formatter>
89  && requires (const _Formatter __cf, _Tp&& __t, _Context __fc)
90  {
91  { __cf.format(__t, __fc) } -> same_as<typename _Context::iterator>;
92  };
93 
94  // An unspecified output iterator type used in the `formattable` concept.
95  template<typename _CharT>
96  struct _Iter_for;
97  template<typename _CharT>
98  using _Iter_for_t = typename _Iter_for<_CharT>::type;
99 
100  template<typename _Tp, typename _CharT,
101  typename _Context = basic_format_context<_Iter_for_t<_CharT>, _CharT>>
102  concept __formattable_impl
103  = __parsable_with<_Tp, _Context> && __formattable_with<_Tp, _Context>;
104 
105  template<typename _Formatter>
106  concept __has_debug_format = requires(_Formatter __f)
107  {
108  __f.set_debug_format();
109  };
110 
111  template<__char _CharT>
112  struct __formatter_int;
113 } // namespace __format
114 /// @endcond
115 
116 #if __glibcxx_format_ranges // C++ >= 23 && HOSTED
117  // [format.formattable], concept formattable
118  template<typename _Tp, typename _CharT>
119  concept formattable
120  = __format::__formattable_impl<remove_reference_t<_Tp>, _CharT>;
121 
122  template<typename _Tp, __format::__char _CharT = char>
123  requires same_as<remove_cvref_t<_Tp>, _Tp> && formattable<_Tp, _CharT>
124  class range_formatter;
125 
126 /// @cond undocumented
127 namespace __format
128 {
129  template<typename _Rg, typename _CharT>
130  concept __const_formattable_range
131  = ranges::input_range<const _Rg>
132  && formattable<ranges::range_reference_t<const _Rg>, _CharT>;
133 
134  template<typename _Rg, typename _CharT>
135  using __maybe_const_range
136  = __conditional_t<__const_formattable_range<_Rg, _CharT>, const _Rg, _Rg>;
137 
138  template<typename _Tp, typename _CharT>
139  using __maybe_const
140  = __conditional_t<formattable<const _Tp, _CharT>, const _Tp, _Tp>;
141 }
142 #endif // format_ranges
143 
144 
145 _GLIBCXX_END_NAMESPACE_VERSION
146 } // namespace std
147 #endif // __glibcxx_format
148 #endif // _GLIBCXX_FORMAT_FWD_H
ISO C++ entities toplevel namespace is std.