// Formatting -*- C++ -*- // Copyright The GNU Toolchain Authors. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // Under Section 7 of GPL version 3, you are granted additional // permissions described in the GCC Runtime Library Exception, version // 3.1, as published by the Free Software Foundation. // You should have received a copy of the GNU General Public License and // a copy of the GCC Runtime Library Exception along with this program; // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // . /** @file bits/formatfwd.h * This is an internal header file, included by other library headers. * Do not attempt to use it directly. @headername{format} */ #ifndef _GLIBCXX_FORMAT_FWD_H #define _GLIBCXX_FORMAT_FWD_H 1 #ifdef _GLIBCXX_SYSHDR #pragma GCC system_header #endif // must have been included before this header: #ifdef __glibcxx_format // C++ >= 20 && HOSTED #include #include #if __glibcxx_format_ranges // C++ >= 23 && HOSTED # include // input_range, range_reference_t #endif namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION // [format.context], class template basic_format_context template class basic_format_context; // [format.parse.ctx], class template basic_format_parse_context template class basic_format_parse_context; // [format.formatter], formatter template struct formatter; /// @cond undocumented [[noreturn]] inline void __throw_format_error(const char* __what); namespace __format { #ifdef _GLIBCXX_USE_WCHAR_T template concept __char = same_as<_CharT, char> || same_as<_CharT, wchar_t>; #else template concept __char = same_as<_CharT, char>; #endif enum _Align { _Align_default, _Align_left, _Align_right, _Align_centre, }; template struct _Spec; template<__char _CharT> struct __formatter_str; template<__char _CharT> struct __formatter_int; template<__char _CharT> struct __formatter_ptr; template>, typename _ParseContext = basic_format_parse_context> concept __parsable_with = semiregular<_Formatter> && requires (_Formatter __f, _ParseContext __pc) { { __f.parse(__pc) } -> same_as; }; template>, typename _ParseContext = basic_format_parse_context> concept __formattable_with = semiregular<_Formatter> && requires (const _Formatter __cf, _Tp&& __t, _Context __fc) { { __cf.format(__t, __fc) } -> same_as; }; // An unspecified output iterator type used in the `formattable` concept. template struct _Iter_for; template using _Iter_for_t = typename _Iter_for<_CharT>::type; template, _CharT>> concept __formattable_impl = __parsable_with<_Tp, _Context> && __formattable_with<_Tp, _Context>; template concept __has_debug_format = requires(_Formatter __f) { __f.set_debug_format(); }; } // namespace __format /// @endcond #if __glibcxx_format_ranges // C++ >= 23 && HOSTED // [format.formattable], concept formattable template concept formattable = __format::__formattable_impl, _CharT>; template requires same_as, _Tp> && formattable<_Tp, _CharT> class range_formatter; /// @cond undocumented namespace __format { template concept __const_formattable_range = ranges::input_range && formattable, _CharT>; // _Rg& and const _Rg& are both formattable and use same formatter // specialization for their references. template concept __simply_formattable_range = __const_formattable_range<_Rg, _CharT> && same_as>, remove_cvref_t>>; template using __maybe_const_range = __conditional_t<__const_formattable_range<_Rg, _CharT>, const _Rg, _Rg>; template using __maybe_const = __conditional_t, const _Tp, _Tp>; } #endif // format_ranges _GLIBCXX_END_NAMESPACE_VERSION } // namespace std #endif // __glibcxx_format #endif // _GLIBCXX_FORMAT_FWD_H