1fe6060f1SDimitry Andric// -*- C++ -*- 2349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 3fe6060f1SDimitry Andric// 4fe6060f1SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5fe6060f1SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 6fe6060f1SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7fe6060f1SDimitry Andric// 8fe6060f1SDimitry Andric//===----------------------------------------------------------------------===// 9fe6060f1SDimitry Andric 10fe6060f1SDimitry Andric#ifndef _LIBCPP_FORMAT 11fe6060f1SDimitry Andric#define _LIBCPP_FORMAT 12fe6060f1SDimitry Andric 13fe6060f1SDimitry Andric/* 14fe6060f1SDimitry Andric 15fe6060f1SDimitry Andricnamespace std { 16349cc55cSDimitry Andric // [format.context], class template basic_format_context 1704eeddc0SDimitry Andric template<class Out, class charT> class basic_format_context; 18349cc55cSDimitry Andric using format_context = basic_format_context<unspecified, char>; 19349cc55cSDimitry Andric using wformat_context = basic_format_context<unspecified, wchar_t>; 20349cc55cSDimitry Andric 21349cc55cSDimitry Andric // [format.args], class template basic_format_args 2204eeddc0SDimitry Andric template<class Context> class basic_format_args; 23349cc55cSDimitry Andric using format_args = basic_format_args<format_context>; 24349cc55cSDimitry Andric using wformat_args = basic_format_args<wformat_context>; 25349cc55cSDimitry Andric 2661cfbce3SDimitry Andric // [format.fmt.string], class template basic_format_string 2781ad6265SDimitry Andric template<class charT, class... Args> 2861cfbce3SDimitry Andric struct basic_format_string { // since C++23, exposition only before C++23 2961cfbce3SDimitry Andric private: 3061cfbce3SDimitry Andric basic_string_view<charT> str; // exposition only 3181ad6265SDimitry Andric 3261cfbce3SDimitry Andric public: 3361cfbce3SDimitry Andric template<class T> consteval basic_format_string(const T& s); 345f757f3fSDimitry Andric basic_format_string(runtime-format-string<charT> s) noexcept : str(s.str) {} // since C++26 3561cfbce3SDimitry Andric 3661cfbce3SDimitry Andric constexpr basic_string_view<charT> get() const noexcept { return str; } 3761cfbce3SDimitry Andric }; 3881ad6265SDimitry Andric template<class... Args> 3961cfbce3SDimitry Andric using format_string = // since C++23, exposition only before C++23 4061cfbce3SDimitry Andric basic_format_string<char, type_identity_t<Args>...>; 4181ad6265SDimitry Andric template<class... Args> 4261cfbce3SDimitry Andric using wformat_string = // since C++23, exposition only before C++23 4361cfbce3SDimitry Andric basic_format_string<wchar_t, type_identity_t<Args>...>; 4481ad6265SDimitry Andric 455f757f3fSDimitry Andric template<class charT> struct runtime-format-string { // since C++26, exposition-only 465f757f3fSDimitry Andric private: 475f757f3fSDimitry Andric basic_string_view<charT> str; // exposition-only 485f757f3fSDimitry Andric 495f757f3fSDimitry Andric public: 505f757f3fSDimitry Andric runtime-format-string(basic_string_view<charT> s) noexcept : str(s) {} 515f757f3fSDimitry Andric 525f757f3fSDimitry Andric runtime-format-string(const runtime-format-string&) = delete; 535f757f3fSDimitry Andric runtime-format-string& operator=(const runtime-format-string&) = delete; 545f757f3fSDimitry Andric }; 555f757f3fSDimitry Andric 565f757f3fSDimitry Andric runtime-format-string<char> runtime_format(string_view fmt) noexcept { 575f757f3fSDimitry Andric return fmt; 585f757f3fSDimitry Andric } 595f757f3fSDimitry Andric runtime-format-string<wchar_t> runtime_format(wstring_view fmt) noexcept { 605f757f3fSDimitry Andric return fmt; 615f757f3fSDimitry Andric } 625f757f3fSDimitry Andric 63349cc55cSDimitry Andric // [format.functions], formatting functions 64349cc55cSDimitry Andric template<class... Args> 65753f127fSDimitry Andric string format(format-string<Args...> fmt, Args&&... args); 66349cc55cSDimitry Andric template<class... Args> 67753f127fSDimitry Andric wstring format(wformat-string<Args...> fmt, Args&&... args); 68349cc55cSDimitry Andric template<class... Args> 69753f127fSDimitry Andric string format(const locale& loc, format-string<Args...> fmt, Args&&... args); 70349cc55cSDimitry Andric template<class... Args> 71753f127fSDimitry Andric wstring format(const locale& loc, wformat-string<Args...> fmt, Args&&... args); 72349cc55cSDimitry Andric 73349cc55cSDimitry Andric string vformat(string_view fmt, format_args args); 74349cc55cSDimitry Andric wstring vformat(wstring_view fmt, wformat_args args); 75349cc55cSDimitry Andric string vformat(const locale& loc, string_view fmt, format_args args); 76349cc55cSDimitry Andric wstring vformat(const locale& loc, wstring_view fmt, wformat_args args); 77349cc55cSDimitry Andric 78349cc55cSDimitry Andric template<class Out, class... Args> 79753f127fSDimitry Andric Out format_to(Out out, format-string<Args...> fmt, Args&&... args); 80349cc55cSDimitry Andric template<class Out, class... Args> 81753f127fSDimitry Andric Out format_to(Out out, wformat-string<Args...> fmt, Args&&... args); 82349cc55cSDimitry Andric template<class Out, class... Args> 83753f127fSDimitry Andric Out format_to(Out out, const locale& loc, format-string<Args...> fmt, Args&&... args); 84349cc55cSDimitry Andric template<class Out, class... Args> 85753f127fSDimitry Andric Out format_to(Out out, const locale& loc, wformat-string<Args...> fmt, Args&&... args); 86349cc55cSDimitry Andric 87349cc55cSDimitry Andric template<class Out> 884824e7fdSDimitry Andric Out vformat_to(Out out, string_view fmt, format_args args); 89349cc55cSDimitry Andric template<class Out> 904824e7fdSDimitry Andric Out vformat_to(Out out, wstring_view fmt, wformat_args args); 91349cc55cSDimitry Andric template<class Out> 92349cc55cSDimitry Andric Out vformat_to(Out out, const locale& loc, string_view fmt, 934824e7fdSDimitry Andric format_args char> args); 94349cc55cSDimitry Andric template<class Out> 95349cc55cSDimitry Andric Out vformat_to(Out out, const locale& loc, wstring_view fmt, 964824e7fdSDimitry Andric wformat_args args); 97349cc55cSDimitry Andric 98349cc55cSDimitry Andric template<class Out> struct format_to_n_result { 99349cc55cSDimitry Andric Out out; 100349cc55cSDimitry Andric iter_difference_t<Out> size; 101349cc55cSDimitry Andric }; 102349cc55cSDimitry Andric template<class Out, class... Args> 103349cc55cSDimitry Andric format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, 104753f127fSDimitry Andric format-string<Args...> fmt, Args&&... args); 105349cc55cSDimitry Andric template<class Out, class... Args> 106349cc55cSDimitry Andric format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, 107753f127fSDimitry Andric wformat-string<Args...> fmt, Args&&... args); 108349cc55cSDimitry Andric template<class Out, class... Args> 109349cc55cSDimitry Andric format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, 11081ad6265SDimitry Andric const locale& loc, format-string<Args...> fmt, 111753f127fSDimitry Andric Args&&... args); 112349cc55cSDimitry Andric template<class Out, class... Args> 113349cc55cSDimitry Andric format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, 11481ad6265SDimitry Andric const locale& loc, wformat-string<Args...> fmt, 115753f127fSDimitry Andric Args&&... args); 116349cc55cSDimitry Andric 117349cc55cSDimitry Andric template<class... Args> 118753f127fSDimitry Andric size_t formatted_size(format-string<Args...> fmt, Args&&... args); 119349cc55cSDimitry Andric template<class... Args> 120753f127fSDimitry Andric size_t formatted_size(wformat-string<Args...> fmt, Args&&... args); 121349cc55cSDimitry Andric template<class... Args> 122753f127fSDimitry Andric size_t formatted_size(const locale& loc, format-string<Args...> fmt, Args&&... args); 123349cc55cSDimitry Andric template<class... Args> 124753f127fSDimitry Andric size_t formatted_size(const locale& loc, wformat-string<Args...> fmt, Args&&... args); 125349cc55cSDimitry Andric 126349cc55cSDimitry Andric // [format.formatter], formatter 12704eeddc0SDimitry Andric template<class T, class charT = char> struct formatter; 128349cc55cSDimitry Andric 129349cc55cSDimitry Andric // [format.parse.ctx], class template basic_format_parse_context 13004eeddc0SDimitry Andric template<class charT> class basic_format_parse_context; 131349cc55cSDimitry Andric using format_parse_context = basic_format_parse_context<char>; 132349cc55cSDimitry Andric using wformat_parse_context = basic_format_parse_context<wchar_t>; 133349cc55cSDimitry Andric 134bdd1243dSDimitry Andric // [format.range], formatting of ranges 135bdd1243dSDimitry Andric // [format.range.fmtkind], variable template format_kind 136bdd1243dSDimitry Andric enum class range_format { // since C++23 137bdd1243dSDimitry Andric disabled, 138bdd1243dSDimitry Andric map, 139bdd1243dSDimitry Andric set, 140bdd1243dSDimitry Andric sequence, 141bdd1243dSDimitry Andric string, 142bdd1243dSDimitry Andric debug_string 143bdd1243dSDimitry Andric }; 144bdd1243dSDimitry Andric 145bdd1243dSDimitry Andric template<class R> 146bdd1243dSDimitry Andric constexpr unspecified format_kind = unspecified; // since C++23 147bdd1243dSDimitry Andric 148bdd1243dSDimitry Andric template<ranges::input_range R> 149bdd1243dSDimitry Andric requires same_as<R, remove_cvref_t<R>> 150bdd1243dSDimitry Andric constexpr range_format format_kind<R> = see below; // since C++23 151bdd1243dSDimitry Andric 152bdd1243dSDimitry Andric // [format.range.formatter], class template range_formatter 153bdd1243dSDimitry Andric template<class T, class charT = char> 154bdd1243dSDimitry Andric requires same_as<remove_cvref_t<T>, T> && formattable<T, charT> 155bdd1243dSDimitry Andric class range_formatter; // since C++23 156bdd1243dSDimitry Andric 157bdd1243dSDimitry Andric // [format.range.fmtdef], class template range-default-formatter 158bdd1243dSDimitry Andric template<range_format K, ranges::input_range R, class charT> 159bdd1243dSDimitry Andric struct range-default-formatter; // exposition only, since C++23 160bdd1243dSDimitry Andric 161bdd1243dSDimitry Andric // [format.range.fmtmap], [format.range.fmtset], [format.range.fmtstr], 162bdd1243dSDimitry Andric // specializations for maps, sets, and strings 163bdd1243dSDimitry Andric template<ranges::input_range R, class charT> 164bdd1243dSDimitry Andric requires (format_kind<R> != range_format::disabled) && 165bdd1243dSDimitry Andric formattable<ranges::range_reference_t<R>, charT> 166bdd1243dSDimitry Andric struct formatter<R, charT> : range-default-formatter<format_kind<R>, R, charT> { }; // since C++23 167bdd1243dSDimitry Andric 168349cc55cSDimitry Andric // [format.arguments], arguments 169349cc55cSDimitry Andric // [format.arg], class template basic_format_arg 17004eeddc0SDimitry Andric template<class Context> class basic_format_arg; 171349cc55cSDimitry Andric 172349cc55cSDimitry Andric template<class Visitor, class Context> 1730fca6ea1SDimitry Andric see below visit_format_arg(Visitor&& vis, basic_format_arg<Context> arg); // Deprecated in C++26 174349cc55cSDimitry Andric 175349cc55cSDimitry Andric // [format.arg.store], class template format-arg-store 17604eeddc0SDimitry Andric template<class Context, class... Args> struct format-arg-store; // exposition only 177349cc55cSDimitry Andric 178349cc55cSDimitry Andric template<class Context = format_context, class... Args> 179349cc55cSDimitry Andric format-arg-store<Context, Args...> 1805f757f3fSDimitry Andric make_format_args(Args&... args); 181349cc55cSDimitry Andric template<class... Args> 182349cc55cSDimitry Andric format-arg-store<wformat_context, Args...> 1835f757f3fSDimitry Andric make_wformat_args(Args&... args); 184349cc55cSDimitry Andric 185fe6060f1SDimitry Andric // [format.error], class format_error 18604eeddc0SDimitry Andric class format_error; 187fe6060f1SDimitry Andric} 188fe6060f1SDimitry Andric 189fe6060f1SDimitry Andric*/ 190fe6060f1SDimitry Andric 191fe6060f1SDimitry Andric#include <__config> 1920fca6ea1SDimitry Andric 1930fca6ea1SDimitry Andric#if _LIBCPP_STD_VER >= 20 19481ad6265SDimitry Andric# include <__format/buffer.h> 19581ad6265SDimitry Andric# include <__format/concepts.h> 196bdd1243dSDimitry Andric# include <__format/container_adaptor.h> 19781ad6265SDimitry Andric# include <__format/enable_insertable.h> 1980fca6ea1SDimitry Andric# include <__format/escaped_output_table.h> 1990fca6ea1SDimitry Andric# include <__format/extended_grapheme_cluster_table.h> 200349cc55cSDimitry Andric# include <__format/format_arg.h> 20181ad6265SDimitry Andric# include <__format/format_arg_store.h> 202349cc55cSDimitry Andric# include <__format/format_args.h> 203349cc55cSDimitry Andric# include <__format/format_context.h> 204fe6060f1SDimitry Andric# include <__format/format_error.h> 205bdd1243dSDimitry Andric# include <__format/format_functions.h> 206fe6060f1SDimitry Andric# include <__format/format_parse_context.h> 207349cc55cSDimitry Andric# include <__format/format_string.h> 208349cc55cSDimitry Andric# include <__format/format_to_n_result.h> 209349cc55cSDimitry Andric# include <__format/formatter.h> 210349cc55cSDimitry Andric# include <__format/formatter_bool.h> 211349cc55cSDimitry Andric# include <__format/formatter_char.h> 21204eeddc0SDimitry Andric# include <__format/formatter_floating_point.h> 213349cc55cSDimitry Andric# include <__format/formatter_integer.h> 21404eeddc0SDimitry Andric# include <__format/formatter_pointer.h> 215349cc55cSDimitry Andric# include <__format/formatter_string.h> 216bdd1243dSDimitry Andric# include <__format/formatter_tuple.h> 217349cc55cSDimitry Andric# include <__format/parser_std_format_spec.h> 218bdd1243dSDimitry Andric# include <__format/range_default_formatter.h> 219bdd1243dSDimitry Andric# include <__format/range_formatter.h> 220fcaf7f86SDimitry Andric# include <__format/unicode.h> 2210fca6ea1SDimitry Andric# include <__fwd/format.h> 2220fca6ea1SDimitry Andric#endif 2230fca6ea1SDimitry Andric 22406c3fb27SDimitry Andric#include <version> 225fe6060f1SDimitry Andric 226fe6060f1SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 227fe6060f1SDimitry Andric# pragma GCC system_header 228fe6060f1SDimitry Andric#endif 229fe6060f1SDimitry Andric 2300fca6ea1SDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 2310fca6ea1SDimitry Andric# include <array> 2320fca6ea1SDimitry Andric# include <cctype> 2330fca6ea1SDimitry Andric# include <cerrno> 2340fca6ea1SDimitry Andric# include <clocale> 2350fca6ea1SDimitry Andric# include <cmath> 2360fca6ea1SDimitry Andric# include <cstddef> 2370fca6ea1SDimitry Andric# include <cstdint> 2380fca6ea1SDimitry Andric# include <cstdlib> 2390fca6ea1SDimitry Andric# include <cstring> 2400fca6ea1SDimitry Andric# include <initializer_list> 2410fca6ea1SDimitry Andric# include <limits> 242*6c4b055cSDimitry Andric# include <locale> 2430fca6ea1SDimitry Andric# include <new> 2440fca6ea1SDimitry Andric# include <optional> 245*6c4b055cSDimitry Andric# include <queue> 246*6c4b055cSDimitry Andric# include <stack> 2470fca6ea1SDimitry Andric# include <stdexcept> 2480fca6ea1SDimitry Andric# include <string> 2490fca6ea1SDimitry Andric# include <string_view> 2500fca6ea1SDimitry Andric# include <tuple> 2510fca6ea1SDimitry Andric 252*6c4b055cSDimitry Andric# if !defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS) 253*6c4b055cSDimitry Andric# include <cwchar> 254*6c4b055cSDimitry Andric# endif 2550fca6ea1SDimitry Andric#endif 2560fca6ea1SDimitry Andric 257fe6060f1SDimitry Andric#endif // _LIBCPP_FORMAT 258