comparison dep/fmt/doc/api.rst @ 343:1faa72660932

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