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