1e78f53d1SNikolas Klauser// -*- C++ -*- 2e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 3e78f53d1SNikolas Klauser// 4e78f53d1SNikolas Klauser// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5e78f53d1SNikolas Klauser// See https://llvm.org/LICENSE.txt for license information. 6e78f53d1SNikolas Klauser// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7e78f53d1SNikolas Klauser// 8e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 9e78f53d1SNikolas Klauser 10*ce777190SNikolas Klauser#ifndef _LIBCPP___CXX03_FORMAT 11*ce777190SNikolas Klauser#define _LIBCPP___CXX03_FORMAT 12e78f53d1SNikolas Klauser 13e78f53d1SNikolas Klauser/* 14e78f53d1SNikolas Klauser 15e78f53d1SNikolas Klausernamespace std { 16e78f53d1SNikolas Klauser // [format.context], class template basic_format_context 17e78f53d1SNikolas Klauser template<class Out, class charT> class basic_format_context; 18e78f53d1SNikolas Klauser using format_context = basic_format_context<unspecified, char>; 19e78f53d1SNikolas Klauser using wformat_context = basic_format_context<unspecified, wchar_t>; 20e78f53d1SNikolas Klauser 21e78f53d1SNikolas Klauser // [format.args], class template basic_format_args 22e78f53d1SNikolas Klauser template<class Context> class basic_format_args; 23e78f53d1SNikolas Klauser using format_args = basic_format_args<format_context>; 24e78f53d1SNikolas Klauser using wformat_args = basic_format_args<wformat_context>; 25e78f53d1SNikolas Klauser 26e78f53d1SNikolas Klauser // [format.fmt.string], class template basic_format_string 27e78f53d1SNikolas Klauser template<class charT, class... Args> 28e78f53d1SNikolas Klauser struct basic_format_string { // since C++23, exposition only before C++23 29e78f53d1SNikolas Klauser private: 30e78f53d1SNikolas Klauser basic_string_view<charT> str; // exposition only 31e78f53d1SNikolas Klauser 32e78f53d1SNikolas Klauser public: 33e78f53d1SNikolas Klauser template<class T> consteval basic_format_string(const T& s); 34e78f53d1SNikolas Klauser basic_format_string(runtime-format-string<charT> s) noexcept : str(s.str) {} // since C++26 35e78f53d1SNikolas Klauser 36e78f53d1SNikolas Klauser constexpr basic_string_view<charT> get() const noexcept { return str; } 37e78f53d1SNikolas Klauser }; 38e78f53d1SNikolas Klauser template<class... Args> 39e78f53d1SNikolas Klauser using format_string = // since C++23, exposition only before C++23 40e78f53d1SNikolas Klauser basic_format_string<char, type_identity_t<Args>...>; 41e78f53d1SNikolas Klauser template<class... Args> 42e78f53d1SNikolas Klauser using wformat_string = // since C++23, exposition only before C++23 43e78f53d1SNikolas Klauser basic_format_string<wchar_t, type_identity_t<Args>...>; 44e78f53d1SNikolas Klauser 45e78f53d1SNikolas Klauser template<class charT> struct runtime-format-string { // since C++26, exposition-only 46e78f53d1SNikolas Klauser private: 47e78f53d1SNikolas Klauser basic_string_view<charT> str; // exposition-only 48e78f53d1SNikolas Klauser 49e78f53d1SNikolas Klauser public: 50e78f53d1SNikolas Klauser runtime-format-string(basic_string_view<charT> s) noexcept : str(s) {} 51e78f53d1SNikolas Klauser 52e78f53d1SNikolas Klauser runtime-format-string(const runtime-format-string&) = delete; 53e78f53d1SNikolas Klauser runtime-format-string& operator=(const runtime-format-string&) = delete; 54e78f53d1SNikolas Klauser }; 55e78f53d1SNikolas Klauser 56e78f53d1SNikolas Klauser runtime-format-string<char> runtime_format(string_view fmt) noexcept { 57e78f53d1SNikolas Klauser return fmt; 58e78f53d1SNikolas Klauser } 59e78f53d1SNikolas Klauser runtime-format-string<wchar_t> runtime_format(wstring_view fmt) noexcept { 60e78f53d1SNikolas Klauser return fmt; 61e78f53d1SNikolas Klauser } 62e78f53d1SNikolas Klauser 63e78f53d1SNikolas Klauser // [format.functions], formatting functions 64e78f53d1SNikolas Klauser template<class... Args> 65e78f53d1SNikolas Klauser string format(format-string<Args...> fmt, Args&&... args); 66e78f53d1SNikolas Klauser template<class... Args> 67e78f53d1SNikolas Klauser wstring format(wformat-string<Args...> fmt, Args&&... args); 68e78f53d1SNikolas Klauser template<class... Args> 69e78f53d1SNikolas Klauser string format(const locale& loc, format-string<Args...> fmt, Args&&... args); 70e78f53d1SNikolas Klauser template<class... Args> 71e78f53d1SNikolas Klauser wstring format(const locale& loc, wformat-string<Args...> fmt, Args&&... args); 72e78f53d1SNikolas Klauser 73e78f53d1SNikolas Klauser string vformat(string_view fmt, format_args args); 74e78f53d1SNikolas Klauser wstring vformat(wstring_view fmt, wformat_args args); 75e78f53d1SNikolas Klauser string vformat(const locale& loc, string_view fmt, format_args args); 76e78f53d1SNikolas Klauser wstring vformat(const locale& loc, wstring_view fmt, wformat_args args); 77e78f53d1SNikolas Klauser 78e78f53d1SNikolas Klauser template<class Out, class... Args> 79e78f53d1SNikolas Klauser Out format_to(Out out, format-string<Args...> fmt, Args&&... args); 80e78f53d1SNikolas Klauser template<class Out, class... Args> 81e78f53d1SNikolas Klauser Out format_to(Out out, wformat-string<Args...> fmt, Args&&... args); 82e78f53d1SNikolas Klauser template<class Out, class... Args> 83e78f53d1SNikolas Klauser Out format_to(Out out, const locale& loc, format-string<Args...> fmt, Args&&... args); 84e78f53d1SNikolas Klauser template<class Out, class... Args> 85e78f53d1SNikolas Klauser Out format_to(Out out, const locale& loc, wformat-string<Args...> fmt, Args&&... args); 86e78f53d1SNikolas Klauser 87e78f53d1SNikolas Klauser template<class Out> 88e78f53d1SNikolas Klauser Out vformat_to(Out out, string_view fmt, format_args args); 89e78f53d1SNikolas Klauser template<class Out> 90e78f53d1SNikolas Klauser Out vformat_to(Out out, wstring_view fmt, wformat_args args); 91e78f53d1SNikolas Klauser template<class Out> 92e78f53d1SNikolas Klauser Out vformat_to(Out out, const locale& loc, string_view fmt, 93e78f53d1SNikolas Klauser format_args char> args); 94e78f53d1SNikolas Klauser template<class Out> 95e78f53d1SNikolas Klauser Out vformat_to(Out out, const locale& loc, wstring_view fmt, 96e78f53d1SNikolas Klauser wformat_args args); 97e78f53d1SNikolas Klauser 98e78f53d1SNikolas Klauser template<class Out> struct format_to_n_result { 99e78f53d1SNikolas Klauser Out out; 100e78f53d1SNikolas Klauser iter_difference_t<Out> size; 101e78f53d1SNikolas Klauser }; 102e78f53d1SNikolas Klauser template<class Out, class... Args> 103e78f53d1SNikolas Klauser format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, 104e78f53d1SNikolas Klauser format-string<Args...> fmt, Args&&... args); 105e78f53d1SNikolas Klauser template<class Out, class... Args> 106e78f53d1SNikolas Klauser format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, 107e78f53d1SNikolas Klauser wformat-string<Args...> fmt, Args&&... args); 108e78f53d1SNikolas Klauser template<class Out, class... Args> 109e78f53d1SNikolas Klauser format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, 110e78f53d1SNikolas Klauser const locale& loc, format-string<Args...> fmt, 111e78f53d1SNikolas Klauser Args&&... args); 112e78f53d1SNikolas Klauser template<class Out, class... Args> 113e78f53d1SNikolas Klauser format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, 114e78f53d1SNikolas Klauser const locale& loc, wformat-string<Args...> fmt, 115e78f53d1SNikolas Klauser Args&&... args); 116e78f53d1SNikolas Klauser 117e78f53d1SNikolas Klauser template<class... Args> 118e78f53d1SNikolas Klauser size_t formatted_size(format-string<Args...> fmt, Args&&... args); 119e78f53d1SNikolas Klauser template<class... Args> 120e78f53d1SNikolas Klauser size_t formatted_size(wformat-string<Args...> fmt, Args&&... args); 121e78f53d1SNikolas Klauser template<class... Args> 122e78f53d1SNikolas Klauser size_t formatted_size(const locale& loc, format-string<Args...> fmt, Args&&... args); 123e78f53d1SNikolas Klauser template<class... Args> 124e78f53d1SNikolas Klauser size_t formatted_size(const locale& loc, wformat-string<Args...> fmt, Args&&... args); 125e78f53d1SNikolas Klauser 126e78f53d1SNikolas Klauser // [format.formatter], formatter 127e78f53d1SNikolas Klauser template<class T, class charT = char> struct formatter; 128e78f53d1SNikolas Klauser 129e78f53d1SNikolas Klauser // [format.parse.ctx], class template basic_format_parse_context 130e78f53d1SNikolas Klauser template<class charT> class basic_format_parse_context; 131e78f53d1SNikolas Klauser using format_parse_context = basic_format_parse_context<char>; 132e78f53d1SNikolas Klauser using wformat_parse_context = basic_format_parse_context<wchar_t>; 133e78f53d1SNikolas Klauser 134e78f53d1SNikolas Klauser // [format.range], formatting of ranges 135e78f53d1SNikolas Klauser // [format.range.fmtkind], variable template format_kind 136e78f53d1SNikolas Klauser enum class range_format { // since C++23 137e78f53d1SNikolas Klauser disabled, 138e78f53d1SNikolas Klauser map, 139e78f53d1SNikolas Klauser set, 140e78f53d1SNikolas Klauser sequence, 141e78f53d1SNikolas Klauser string, 142e78f53d1SNikolas Klauser debug_string 143e78f53d1SNikolas Klauser }; 144e78f53d1SNikolas Klauser 145e78f53d1SNikolas Klauser template<class R> 146e78f53d1SNikolas Klauser constexpr unspecified format_kind = unspecified; // since C++23 147e78f53d1SNikolas Klauser 148e78f53d1SNikolas Klauser template<ranges::input_range R> 149e78f53d1SNikolas Klauser requires same_as<R, remove_cvref_t<R>> 150e78f53d1SNikolas Klauser constexpr range_format format_kind<R> = see below; // since C++23 151e78f53d1SNikolas Klauser 152e78f53d1SNikolas Klauser // [format.range.formatter], class template range_formatter 153e78f53d1SNikolas Klauser template<class T, class charT = char> 154e78f53d1SNikolas Klauser requires same_as<remove_cvref_t<T>, T> && formattable<T, charT> 155e78f53d1SNikolas Klauser class range_formatter; // since C++23 156e78f53d1SNikolas Klauser 157e78f53d1SNikolas Klauser // [format.range.fmtdef], class template range-default-formatter 158e78f53d1SNikolas Klauser template<range_format K, ranges::input_range R, class charT> 159e78f53d1SNikolas Klauser struct range-default-formatter; // exposition only, since C++23 160e78f53d1SNikolas Klauser 161e78f53d1SNikolas Klauser // [format.range.fmtmap], [format.range.fmtset], [format.range.fmtstr], 162e78f53d1SNikolas Klauser // specializations for maps, sets, and strings 163e78f53d1SNikolas Klauser template<ranges::input_range R, class charT> 164e78f53d1SNikolas Klauser requires (format_kind<R> != range_format::disabled) && 165e78f53d1SNikolas Klauser formattable<ranges::range_reference_t<R>, charT> 166e78f53d1SNikolas Klauser struct formatter<R, charT> : range-default-formatter<format_kind<R>, R, charT> { }; // since C++23 167e78f53d1SNikolas Klauser 168e78f53d1SNikolas Klauser // [format.arguments], arguments 169e78f53d1SNikolas Klauser // [format.arg], class template basic_format_arg 170e78f53d1SNikolas Klauser template<class Context> class basic_format_arg; 171e78f53d1SNikolas Klauser 172e78f53d1SNikolas Klauser template<class Visitor, class Context> 173e78f53d1SNikolas Klauser see below visit_format_arg(Visitor&& vis, basic_format_arg<Context> arg); // Deprecated in C++26 174e78f53d1SNikolas Klauser 175e78f53d1SNikolas Klauser // [format.arg.store], class template format-arg-store 176e78f53d1SNikolas Klauser template<class Context, class... Args> struct format-arg-store; // exposition only 177e78f53d1SNikolas Klauser 178e78f53d1SNikolas Klauser template<class Context = format_context, class... Args> 179e78f53d1SNikolas Klauser format-arg-store<Context, Args...> 180e78f53d1SNikolas Klauser make_format_args(Args&... args); 181e78f53d1SNikolas Klauser template<class... Args> 182e78f53d1SNikolas Klauser format-arg-store<wformat_context, Args...> 183e78f53d1SNikolas Klauser make_wformat_args(Args&... args); 184e78f53d1SNikolas Klauser 185e78f53d1SNikolas Klauser // [format.error], class format_error 186e78f53d1SNikolas Klauser class format_error; 187e78f53d1SNikolas Klauser} 188e78f53d1SNikolas Klauser 189e78f53d1SNikolas Klauser*/ 190e78f53d1SNikolas Klauser 19173fbae83SNikolas Klauser#include <__cxx03/__config> 192e78f53d1SNikolas Klauser 193e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 20 19473fbae83SNikolas Klauser# include <__cxx03/__format/buffer.h> 19573fbae83SNikolas Klauser# include <__cxx03/__format/concepts.h> 19673fbae83SNikolas Klauser# include <__cxx03/__format/container_adaptor.h> 19773fbae83SNikolas Klauser# include <__cxx03/__format/enable_insertable.h> 19873fbae83SNikolas Klauser# include <__cxx03/__format/escaped_output_table.h> 19973fbae83SNikolas Klauser# include <__cxx03/__format/extended_grapheme_cluster_table.h> 20073fbae83SNikolas Klauser# include <__cxx03/__format/format_arg.h> 20173fbae83SNikolas Klauser# include <__cxx03/__format/format_arg_store.h> 20273fbae83SNikolas Klauser# include <__cxx03/__format/format_args.h> 20373fbae83SNikolas Klauser# include <__cxx03/__format/format_context.h> 20473fbae83SNikolas Klauser# include <__cxx03/__format/format_error.h> 20573fbae83SNikolas Klauser# include <__cxx03/__format/format_functions.h> 20673fbae83SNikolas Klauser# include <__cxx03/__format/format_parse_context.h> 20773fbae83SNikolas Klauser# include <__cxx03/__format/format_string.h> 20873fbae83SNikolas Klauser# include <__cxx03/__format/format_to_n_result.h> 20973fbae83SNikolas Klauser# include <__cxx03/__format/formatter.h> 21073fbae83SNikolas Klauser# include <__cxx03/__format/formatter_bool.h> 21173fbae83SNikolas Klauser# include <__cxx03/__format/formatter_char.h> 21273fbae83SNikolas Klauser# include <__cxx03/__format/formatter_floating_point.h> 21373fbae83SNikolas Klauser# include <__cxx03/__format/formatter_integer.h> 21473fbae83SNikolas Klauser# include <__cxx03/__format/formatter_pointer.h> 21573fbae83SNikolas Klauser# include <__cxx03/__format/formatter_string.h> 21673fbae83SNikolas Klauser# include <__cxx03/__format/formatter_tuple.h> 21773fbae83SNikolas Klauser# include <__cxx03/__format/parser_std_format_spec.h> 21873fbae83SNikolas Klauser# include <__cxx03/__format/range_default_formatter.h> 21973fbae83SNikolas Klauser# include <__cxx03/__format/range_formatter.h> 22073fbae83SNikolas Klauser# include <__cxx03/__format/unicode.h> 22173fbae83SNikolas Klauser# include <__cxx03/__fwd/format.h> 222e78f53d1SNikolas Klauser#endif 223e78f53d1SNikolas Klauser 22473fbae83SNikolas Klauser#include <__cxx03/version> 225e78f53d1SNikolas Klauser 226e78f53d1SNikolas Klauser#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 227e78f53d1SNikolas Klauser# pragma GCC system_header 228e78f53d1SNikolas Klauser#endif 229e78f53d1SNikolas Klauser 230e78f53d1SNikolas Klauser#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 23173fbae83SNikolas Klauser# include <__cxx03/array> 23273fbae83SNikolas Klauser# include <__cxx03/cctype> 23373fbae83SNikolas Klauser# include <__cxx03/cerrno> 23473fbae83SNikolas Klauser# include <__cxx03/clocale> 23573fbae83SNikolas Klauser# include <__cxx03/cmath> 23673fbae83SNikolas Klauser# include <__cxx03/cstddef> 23773fbae83SNikolas Klauser# include <__cxx03/cstdint> 23873fbae83SNikolas Klauser# include <__cxx03/cstdlib> 23973fbae83SNikolas Klauser# include <__cxx03/cstring> 24073fbae83SNikolas Klauser# include <__cxx03/initializer_list> 24173fbae83SNikolas Klauser# include <__cxx03/limits> 24273fbae83SNikolas Klauser# include <__cxx03/locale> 24373fbae83SNikolas Klauser# include <__cxx03/new> 24473fbae83SNikolas Klauser# include <__cxx03/optional> 24573fbae83SNikolas Klauser# include <__cxx03/queue> 24673fbae83SNikolas Klauser# include <__cxx03/stack> 24773fbae83SNikolas Klauser# include <__cxx03/stdexcept> 24873fbae83SNikolas Klauser# include <__cxx03/string> 24973fbae83SNikolas Klauser# include <__cxx03/string_view> 25073fbae83SNikolas Klauser# include <__cxx03/tuple> 251e78f53d1SNikolas Klauser 252e78f53d1SNikolas Klauser# if !defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS) 25373fbae83SNikolas Klauser# include <__cxx03/cwchar> 254e78f53d1SNikolas Klauser# endif 255e78f53d1SNikolas Klauser#endif 256e78f53d1SNikolas Klauser 257*ce777190SNikolas Klauser#endif // _LIBCPP___CXX03_FORMAT 258