xref: /llvm-project/libcxx/include/__cxx03/format (revision ce7771902dc50d900de639d499a60486b83f70e0)
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