xref: /aosp_15_r20/external/fmtlib/doc/api.md (revision 5c90c05cd622c0a81b57953a4d343e0e489f2e08)
1*5c90c05cSAndroid Build Coastguard Worker# API Reference
2*5c90c05cSAndroid Build Coastguard Worker
3*5c90c05cSAndroid Build Coastguard WorkerThe {fmt} library API consists of the following components:
4*5c90c05cSAndroid Build Coastguard Worker
5*5c90c05cSAndroid Build Coastguard Worker- [`fmt/base.h`](#base-api): the base API providing main formatting functions
6*5c90c05cSAndroid Build Coastguard Worker  for `char`/UTF-8 with C++20 compile-time checks and minimal dependencies
7*5c90c05cSAndroid Build Coastguard Worker- [`fmt/format.h`](#format-api): `fmt::format` and other formatting functions
8*5c90c05cSAndroid Build Coastguard Worker  as well as locale support
9*5c90c05cSAndroid Build Coastguard Worker- [`fmt/ranges.h`](#ranges-api): formatting of ranges and tuples
10*5c90c05cSAndroid Build Coastguard Worker- [`fmt/chrono.h`](#chrono-api): date and time formatting
11*5c90c05cSAndroid Build Coastguard Worker- [`fmt/std.h`](#std-api): formatters for standard library types
12*5c90c05cSAndroid Build Coastguard Worker- [`fmt/compile.h`](#compile-api): format string compilation
13*5c90c05cSAndroid Build Coastguard Worker- [`fmt/color.h`](#color-api): terminal colors and text styles
14*5c90c05cSAndroid Build Coastguard Worker- [`fmt/os.h`](#os-api): system APIs
15*5c90c05cSAndroid Build Coastguard Worker- [`fmt/ostream.h`](#ostream-api): `std::ostream` support
16*5c90c05cSAndroid Build Coastguard Worker- [`fmt/args.h`](#args-api): dynamic argument lists
17*5c90c05cSAndroid Build Coastguard Worker- [`fmt/printf.h`](#printf-api): safe `printf`
18*5c90c05cSAndroid Build Coastguard Worker- [`fmt/xchar.h`](#xchar-api): optional `wchar_t` support
19*5c90c05cSAndroid Build Coastguard Worker
20*5c90c05cSAndroid Build Coastguard WorkerAll functions and types provided by the library reside in namespace `fmt`
21*5c90c05cSAndroid Build Coastguard Workerand macros have prefix `FMT_`.
22*5c90c05cSAndroid Build Coastguard Worker
23*5c90c05cSAndroid Build Coastguard Worker## Base API
24*5c90c05cSAndroid Build Coastguard Worker
25*5c90c05cSAndroid Build Coastguard Worker`fmt/base.h` defines the base API which provides main formatting functions
26*5c90c05cSAndroid Build Coastguard Workerfor `char`/UTF-8 with C++20 compile-time checks. It has minimal include
27*5c90c05cSAndroid Build Coastguard Workerdependencies for better compile times. This header is only beneficial when
28*5c90c05cSAndroid Build Coastguard Workerusing {fmt} as a library (the default) and not in the header-only mode.
29*5c90c05cSAndroid Build Coastguard WorkerIt also provides `formatter` specializations for the following types:
30*5c90c05cSAndroid Build Coastguard Worker
31*5c90c05cSAndroid Build Coastguard Worker- `int`, `long long`,
32*5c90c05cSAndroid Build Coastguard Worker- `unsigned`, `unsigned long long`
33*5c90c05cSAndroid Build Coastguard Worker- `float`, `double`, `long double`
34*5c90c05cSAndroid Build Coastguard Worker- `bool`
35*5c90c05cSAndroid Build Coastguard Worker- `char`
36*5c90c05cSAndroid Build Coastguard Worker- `const char*`, [`fmt::string_view`](#basic_string_view)
37*5c90c05cSAndroid Build Coastguard Worker- `const void*`
38*5c90c05cSAndroid Build Coastguard Worker
39*5c90c05cSAndroid Build Coastguard WorkerThe following functions use [format string syntax](syntax.md) similar to that
40*5c90c05cSAndroid Build Coastguard Workerof [str.format](https://docs.python.org/3/library/stdtypes.html#str.format)
41*5c90c05cSAndroid Build Coastguard Workerin Python. They take *fmt* and *args* as arguments.
42*5c90c05cSAndroid Build Coastguard Worker
43*5c90c05cSAndroid Build Coastguard Worker*fmt* is a format string that contains literal text and replacement fields
44*5c90c05cSAndroid Build Coastguard Workersurrounded by braces `{}`. The fields are replaced with formatted arguments
45*5c90c05cSAndroid Build Coastguard Workerin the resulting string. [`fmt::format_string`](#format_string) is a format
46*5c90c05cSAndroid Build Coastguard Workerstring which can be implicitly constructed from a string literal or a
47*5c90c05cSAndroid Build Coastguard Worker`constexpr` string and is checked at compile time in C++20. To pass a runtime
48*5c90c05cSAndroid Build Coastguard Workerformat string wrap it in [`fmt::runtime`](#runtime).
49*5c90c05cSAndroid Build Coastguard Worker
50*5c90c05cSAndroid Build Coastguard Worker*args* is an argument list representing objects to be formatted.
51*5c90c05cSAndroid Build Coastguard Worker
52*5c90c05cSAndroid Build Coastguard WorkerI/O errors are reported as [`std::system_error`](
53*5c90c05cSAndroid Build Coastguard Workerhttps://en.cppreference.com/w/cpp/error/system_error) exceptions unless
54*5c90c05cSAndroid Build Coastguard Workerspecified otherwise.
55*5c90c05cSAndroid Build Coastguard Worker
56*5c90c05cSAndroid Build Coastguard Worker::: print(format_string<T...>, T&&...)
57*5c90c05cSAndroid Build Coastguard Worker
58*5c90c05cSAndroid Build Coastguard Worker::: print(FILE*, format_string<T...>, T&&...)
59*5c90c05cSAndroid Build Coastguard Worker
60*5c90c05cSAndroid Build Coastguard Worker::: println(format_string<T...>, T&&...)
61*5c90c05cSAndroid Build Coastguard Worker
62*5c90c05cSAndroid Build Coastguard Worker::: println(FILE*, format_string<T...>, T&&...)
63*5c90c05cSAndroid Build Coastguard Worker
64*5c90c05cSAndroid Build Coastguard Worker::: format_to(OutputIt&&, format_string<T...>, T&&...)
65*5c90c05cSAndroid Build Coastguard Worker
66*5c90c05cSAndroid Build Coastguard Worker::: format_to_n(OutputIt, size_t, format_string<T...>, T&&...)
67*5c90c05cSAndroid Build Coastguard Worker
68*5c90c05cSAndroid Build Coastguard Worker::: format_to_n_result
69*5c90c05cSAndroid Build Coastguard Worker
70*5c90c05cSAndroid Build Coastguard Worker::: formatted_size(format_string<T...>, T&&...)
71*5c90c05cSAndroid Build Coastguard Worker
72*5c90c05cSAndroid Build Coastguard Worker<a id="udt"></a>
73*5c90c05cSAndroid Build Coastguard Worker### Formatting User-Defined Types
74*5c90c05cSAndroid Build Coastguard Worker
75*5c90c05cSAndroid Build Coastguard WorkerThe {fmt} library provides formatters for many standard C++ types.
76*5c90c05cSAndroid Build Coastguard WorkerSee [`fmt/ranges.h`](#ranges-api) for ranges and tuples including standard
77*5c90c05cSAndroid Build Coastguard Workercontainers such as `std::vector`, [`fmt/chrono.h`](#chrono-api) for date and
78*5c90c05cSAndroid Build Coastguard Workertime formatting and [`fmt/std.h`](#std-api) for other standard library types.
79*5c90c05cSAndroid Build Coastguard Worker
80*5c90c05cSAndroid Build Coastguard WorkerThere are two ways to make a user-defined type formattable: providing a
81*5c90c05cSAndroid Build Coastguard Worker`format_as` function or specializing the `formatter` struct template.
82*5c90c05cSAndroid Build Coastguard Worker
83*5c90c05cSAndroid Build Coastguard WorkerUse `format_as` if you want to make your type formattable as some other
84*5c90c05cSAndroid Build Coastguard Workertype with the same format specifiers. The `format_as` function should
85*5c90c05cSAndroid Build Coastguard Workertake an object of your type and return an object of a formattable type.
86*5c90c05cSAndroid Build Coastguard WorkerIt should be defined in the same namespace as your type.
87*5c90c05cSAndroid Build Coastguard Worker
88*5c90c05cSAndroid Build Coastguard WorkerExample ([run](https://godbolt.org/z/nvME4arz8)):
89*5c90c05cSAndroid Build Coastguard Worker
90*5c90c05cSAndroid Build Coastguard Worker    #include <fmt/format.h>
91*5c90c05cSAndroid Build Coastguard Worker
92*5c90c05cSAndroid Build Coastguard Worker    namespace kevin_namespacy {
93*5c90c05cSAndroid Build Coastguard Worker
94*5c90c05cSAndroid Build Coastguard Worker    enum class film {
95*5c90c05cSAndroid Build Coastguard Worker      house_of_cards, american_beauty, se7en = 7
96*5c90c05cSAndroid Build Coastguard Worker    };
97*5c90c05cSAndroid Build Coastguard Worker
98*5c90c05cSAndroid Build Coastguard Worker    auto format_as(film f) { return fmt::underlying(f); }
99*5c90c05cSAndroid Build Coastguard Worker
100*5c90c05cSAndroid Build Coastguard Worker    }
101*5c90c05cSAndroid Build Coastguard Worker
102*5c90c05cSAndroid Build Coastguard Worker    int main() {
103*5c90c05cSAndroid Build Coastguard Worker      fmt::print("{}\n", kevin_namespacy::film::se7en); // Output: 7
104*5c90c05cSAndroid Build Coastguard Worker    }
105*5c90c05cSAndroid Build Coastguard Worker
106*5c90c05cSAndroid Build Coastguard WorkerUsing specialization is more complex but gives you full control over
107*5c90c05cSAndroid Build Coastguard Workerparsing and formatting. To use this method specialize the `formatter`
108*5c90c05cSAndroid Build Coastguard Workerstruct template for your type and implement `parse` and `format`
109*5c90c05cSAndroid Build Coastguard Workermethods.
110*5c90c05cSAndroid Build Coastguard Worker
111*5c90c05cSAndroid Build Coastguard WorkerThe recommended way of defining a formatter is by reusing an existing
112*5c90c05cSAndroid Build Coastguard Workerone via inheritance or composition. This way you can support standard
113*5c90c05cSAndroid Build Coastguard Workerformat specifiers without implementing them yourself. For example:
114*5c90c05cSAndroid Build Coastguard Worker
115*5c90c05cSAndroid Build Coastguard Worker```c++
116*5c90c05cSAndroid Build Coastguard Worker// color.h:
117*5c90c05cSAndroid Build Coastguard Worker#include <fmt/base.h>
118*5c90c05cSAndroid Build Coastguard Worker
119*5c90c05cSAndroid Build Coastguard Workerenum class color {red, green, blue};
120*5c90c05cSAndroid Build Coastguard Worker
121*5c90c05cSAndroid Build Coastguard Workertemplate <> struct fmt::formatter<color>: formatter<string_view> {
122*5c90c05cSAndroid Build Coastguard Worker  // parse is inherited from formatter<string_view>.
123*5c90c05cSAndroid Build Coastguard Worker
124*5c90c05cSAndroid Build Coastguard Worker  auto format(color c, format_context& ctx) const
125*5c90c05cSAndroid Build Coastguard Worker    -> format_context::iterator;
126*5c90c05cSAndroid Build Coastguard Worker};
127*5c90c05cSAndroid Build Coastguard Worker```
128*5c90c05cSAndroid Build Coastguard Worker
129*5c90c05cSAndroid Build Coastguard Worker```c++
130*5c90c05cSAndroid Build Coastguard Worker// color.cc:
131*5c90c05cSAndroid Build Coastguard Worker#include "color.h"
132*5c90c05cSAndroid Build Coastguard Worker#include <fmt/format.h>
133*5c90c05cSAndroid Build Coastguard Worker
134*5c90c05cSAndroid Build Coastguard Workerauto fmt::formatter<color>::format(color c, format_context& ctx) const
135*5c90c05cSAndroid Build Coastguard Worker    -> format_context::iterator {
136*5c90c05cSAndroid Build Coastguard Worker  string_view name = "unknown";
137*5c90c05cSAndroid Build Coastguard Worker  switch (c) {
138*5c90c05cSAndroid Build Coastguard Worker  case color::red:   name = "red"; break;
139*5c90c05cSAndroid Build Coastguard Worker  case color::green: name = "green"; break;
140*5c90c05cSAndroid Build Coastguard Worker  case color::blue:  name = "blue"; break;
141*5c90c05cSAndroid Build Coastguard Worker  }
142*5c90c05cSAndroid Build Coastguard Worker  return formatter<string_view>::format(name, ctx);
143*5c90c05cSAndroid Build Coastguard Worker}
144*5c90c05cSAndroid Build Coastguard Worker```
145*5c90c05cSAndroid Build Coastguard Worker
146*5c90c05cSAndroid Build Coastguard WorkerNote that `formatter<string_view>::format` is defined in `fmt/format.h`
147*5c90c05cSAndroid Build Coastguard Workerso it has to be included in the source file. Since `parse` is inherited
148*5c90c05cSAndroid Build Coastguard Workerfrom `formatter<string_view>` it will recognize all string format
149*5c90c05cSAndroid Build Coastguard Workerspecifications, for example
150*5c90c05cSAndroid Build Coastguard Worker
151*5c90c05cSAndroid Build Coastguard Worker```c++
152*5c90c05cSAndroid Build Coastguard Workerfmt::format("{:>10}", color::blue)
153*5c90c05cSAndroid Build Coastguard Worker```
154*5c90c05cSAndroid Build Coastguard Worker
155*5c90c05cSAndroid Build Coastguard Workerwill return `"      blue"`.
156*5c90c05cSAndroid Build Coastguard Worker
157*5c90c05cSAndroid Build Coastguard Worker<!-- The experimental `nested_formatter` provides an easy way of applying a
158*5c90c05cSAndroid Build Coastguard Workerformatter to one or more subobjects.
159*5c90c05cSAndroid Build Coastguard Worker
160*5c90c05cSAndroid Build Coastguard WorkerFor example:
161*5c90c05cSAndroid Build Coastguard Worker
162*5c90c05cSAndroid Build Coastguard Worker    #include <fmt/format.h>
163*5c90c05cSAndroid Build Coastguard Worker
164*5c90c05cSAndroid Build Coastguard Worker    struct point {
165*5c90c05cSAndroid Build Coastguard Worker      double x, y;
166*5c90c05cSAndroid Build Coastguard Worker    };
167*5c90c05cSAndroid Build Coastguard Worker
168*5c90c05cSAndroid Build Coastguard Worker    template <>
169*5c90c05cSAndroid Build Coastguard Worker    struct fmt::formatter<point> : nested_formatter<double> {
170*5c90c05cSAndroid Build Coastguard Worker      auto format(point p, format_context& ctx) const {
171*5c90c05cSAndroid Build Coastguard Worker        return write_padded(ctx, [=](auto out) {
172*5c90c05cSAndroid Build Coastguard Worker          return format_to(out, "({}, {})", this->nested(p.x),
173*5c90c05cSAndroid Build Coastguard Worker                           this->nested(p.y));
174*5c90c05cSAndroid Build Coastguard Worker        });
175*5c90c05cSAndroid Build Coastguard Worker      }
176*5c90c05cSAndroid Build Coastguard Worker    };
177*5c90c05cSAndroid Build Coastguard Worker
178*5c90c05cSAndroid Build Coastguard Worker    int main() {
179*5c90c05cSAndroid Build Coastguard Worker      fmt::print("[{:>20.2f}]", point{1, 2});
180*5c90c05cSAndroid Build Coastguard Worker    }
181*5c90c05cSAndroid Build Coastguard Worker
182*5c90c05cSAndroid Build Coastguard Workerprints:
183*5c90c05cSAndroid Build Coastguard Worker
184*5c90c05cSAndroid Build Coastguard Worker    [          (1.00, 2.00)]
185*5c90c05cSAndroid Build Coastguard Worker
186*5c90c05cSAndroid Build Coastguard WorkerNotice that fill, align and width are applied to the whole object which
187*5c90c05cSAndroid Build Coastguard Workeris the recommended behavior while the remaining specifiers apply to
188*5c90c05cSAndroid Build Coastguard Workerelements. -->
189*5c90c05cSAndroid Build Coastguard Worker
190*5c90c05cSAndroid Build Coastguard WorkerIn general the formatter has the following form:
191*5c90c05cSAndroid Build Coastguard Worker
192*5c90c05cSAndroid Build Coastguard Worker    template <> struct fmt::formatter<T> {
193*5c90c05cSAndroid Build Coastguard Worker      // Parses format specifiers and stores them in the formatter.
194*5c90c05cSAndroid Build Coastguard Worker      //
195*5c90c05cSAndroid Build Coastguard Worker      // [ctx.begin(), ctx.end()) is a, possibly empty, character range that
196*5c90c05cSAndroid Build Coastguard Worker      // contains a part of the format string starting from the format
197*5c90c05cSAndroid Build Coastguard Worker      // specifications to be parsed, e.g. in
198*5c90c05cSAndroid Build Coastguard Worker      //
199*5c90c05cSAndroid Build Coastguard Worker      //   fmt::format("{:f} continued", ...);
200*5c90c05cSAndroid Build Coastguard Worker      //
201*5c90c05cSAndroid Build Coastguard Worker      // the range will contain "f} continued". The formatter should parse
202*5c90c05cSAndroid Build Coastguard Worker      // specifiers until '}' or the end of the range. In this example the
203*5c90c05cSAndroid Build Coastguard Worker      // formatter should parse the 'f' specifier and return an iterator
204*5c90c05cSAndroid Build Coastguard Worker      // pointing to '}'.
205*5c90c05cSAndroid Build Coastguard Worker      constexpr auto parse(format_parse_context& ctx)
206*5c90c05cSAndroid Build Coastguard Worker        -> format_parse_context::iterator;
207*5c90c05cSAndroid Build Coastguard Worker
208*5c90c05cSAndroid Build Coastguard Worker      // Formats value using the parsed format specification stored in this
209*5c90c05cSAndroid Build Coastguard Worker      // formatter and writes the output to ctx.out().
210*5c90c05cSAndroid Build Coastguard Worker      auto format(const T& value, format_context& ctx) const
211*5c90c05cSAndroid Build Coastguard Worker        -> format_context::iterator;
212*5c90c05cSAndroid Build Coastguard Worker    };
213*5c90c05cSAndroid Build Coastguard Worker
214*5c90c05cSAndroid Build Coastguard WorkerIt is recommended to at least support fill, align and width that apply
215*5c90c05cSAndroid Build Coastguard Workerto the whole object and have the same semantics as in standard
216*5c90c05cSAndroid Build Coastguard Workerformatters.
217*5c90c05cSAndroid Build Coastguard Worker
218*5c90c05cSAndroid Build Coastguard WorkerYou can also write a formatter for a hierarchy of classes:
219*5c90c05cSAndroid Build Coastguard Worker
220*5c90c05cSAndroid Build Coastguard Worker```c++
221*5c90c05cSAndroid Build Coastguard Worker// demo.h:
222*5c90c05cSAndroid Build Coastguard Worker#include <type_traits>
223*5c90c05cSAndroid Build Coastguard Worker#include <fmt/core.h>
224*5c90c05cSAndroid Build Coastguard Worker
225*5c90c05cSAndroid Build Coastguard Workerstruct A {
226*5c90c05cSAndroid Build Coastguard Worker  virtual ~A() {}
227*5c90c05cSAndroid Build Coastguard Worker  virtual std::string name() const { return "A"; }
228*5c90c05cSAndroid Build Coastguard Worker};
229*5c90c05cSAndroid Build Coastguard Worker
230*5c90c05cSAndroid Build Coastguard Workerstruct B : A {
231*5c90c05cSAndroid Build Coastguard Worker  virtual std::string name() const { return "B"; }
232*5c90c05cSAndroid Build Coastguard Worker};
233*5c90c05cSAndroid Build Coastguard Worker
234*5c90c05cSAndroid Build Coastguard Workertemplate <typename T>
235*5c90c05cSAndroid Build Coastguard Workerstruct fmt::formatter<T, std::enable_if_t<std::is_base_of_v<A, T>, char>> :
236*5c90c05cSAndroid Build Coastguard Worker    fmt::formatter<std::string> {
237*5c90c05cSAndroid Build Coastguard Worker  auto format(const A& a, format_context& ctx) const {
238*5c90c05cSAndroid Build Coastguard Worker    return formatter<std::string>::format(a.name(), ctx);
239*5c90c05cSAndroid Build Coastguard Worker  }
240*5c90c05cSAndroid Build Coastguard Worker};
241*5c90c05cSAndroid Build Coastguard Worker```
242*5c90c05cSAndroid Build Coastguard Worker
243*5c90c05cSAndroid Build Coastguard Worker```c++
244*5c90c05cSAndroid Build Coastguard Worker// demo.cc:
245*5c90c05cSAndroid Build Coastguard Worker#include "demo.h"
246*5c90c05cSAndroid Build Coastguard Worker#include <fmt/format.h>
247*5c90c05cSAndroid Build Coastguard Worker
248*5c90c05cSAndroid Build Coastguard Workerint main() {
249*5c90c05cSAndroid Build Coastguard Worker  B b;
250*5c90c05cSAndroid Build Coastguard Worker  A& a = b;
251*5c90c05cSAndroid Build Coastguard Worker  fmt::print("{}", a); // Output: B
252*5c90c05cSAndroid Build Coastguard Worker}
253*5c90c05cSAndroid Build Coastguard Worker```
254*5c90c05cSAndroid Build Coastguard Worker
255*5c90c05cSAndroid Build Coastguard WorkerProviding both a `formatter` specialization and a `format_as` overload is
256*5c90c05cSAndroid Build Coastguard Workerdisallowed.
257*5c90c05cSAndroid Build Coastguard Worker
258*5c90c05cSAndroid Build Coastguard Worker::: basic_format_parse_context
259*5c90c05cSAndroid Build Coastguard Worker
260*5c90c05cSAndroid Build Coastguard Worker::: context
261*5c90c05cSAndroid Build Coastguard Worker
262*5c90c05cSAndroid Build Coastguard Worker::: format_context
263*5c90c05cSAndroid Build Coastguard Worker
264*5c90c05cSAndroid Build Coastguard Worker### Compile-Time Checks
265*5c90c05cSAndroid Build Coastguard Worker
266*5c90c05cSAndroid Build Coastguard WorkerCompile-time format string checks are enabled by default on compilers
267*5c90c05cSAndroid Build Coastguard Workerthat support C++20 `consteval`. On older compilers you can use the
268*5c90c05cSAndroid Build Coastguard Worker[FMT_STRING](#legacy-checks) macro defined in `fmt/format.h` instead.
269*5c90c05cSAndroid Build Coastguard Worker
270*5c90c05cSAndroid Build Coastguard WorkerUnused arguments are allowed as in Python's `str.format` and ordinary functions.
271*5c90c05cSAndroid Build Coastguard Worker
272*5c90c05cSAndroid Build Coastguard Worker::: basic_format_string
273*5c90c05cSAndroid Build Coastguard Worker
274*5c90c05cSAndroid Build Coastguard Worker::: format_string
275*5c90c05cSAndroid Build Coastguard Worker
276*5c90c05cSAndroid Build Coastguard Worker::: runtime(string_view)
277*5c90c05cSAndroid Build Coastguard Worker
278*5c90c05cSAndroid Build Coastguard Worker### Named Arguments
279*5c90c05cSAndroid Build Coastguard Worker
280*5c90c05cSAndroid Build Coastguard Worker::: arg(const Char*, const T&)
281*5c90c05cSAndroid Build Coastguard Worker
282*5c90c05cSAndroid Build Coastguard WorkerNamed arguments are not supported in compile-time checks at the moment.
283*5c90c05cSAndroid Build Coastguard Worker
284*5c90c05cSAndroid Build Coastguard Worker### Type Erasure
285*5c90c05cSAndroid Build Coastguard Worker
286*5c90c05cSAndroid Build Coastguard WorkerYou can create your own formatting function with compile-time checks and
287*5c90c05cSAndroid Build Coastguard Workersmall binary footprint, for example ([run](https://godbolt.org/z/b9Pbasvzc)):
288*5c90c05cSAndroid Build Coastguard Worker
289*5c90c05cSAndroid Build Coastguard Worker```c++
290*5c90c05cSAndroid Build Coastguard Worker#include <fmt/format.h>
291*5c90c05cSAndroid Build Coastguard Worker
292*5c90c05cSAndroid Build Coastguard Workervoid vlog(const char* file, int line,
293*5c90c05cSAndroid Build Coastguard Worker          fmt::string_view fmt, fmt::format_args args) {
294*5c90c05cSAndroid Build Coastguard Worker  fmt::print("{}: {}: {}", file, line, fmt::vformat(fmt, args));
295*5c90c05cSAndroid Build Coastguard Worker}
296*5c90c05cSAndroid Build Coastguard Worker
297*5c90c05cSAndroid Build Coastguard Workertemplate <typename... T>
298*5c90c05cSAndroid Build Coastguard Workervoid log(const char* file, int line,
299*5c90c05cSAndroid Build Coastguard Worker         fmt::format_string<T...> fmt, T&&... args) {
300*5c90c05cSAndroid Build Coastguard Worker  vlog(file, line, fmt, fmt::make_format_args(args...));
301*5c90c05cSAndroid Build Coastguard Worker}
302*5c90c05cSAndroid Build Coastguard Worker
303*5c90c05cSAndroid Build Coastguard Worker#define MY_LOG(fmt, ...) log(__FILE__, __LINE__, fmt, __VA_ARGS__)
304*5c90c05cSAndroid Build Coastguard Worker
305*5c90c05cSAndroid Build Coastguard WorkerMY_LOG("invalid squishiness: {}", 42);
306*5c90c05cSAndroid Build Coastguard Worker```
307*5c90c05cSAndroid Build Coastguard Worker
308*5c90c05cSAndroid Build Coastguard WorkerNote that `vlog` is not parameterized on argument types which improves
309*5c90c05cSAndroid Build Coastguard Workercompile times and reduces binary code size compared to a fully
310*5c90c05cSAndroid Build Coastguard Workerparameterized version.
311*5c90c05cSAndroid Build Coastguard Worker
312*5c90c05cSAndroid Build Coastguard Worker::: make_format_args(T&...)
313*5c90c05cSAndroid Build Coastguard Worker
314*5c90c05cSAndroid Build Coastguard Worker::: basic_format_args
315*5c90c05cSAndroid Build Coastguard Worker
316*5c90c05cSAndroid Build Coastguard Worker::: format_args
317*5c90c05cSAndroid Build Coastguard Worker
318*5c90c05cSAndroid Build Coastguard Worker::: basic_format_arg
319*5c90c05cSAndroid Build Coastguard Worker
320*5c90c05cSAndroid Build Coastguard Worker### Compatibility
321*5c90c05cSAndroid Build Coastguard Worker
322*5c90c05cSAndroid Build Coastguard Worker::: basic_string_view
323*5c90c05cSAndroid Build Coastguard Worker
324*5c90c05cSAndroid Build Coastguard Worker::: string_view
325*5c90c05cSAndroid Build Coastguard Worker
326*5c90c05cSAndroid Build Coastguard Worker## Format API
327*5c90c05cSAndroid Build Coastguard Worker
328*5c90c05cSAndroid Build Coastguard Worker`fmt/format.h` defines the full format API providing additional
329*5c90c05cSAndroid Build Coastguard Workerformatting functions and locale support.
330*5c90c05cSAndroid Build Coastguard Worker
331*5c90c05cSAndroid Build Coastguard Worker<a id="format"></a>
332*5c90c05cSAndroid Build Coastguard Worker::: format(format_string<T...>, T&&...)
333*5c90c05cSAndroid Build Coastguard Worker
334*5c90c05cSAndroid Build Coastguard Worker::: vformat(string_view, format_args)
335*5c90c05cSAndroid Build Coastguard Worker
336*5c90c05cSAndroid Build Coastguard Worker::: operator""_a()
337*5c90c05cSAndroid Build Coastguard Worker
338*5c90c05cSAndroid Build Coastguard Worker### Utilities
339*5c90c05cSAndroid Build Coastguard Worker
340*5c90c05cSAndroid Build Coastguard Worker::: ptr(T)
341*5c90c05cSAndroid Build Coastguard Worker
342*5c90c05cSAndroid Build Coastguard Worker::: underlying(Enum)
343*5c90c05cSAndroid Build Coastguard Worker
344*5c90c05cSAndroid Build Coastguard Worker::: to_string(const T&)
345*5c90c05cSAndroid Build Coastguard Worker
346*5c90c05cSAndroid Build Coastguard Worker::: group_digits(T)
347*5c90c05cSAndroid Build Coastguard Worker
348*5c90c05cSAndroid Build Coastguard Worker::: detail::buffer
349*5c90c05cSAndroid Build Coastguard Worker
350*5c90c05cSAndroid Build Coastguard Worker::: basic_memory_buffer
351*5c90c05cSAndroid Build Coastguard Worker
352*5c90c05cSAndroid Build Coastguard Worker### System Errors
353*5c90c05cSAndroid Build Coastguard Worker
354*5c90c05cSAndroid Build Coastguard Worker{fmt} does not use `errno` to communicate errors to the user, but it may
355*5c90c05cSAndroid Build Coastguard Workercall system functions which set `errno`. Users should not make any
356*5c90c05cSAndroid Build Coastguard Workerassumptions about the value of `errno` being preserved by library
357*5c90c05cSAndroid Build Coastguard Workerfunctions.
358*5c90c05cSAndroid Build Coastguard Worker
359*5c90c05cSAndroid Build Coastguard Worker::: system_error
360*5c90c05cSAndroid Build Coastguard Worker
361*5c90c05cSAndroid Build Coastguard Worker::: format_system_error
362*5c90c05cSAndroid Build Coastguard Worker
363*5c90c05cSAndroid Build Coastguard Worker### Custom Allocators
364*5c90c05cSAndroid Build Coastguard Worker
365*5c90c05cSAndroid Build Coastguard WorkerThe {fmt} library supports custom dynamic memory allocators. A custom
366*5c90c05cSAndroid Build Coastguard Workerallocator class can be specified as a template argument to
367*5c90c05cSAndroid Build Coastguard Worker[`fmt::basic_memory_buffer`](#basic_memory_buffer):
368*5c90c05cSAndroid Build Coastguard Worker
369*5c90c05cSAndroid Build Coastguard Worker    using custom_memory_buffer =
370*5c90c05cSAndroid Build Coastguard Worker      fmt::basic_memory_buffer<char, fmt::inline_buffer_size, custom_allocator>;
371*5c90c05cSAndroid Build Coastguard Worker
372*5c90c05cSAndroid Build Coastguard WorkerIt is also possible to write a formatting function that uses a custom
373*5c90c05cSAndroid Build Coastguard Workerallocator:
374*5c90c05cSAndroid Build Coastguard Worker
375*5c90c05cSAndroid Build Coastguard Worker    using custom_string =
376*5c90c05cSAndroid Build Coastguard Worker      std::basic_string<char, std::char_traits<char>, custom_allocator>;
377*5c90c05cSAndroid Build Coastguard Worker
378*5c90c05cSAndroid Build Coastguard Worker    auto vformat(custom_allocator alloc, fmt::string_view fmt,
379*5c90c05cSAndroid Build Coastguard Worker                 fmt::format_args args) -> custom_string {
380*5c90c05cSAndroid Build Coastguard Worker      auto buf = custom_memory_buffer(alloc);
381*5c90c05cSAndroid Build Coastguard Worker      fmt::vformat_to(std::back_inserter(buf), fmt, args);
382*5c90c05cSAndroid Build Coastguard Worker      return custom_string(buf.data(), buf.size(), alloc);
383*5c90c05cSAndroid Build Coastguard Worker    }
384*5c90c05cSAndroid Build Coastguard Worker
385*5c90c05cSAndroid Build Coastguard Worker    template <typename ...Args>
386*5c90c05cSAndroid Build Coastguard Worker    auto format(custom_allocator alloc, fmt::string_view fmt,
387*5c90c05cSAndroid Build Coastguard Worker                const Args& ... args) -> custom_string {
388*5c90c05cSAndroid Build Coastguard Worker      return vformat(alloc, fmt, fmt::make_format_args(args...));
389*5c90c05cSAndroid Build Coastguard Worker    }
390*5c90c05cSAndroid Build Coastguard Worker
391*5c90c05cSAndroid Build Coastguard WorkerThe allocator will be used for the output container only. Formatting
392*5c90c05cSAndroid Build Coastguard Workerfunctions normally don't do any allocations for built-in and string
393*5c90c05cSAndroid Build Coastguard Workertypes except for non-default floating-point formatting that occasionally
394*5c90c05cSAndroid Build Coastguard Workerfalls back on `sprintf`.
395*5c90c05cSAndroid Build Coastguard Worker
396*5c90c05cSAndroid Build Coastguard Worker### Locale
397*5c90c05cSAndroid Build Coastguard Worker
398*5c90c05cSAndroid Build Coastguard WorkerAll formatting is locale-independent by default. Use the `'L'` format
399*5c90c05cSAndroid Build Coastguard Workerspecifier to insert the appropriate number separator characters from the
400*5c90c05cSAndroid Build Coastguard Workerlocale:
401*5c90c05cSAndroid Build Coastguard Worker
402*5c90c05cSAndroid Build Coastguard Worker    #include <fmt/core.h>
403*5c90c05cSAndroid Build Coastguard Worker    #include <locale>
404*5c90c05cSAndroid Build Coastguard Worker
405*5c90c05cSAndroid Build Coastguard Worker    std::locale::global(std::locale("en_US.UTF-8"));
406*5c90c05cSAndroid Build Coastguard Worker    auto s = fmt::format("{:L}", 1000000);  // s == "1,000,000"
407*5c90c05cSAndroid Build Coastguard Worker
408*5c90c05cSAndroid Build Coastguard Worker`fmt/format.h` provides the following overloads of formatting functions
409*5c90c05cSAndroid Build Coastguard Workerthat take `std::locale` as a parameter. The locale type is a template
410*5c90c05cSAndroid Build Coastguard Workerparameter to avoid the expensive `<locale>` include.
411*5c90c05cSAndroid Build Coastguard Worker
412*5c90c05cSAndroid Build Coastguard Worker::: format(detail::locale_ref, format_string<T...>, T&&...)
413*5c90c05cSAndroid Build Coastguard Worker
414*5c90c05cSAndroid Build Coastguard Worker::: format_to(OutputIt, detail::locale_ref, format_string<T...>, T&&...)
415*5c90c05cSAndroid Build Coastguard Worker
416*5c90c05cSAndroid Build Coastguard Worker::: formatted_size(detail::locale_ref, format_string<T...>, T&&...)
417*5c90c05cSAndroid Build Coastguard Worker
418*5c90c05cSAndroid Build Coastguard Worker<a id="legacy-checks"></a>
419*5c90c05cSAndroid Build Coastguard Worker### Legacy Compile-Time Checks
420*5c90c05cSAndroid Build Coastguard Worker
421*5c90c05cSAndroid Build Coastguard Worker`FMT_STRING` enables compile-time checks on older compilers. It requires
422*5c90c05cSAndroid Build Coastguard WorkerC++14 or later and is a no-op in C++11.
423*5c90c05cSAndroid Build Coastguard Worker
424*5c90c05cSAndroid Build Coastguard Worker::: FMT_STRING
425*5c90c05cSAndroid Build Coastguard Worker
426*5c90c05cSAndroid Build Coastguard WorkerTo force the use of legacy compile-time checks, define the preprocessor
427*5c90c05cSAndroid Build Coastguard Workervariable `FMT_ENFORCE_COMPILE_STRING`. When set, functions accepting
428*5c90c05cSAndroid Build Coastguard Worker`FMT_STRING` will fail to compile with regular strings.
429*5c90c05cSAndroid Build Coastguard Worker
430*5c90c05cSAndroid Build Coastguard Worker<a id="ranges-api"></a>
431*5c90c05cSAndroid Build Coastguard Worker## Range and Tuple Formatting
432*5c90c05cSAndroid Build Coastguard Worker
433*5c90c05cSAndroid Build Coastguard Worker`fmt/ranges.h` provides formatting support for ranges and tuples:
434*5c90c05cSAndroid Build Coastguard Worker
435*5c90c05cSAndroid Build Coastguard Worker    #include <fmt/ranges.h>
436*5c90c05cSAndroid Build Coastguard Worker
437*5c90c05cSAndroid Build Coastguard Worker    fmt::print("{}", std::tuple<char, int>{'a', 42});
438*5c90c05cSAndroid Build Coastguard Worker    // Output: ('a', 42)
439*5c90c05cSAndroid Build Coastguard Worker
440*5c90c05cSAndroid Build Coastguard WorkerUsing `fmt::join`, you can separate tuple elements with a custom separator:
441*5c90c05cSAndroid Build Coastguard Worker
442*5c90c05cSAndroid Build Coastguard Worker    #include <fmt/ranges.h>
443*5c90c05cSAndroid Build Coastguard Worker
444*5c90c05cSAndroid Build Coastguard Worker    auto t = std::tuple<int, char>{1, 'a'};
445*5c90c05cSAndroid Build Coastguard Worker    fmt::print("{}", fmt::join(t, ", "));
446*5c90c05cSAndroid Build Coastguard Worker    // Output: 1, a
447*5c90c05cSAndroid Build Coastguard Worker
448*5c90c05cSAndroid Build Coastguard Worker::: join(Range&&, string_view)
449*5c90c05cSAndroid Build Coastguard Worker
450*5c90c05cSAndroid Build Coastguard Worker::: join(It, Sentinel, string_view)
451*5c90c05cSAndroid Build Coastguard Worker
452*5c90c05cSAndroid Build Coastguard Worker::: join(std::initializer_list<T>, string_view)
453*5c90c05cSAndroid Build Coastguard Worker
454*5c90c05cSAndroid Build Coastguard Worker<a id="chrono-api"></a>
455*5c90c05cSAndroid Build Coastguard Worker## Date and Time Formatting
456*5c90c05cSAndroid Build Coastguard Worker
457*5c90c05cSAndroid Build Coastguard Worker`fmt/chrono.h` provides formatters for
458*5c90c05cSAndroid Build Coastguard Worker
459*5c90c05cSAndroid Build Coastguard Worker- [`std::chrono::duration`](https://en.cppreference.com/w/cpp/chrono/duration)
460*5c90c05cSAndroid Build Coastguard Worker- [`std::chrono::time_point`](
461*5c90c05cSAndroid Build Coastguard Worker  https://en.cppreference.com/w/cpp/chrono/time_point)
462*5c90c05cSAndroid Build Coastguard Worker- [`std::tm`](https://en.cppreference.com/w/cpp/chrono/c/tm)
463*5c90c05cSAndroid Build Coastguard Worker
464*5c90c05cSAndroid Build Coastguard WorkerThe format syntax is described in [Chrono Format Specifications](syntax.md#
465*5c90c05cSAndroid Build Coastguard Workerchrono-format-specifications).
466*5c90c05cSAndroid Build Coastguard Worker
467*5c90c05cSAndroid Build Coastguard Worker**Example**:
468*5c90c05cSAndroid Build Coastguard Worker
469*5c90c05cSAndroid Build Coastguard Worker    #include <fmt/chrono.h>
470*5c90c05cSAndroid Build Coastguard Worker
471*5c90c05cSAndroid Build Coastguard Worker    int main() {
472*5c90c05cSAndroid Build Coastguard Worker      std::time_t t = std::time(nullptr);
473*5c90c05cSAndroid Build Coastguard Worker
474*5c90c05cSAndroid Build Coastguard Worker      fmt::print("The date is {:%Y-%m-%d}.", fmt::localtime(t));
475*5c90c05cSAndroid Build Coastguard Worker      // Output: The date is 2020-11-07.
476*5c90c05cSAndroid Build Coastguard Worker      // (with 2020-11-07 replaced by the current date)
477*5c90c05cSAndroid Build Coastguard Worker
478*5c90c05cSAndroid Build Coastguard Worker      using namespace std::literals::chrono_literals;
479*5c90c05cSAndroid Build Coastguard Worker
480*5c90c05cSAndroid Build Coastguard Worker      fmt::print("Default format: {} {}\n", 42s, 100ms);
481*5c90c05cSAndroid Build Coastguard Worker      // Output: Default format: 42s 100ms
482*5c90c05cSAndroid Build Coastguard Worker
483*5c90c05cSAndroid Build Coastguard Worker      fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s);
484*5c90c05cSAndroid Build Coastguard Worker      // Output: strftime-like format: 03:15:30
485*5c90c05cSAndroid Build Coastguard Worker    }
486*5c90c05cSAndroid Build Coastguard Worker
487*5c90c05cSAndroid Build Coastguard Worker::: localtime(std::time_t)
488*5c90c05cSAndroid Build Coastguard Worker
489*5c90c05cSAndroid Build Coastguard Worker::: gmtime(std::time_t)
490*5c90c05cSAndroid Build Coastguard Worker
491*5c90c05cSAndroid Build Coastguard Worker<a id="std-api"></a>
492*5c90c05cSAndroid Build Coastguard Worker## Standard Library Types Formatting
493*5c90c05cSAndroid Build Coastguard Worker
494*5c90c05cSAndroid Build Coastguard Worker`fmt/std.h` provides formatters for:
495*5c90c05cSAndroid Build Coastguard Worker
496*5c90c05cSAndroid Build Coastguard Worker- [`std::atomic`](https://en.cppreference.com/w/cpp/atomic/atomic)
497*5c90c05cSAndroid Build Coastguard Worker- [`std::atomic_flag`](https://en.cppreference.com/w/cpp/atomic/atomic_flag)
498*5c90c05cSAndroid Build Coastguard Worker- [`std::bitset`](https://en.cppreference.com/w/cpp/utility/bitset)
499*5c90c05cSAndroid Build Coastguard Worker- [`std::error_code`](https://en.cppreference.com/w/cpp/error/error_code)
500*5c90c05cSAndroid Build Coastguard Worker- [`std::filesystem::path`](https://en.cppreference.com/w/cpp/filesystem/path)
501*5c90c05cSAndroid Build Coastguard Worker- [`std::monostate`](https://en.cppreference.com/w/cpp/utility/variant/monostate)
502*5c90c05cSAndroid Build Coastguard Worker- [`std::optional`](https://en.cppreference.com/w/cpp/utility/optional)
503*5c90c05cSAndroid Build Coastguard Worker- [`std::source_location`](https://en.cppreference.com/w/cpp/utility/source_location)
504*5c90c05cSAndroid Build Coastguard Worker- [`std::thread::id`](https://en.cppreference.com/w/cpp/thread/thread/id)
505*5c90c05cSAndroid Build Coastguard Worker- [`std::variant`](https://en.cppreference.com/w/cpp/utility/variant/variant)
506*5c90c05cSAndroid Build Coastguard Worker
507*5c90c05cSAndroid Build Coastguard Worker::: ptr(const std::unique_ptr<T, Deleter>&)
508*5c90c05cSAndroid Build Coastguard Worker
509*5c90c05cSAndroid Build Coastguard Worker::: ptr(const std::shared_ptr<T>&)
510*5c90c05cSAndroid Build Coastguard Worker
511*5c90c05cSAndroid Build Coastguard Worker### Formatting Variants
512*5c90c05cSAndroid Build Coastguard Worker
513*5c90c05cSAndroid Build Coastguard WorkerA `std::variant` is only formattable if every variant alternative is
514*5c90c05cSAndroid Build Coastguard Workerformattable, and requires the `__cpp_lib_variant` [library
515*5c90c05cSAndroid Build Coastguard Workerfeature](https://en.cppreference.com/w/cpp/feature_test).
516*5c90c05cSAndroid Build Coastguard Worker
517*5c90c05cSAndroid Build Coastguard Worker**Example**:
518*5c90c05cSAndroid Build Coastguard Worker
519*5c90c05cSAndroid Build Coastguard Worker    #include <fmt/std.h>
520*5c90c05cSAndroid Build Coastguard Worker
521*5c90c05cSAndroid Build Coastguard Worker    fmt::print("{}", std::variant<char, float>('x'));
522*5c90c05cSAndroid Build Coastguard Worker    // Output: variant('x')
523*5c90c05cSAndroid Build Coastguard Worker
524*5c90c05cSAndroid Build Coastguard Worker    fmt::print("{}", std::variant<std::monostate, char>());
525*5c90c05cSAndroid Build Coastguard Worker    // Output: variant(monostate)
526*5c90c05cSAndroid Build Coastguard Worker
527*5c90c05cSAndroid Build Coastguard Worker<a id="compile-api"></a>
528*5c90c05cSAndroid Build Coastguard Worker## Format String Compilation
529*5c90c05cSAndroid Build Coastguard Worker
530*5c90c05cSAndroid Build Coastguard Worker`fmt/compile.h` provides format string compilation enabled via the
531*5c90c05cSAndroid Build Coastguard Worker`FMT_COMPILE` macro or the `_cf` user-defined literal defined in
532*5c90c05cSAndroid Build Coastguard Workernamespace `fmt::literals`. Format strings marked with `FMT_COMPILE`
533*5c90c05cSAndroid Build Coastguard Workeror `_cf` are parsed, checked and converted into efficient formatting
534*5c90c05cSAndroid Build Coastguard Workercode at compile-time. This supports arguments of built-in and string
535*5c90c05cSAndroid Build Coastguard Workertypes as well as user-defined types with `format` functions taking
536*5c90c05cSAndroid Build Coastguard Workerthe format context type as a template parameter in their `formatter`
537*5c90c05cSAndroid Build Coastguard Workerspecializations. For example:
538*5c90c05cSAndroid Build Coastguard Worker
539*5c90c05cSAndroid Build Coastguard Worker    template <> struct fmt::formatter<point> {
540*5c90c05cSAndroid Build Coastguard Worker      constexpr auto parse(format_parse_context& ctx);
541*5c90c05cSAndroid Build Coastguard Worker
542*5c90c05cSAndroid Build Coastguard Worker      template <typename FormatContext>
543*5c90c05cSAndroid Build Coastguard Worker      auto format(const point& p, FormatContext& ctx) const;
544*5c90c05cSAndroid Build Coastguard Worker    };
545*5c90c05cSAndroid Build Coastguard Worker
546*5c90c05cSAndroid Build Coastguard WorkerFormat string compilation can generate more binary code compared to the
547*5c90c05cSAndroid Build Coastguard Workerdefault API and is only recommended in places where formatting is a
548*5c90c05cSAndroid Build Coastguard Workerperformance bottleneck.
549*5c90c05cSAndroid Build Coastguard Worker
550*5c90c05cSAndroid Build Coastguard Worker::: FMT_COMPILE
551*5c90c05cSAndroid Build Coastguard Worker
552*5c90c05cSAndroid Build Coastguard Worker::: operator""_cf
553*5c90c05cSAndroid Build Coastguard Worker
554*5c90c05cSAndroid Build Coastguard Worker<a id="color-api"></a>
555*5c90c05cSAndroid Build Coastguard Worker## Terminal Colors and Text Styles
556*5c90c05cSAndroid Build Coastguard Worker
557*5c90c05cSAndroid Build Coastguard Worker`fmt/color.h` provides support for terminal color and text style output.
558*5c90c05cSAndroid Build Coastguard Worker
559*5c90c05cSAndroid Build Coastguard Worker::: print(const text_style&, format_string<T...>, T&&...)
560*5c90c05cSAndroid Build Coastguard Worker
561*5c90c05cSAndroid Build Coastguard Worker::: fg(detail::color_type)
562*5c90c05cSAndroid Build Coastguard Worker
563*5c90c05cSAndroid Build Coastguard Worker::: bg(detail::color_type)
564*5c90c05cSAndroid Build Coastguard Worker
565*5c90c05cSAndroid Build Coastguard Worker::: styled(const T&, text_style)
566*5c90c05cSAndroid Build Coastguard Worker
567*5c90c05cSAndroid Build Coastguard Worker<a id="os-api"></a>
568*5c90c05cSAndroid Build Coastguard Worker## System APIs
569*5c90c05cSAndroid Build Coastguard Worker
570*5c90c05cSAndroid Build Coastguard Worker::: ostream
571*5c90c05cSAndroid Build Coastguard Worker
572*5c90c05cSAndroid Build Coastguard Worker::: windows_error
573*5c90c05cSAndroid Build Coastguard Worker
574*5c90c05cSAndroid Build Coastguard Worker<a id="ostream-api"></a>
575*5c90c05cSAndroid Build Coastguard Worker## `std::ostream` Support
576*5c90c05cSAndroid Build Coastguard Worker
577*5c90c05cSAndroid Build Coastguard Worker`fmt/ostream.h` provides `std::ostream` support including formatting of
578*5c90c05cSAndroid Build Coastguard Workeruser-defined types that have an overloaded insertion operator
579*5c90c05cSAndroid Build Coastguard Worker(`operator<<`). In order to make a type formattable via `std::ostream`
580*5c90c05cSAndroid Build Coastguard Workeryou should provide a `formatter` specialization inherited from
581*5c90c05cSAndroid Build Coastguard Worker`ostream_formatter`:
582*5c90c05cSAndroid Build Coastguard Worker
583*5c90c05cSAndroid Build Coastguard Worker    #include <fmt/ostream.h>
584*5c90c05cSAndroid Build Coastguard Worker
585*5c90c05cSAndroid Build Coastguard Worker    struct date {
586*5c90c05cSAndroid Build Coastguard Worker      int year, month, day;
587*5c90c05cSAndroid Build Coastguard Worker
588*5c90c05cSAndroid Build Coastguard Worker      friend std::ostream& operator<<(std::ostream& os, const date& d) {
589*5c90c05cSAndroid Build Coastguard Worker        return os << d.year << '-' << d.month << '-' << d.day;
590*5c90c05cSAndroid Build Coastguard Worker      }
591*5c90c05cSAndroid Build Coastguard Worker    };
592*5c90c05cSAndroid Build Coastguard Worker
593*5c90c05cSAndroid Build Coastguard Worker    template <> struct fmt::formatter<date> : ostream_formatter {};
594*5c90c05cSAndroid Build Coastguard Worker
595*5c90c05cSAndroid Build Coastguard Worker    std::string s = fmt::format("The date is {}", date{2012, 12, 9});
596*5c90c05cSAndroid Build Coastguard Worker    // s == "The date is 2012-12-9"
597*5c90c05cSAndroid Build Coastguard Worker
598*5c90c05cSAndroid Build Coastguard Worker::: streamed(const T&)
599*5c90c05cSAndroid Build Coastguard Worker
600*5c90c05cSAndroid Build Coastguard Worker::: print(std::ostream&, format_string<T...>, T&&...)
601*5c90c05cSAndroid Build Coastguard Worker
602*5c90c05cSAndroid Build Coastguard Worker<a id="args-api"></a>
603*5c90c05cSAndroid Build Coastguard Worker## Dynamic Argument Lists
604*5c90c05cSAndroid Build Coastguard Worker
605*5c90c05cSAndroid Build Coastguard WorkerThe header `fmt/args.h` provides `dynamic_format_arg_store`, a builder-like API
606*5c90c05cSAndroid Build Coastguard Workerthat can be used to construct format argument lists dynamically.
607*5c90c05cSAndroid Build Coastguard Worker
608*5c90c05cSAndroid Build Coastguard Worker::: dynamic_format_arg_store
609*5c90c05cSAndroid Build Coastguard Worker
610*5c90c05cSAndroid Build Coastguard Worker<a id="printf-api"></a>
611*5c90c05cSAndroid Build Coastguard Worker## Safe `printf`
612*5c90c05cSAndroid Build Coastguard Worker
613*5c90c05cSAndroid Build Coastguard WorkerThe header `fmt/printf.h` provides `printf`-like formatting
614*5c90c05cSAndroid Build Coastguard Workerfunctionality. The following functions use [printf format string
615*5c90c05cSAndroid Build Coastguard Workersyntax](https://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html)
616*5c90c05cSAndroid Build Coastguard Workerwith the POSIX extension for positional arguments. Unlike their standard
617*5c90c05cSAndroid Build Coastguard Workercounterparts, the `fmt` functions are type-safe and throw an exception
618*5c90c05cSAndroid Build Coastguard Workerif an argument type doesn't match its format specification.
619*5c90c05cSAndroid Build Coastguard Worker
620*5c90c05cSAndroid Build Coastguard Worker::: printf(string_view, const T&...)
621*5c90c05cSAndroid Build Coastguard Worker
622*5c90c05cSAndroid Build Coastguard Worker::: fprintf(std::FILE*, const S&, const T&...)
623*5c90c05cSAndroid Build Coastguard Worker
624*5c90c05cSAndroid Build Coastguard Worker::: sprintf(const S&, const T&...)
625*5c90c05cSAndroid Build Coastguard Worker
626*5c90c05cSAndroid Build Coastguard Worker<a id="xchar-api"></a>
627*5c90c05cSAndroid Build Coastguard Worker## Wide Strings
628*5c90c05cSAndroid Build Coastguard Worker
629*5c90c05cSAndroid Build Coastguard WorkerThe optional header `fmt/xchar.h` provides support for `wchar_t` and
630*5c90c05cSAndroid Build Coastguard Workerexotic character types.
631*5c90c05cSAndroid Build Coastguard Worker
632*5c90c05cSAndroid Build Coastguard Worker::: is_char
633*5c90c05cSAndroid Build Coastguard Worker
634*5c90c05cSAndroid Build Coastguard Worker::: wstring_view
635*5c90c05cSAndroid Build Coastguard Worker
636*5c90c05cSAndroid Build Coastguard Worker::: wformat_context
637*5c90c05cSAndroid Build Coastguard Worker
638*5c90c05cSAndroid Build Coastguard Worker::: to_wstring(const T&)
639*5c90c05cSAndroid Build Coastguard Worker
640*5c90c05cSAndroid Build Coastguard Worker## Compatibility with C++20 `std::format`
641*5c90c05cSAndroid Build Coastguard Worker
642*5c90c05cSAndroid Build Coastguard Worker{fmt} implements nearly all of the [C++20 formatting
643*5c90c05cSAndroid Build Coastguard Workerlibrary](https://en.cppreference.com/w/cpp/utility/format) with the
644*5c90c05cSAndroid Build Coastguard Workerfollowing differences:
645*5c90c05cSAndroid Build Coastguard Worker
646*5c90c05cSAndroid Build Coastguard Worker- Names are defined in the `fmt` namespace instead of `std` to avoid
647*5c90c05cSAndroid Build Coastguard Worker  collisions with standard library implementations.
648*5c90c05cSAndroid Build Coastguard Worker- Width calculation doesn't use grapheme clusterization. The latter has
649*5c90c05cSAndroid Build Coastguard Worker  been implemented in a separate branch but hasn't been integrated yet.
650