Where Online Learning is simpler!
The C and C++ Include Header Files
cat -n /usr/include/c++/15/bits/formatfwd.h
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