xref: /aosp_15_r20/external/fmtlib/doc/index.md (revision 5c90c05cd622c0a81b57953a4d343e0e489f2e08)
1*5c90c05cSAndroid Build Coastguard Worker---
2*5c90c05cSAndroid Build Coastguard Workerhide:
3*5c90c05cSAndroid Build Coastguard Worker  - navigation
4*5c90c05cSAndroid Build Coastguard Worker  - toc
5*5c90c05cSAndroid Build Coastguard Worker---
6*5c90c05cSAndroid Build Coastguard Worker
7*5c90c05cSAndroid Build Coastguard Worker# A modern formatting library
8*5c90c05cSAndroid Build Coastguard Worker
9*5c90c05cSAndroid Build Coastguard Worker<div class="features-container">
10*5c90c05cSAndroid Build Coastguard Worker
11*5c90c05cSAndroid Build Coastguard Worker<div class="feature">
12*5c90c05cSAndroid Build Coastguard Worker<h2>Safety</h2>
13*5c90c05cSAndroid Build Coastguard Worker<p>
14*5c90c05cSAndroid Build Coastguard Worker  Inspired by Python's formatting facility, {fmt} provides a safe replacement
15*5c90c05cSAndroid Build Coastguard Worker  for the <code>printf</code> family of functions. Errors in format strings,
16*5c90c05cSAndroid Build Coastguard Worker  which are a common source of vulnerabilities in C, are <b>reported at
17*5c90c05cSAndroid Build Coastguard Worker  compile time</b>. For example:
18*5c90c05cSAndroid Build Coastguard Worker
19*5c90c05cSAndroid Build Coastguard Worker  <pre><code class="language-cpp"
20*5c90c05cSAndroid Build Coastguard Worker  >fmt::format("{:d}", "I am not a number");</code></pre>
21*5c90c05cSAndroid Build Coastguard Worker
22*5c90c05cSAndroid Build Coastguard Worker  will give a compile-time error because <code>d</code> is not a valid
23*5c90c05cSAndroid Build Coastguard Worker  format specifier for strings. APIs like <a href="api/#format">
24*5c90c05cSAndroid Build Coastguard Worker  <code>fmt::format</code></a> <b>prevent buffer overflow errors</b> via
25*5c90c05cSAndroid Build Coastguard Worker  automatic memory management.
26*5c90c05cSAndroid Build Coastguard Worker</p>
27*5c90c05cSAndroid Build Coastguard Worker<a href="api#compile-time-checks">→ Learn more</a>
28*5c90c05cSAndroid Build Coastguard Worker</div>
29*5c90c05cSAndroid Build Coastguard Worker
30*5c90c05cSAndroid Build Coastguard Worker<div class="feature">
31*5c90c05cSAndroid Build Coastguard Worker<h2>Extensibility</h2>
32*5c90c05cSAndroid Build Coastguard Worker<p>
33*5c90c05cSAndroid Build Coastguard Worker  Formatting of most <b>standard types</b>, including all containers, dates,
34*5c90c05cSAndroid Build Coastguard Worker  and times is <b>supported out-of-the-box</b>. For example:
35*5c90c05cSAndroid Build Coastguard Worker
36*5c90c05cSAndroid Build Coastguard Worker  <pre><code class="language-cpp"
37*5c90c05cSAndroid Build Coastguard Worker  >fmt::print("{}", std::vector{1, 2, 3});</code></pre>
38*5c90c05cSAndroid Build Coastguard Worker
39*5c90c05cSAndroid Build Coastguard Worker  prints the vector in a JSON-like format:
40*5c90c05cSAndroid Build Coastguard Worker
41*5c90c05cSAndroid Build Coastguard Worker  <pre><code>[1, 2, 3]</code></pre>
42*5c90c05cSAndroid Build Coastguard Worker
43*5c90c05cSAndroid Build Coastguard Worker  You can <b>make your own types formattable</b> and even make compile-time
44*5c90c05cSAndroid Build Coastguard Worker  checks work for them.
45*5c90c05cSAndroid Build Coastguard Worker</p>
46*5c90c05cSAndroid Build Coastguard Worker<a href="api#udt">→ Learn more</a>
47*5c90c05cSAndroid Build Coastguard Worker</div>
48*5c90c05cSAndroid Build Coastguard Worker
49*5c90c05cSAndroid Build Coastguard Worker<div class="feature">
50*5c90c05cSAndroid Build Coastguard Worker<h2>Performance</h2>
51*5c90c05cSAndroid Build Coastguard Worker<p>
52*5c90c05cSAndroid Build Coastguard Worker  {fmt} can be anywhere from <b>tens of percent to 20-30 times faster</b> than
53*5c90c05cSAndroid Build Coastguard Worker  iostreams and <code>sprintf</code>, especially for numeric formatting.
54*5c90c05cSAndroid Build Coastguard Worker
55*5c90c05cSAndroid Build Coastguard Worker<a href="https://github.com/fmtlib/fmt?tab=readme-ov-file#benchmarks">
56*5c90c05cSAndroid Build Coastguard Worker<img src="perf.svg">
57*5c90c05cSAndroid Build Coastguard Worker</a>
58*5c90c05cSAndroid Build Coastguard Worker
59*5c90c05cSAndroid Build Coastguard Worker  The library <b>minimizes dynamic memory allocations</b> and can optionally
60*5c90c05cSAndroid Build Coastguard Worker  <a href="api#compile-api">compile format strings</a> to optimal code.
61*5c90c05cSAndroid Build Coastguard Worker</p>
62*5c90c05cSAndroid Build Coastguard Worker</div>
63*5c90c05cSAndroid Build Coastguard Worker
64*5c90c05cSAndroid Build Coastguard Worker<div class="feature">
65*5c90c05cSAndroid Build Coastguard Worker<h2>Unicode support</h2>
66*5c90c05cSAndroid Build Coastguard Worker<p>
67*5c90c05cSAndroid Build Coastguard Worker  {fmt} provides <b>portable Unicode support</b> on major operating systems
68*5c90c05cSAndroid Build Coastguard Worker  with UTF-8 and <code>char</code> strings. For example:
69*5c90c05cSAndroid Build Coastguard Worker
70*5c90c05cSAndroid Build Coastguard Worker  <pre><code class="language-cpp"
71*5c90c05cSAndroid Build Coastguard Worker  >fmt::print("Слава Україні!");</code></pre>
72*5c90c05cSAndroid Build Coastguard Worker
73*5c90c05cSAndroid Build Coastguard Worker  will be printed correctly on Linux, macOS, and even Windows console,
74*5c90c05cSAndroid Build Coastguard Worker  irrespective of the codepages.
75*5c90c05cSAndroid Build Coastguard Worker</p>
76*5c90c05cSAndroid Build Coastguard Worker<p>
77*5c90c05cSAndroid Build Coastguard Worker  The default is <b>locale-independent</b>, but you can opt into localized
78*5c90c05cSAndroid Build Coastguard Worker  formatting and {fmt} makes it work with Unicode, addressing issues in the
79*5c90c05cSAndroid Build Coastguard Worker  standard libary.
80*5c90c05cSAndroid Build Coastguard Worker</p>
81*5c90c05cSAndroid Build Coastguard Worker</div>
82*5c90c05cSAndroid Build Coastguard Worker
83*5c90c05cSAndroid Build Coastguard Worker<div class="feature">
84*5c90c05cSAndroid Build Coastguard Worker<h2>Fast compilation</h2>
85*5c90c05cSAndroid Build Coastguard Worker<p>
86*5c90c05cSAndroid Build Coastguard Worker  The library makes extensive use of <b>type erasure</b> to achieve fast
87*5c90c05cSAndroid Build Coastguard Worker  compilation. <code>fmt/base.h</code> provides a subset of the API with
88*5c90c05cSAndroid Build Coastguard Worker  <b>minimal include dependencies</b> and enough functionality to replace
89*5c90c05cSAndroid Build Coastguard Worker  all uses of <code>*printf</code>.
90*5c90c05cSAndroid Build Coastguard Worker</p>
91*5c90c05cSAndroid Build Coastguard Worker<p>
92*5c90c05cSAndroid Build Coastguard Worker  Code using {fmt} is usually several times faster to compile than the
93*5c90c05cSAndroid Build Coastguard Worker  equivalent iostreams code, and while <code>printf</code> compiles faster
94*5c90c05cSAndroid Build Coastguard Worker  still, the gap is narrowing.
95*5c90c05cSAndroid Build Coastguard Worker</p>
96*5c90c05cSAndroid Build Coastguard Worker<a href=
97*5c90c05cSAndroid Build Coastguard Worker"https://github.com/fmtlib/fmt?tab=readme-ov-file#compile-time-and-code-bloat">
98*5c90c05cSAndroid Build Coastguard Worker→ Learn more</a>
99*5c90c05cSAndroid Build Coastguard Worker</div>
100*5c90c05cSAndroid Build Coastguard Worker
101*5c90c05cSAndroid Build Coastguard Worker<div class="feature">
102*5c90c05cSAndroid Build Coastguard Worker<h2>Small binary footprint</h2>
103*5c90c05cSAndroid Build Coastguard Worker<p>
104*5c90c05cSAndroid Build Coastguard Worker  Type erasure is also used to prevent template bloat, resulting in <b>compact
105*5c90c05cSAndroid Build Coastguard Worker  per-call binary code</b>. For example, a call to <code>fmt::print</code> with
106*5c90c05cSAndroid Build Coastguard Worker  a single argument is just <a href="https://godbolt.org/g/TZU4KF">a few
107*5c90c05cSAndroid Build Coastguard Worker  instructions</a>, comparable to <code>printf</code> despite adding
108*5c90c05cSAndroid Build Coastguard Worker  runtime safety, and much smaller than the equivalent iostreams code.
109*5c90c05cSAndroid Build Coastguard Worker</p>
110*5c90c05cSAndroid Build Coastguard Worker<p>
111*5c90c05cSAndroid Build Coastguard Worker  The library itself has small binary footprint and some components such as
112*5c90c05cSAndroid Build Coastguard Worker  floating-point formatting can be disabled to make it even smaller for
113*5c90c05cSAndroid Build Coastguard Worker  resource-constrained devices.
114*5c90c05cSAndroid Build Coastguard Worker</p>
115*5c90c05cSAndroid Build Coastguard Worker</div>
116*5c90c05cSAndroid Build Coastguard Worker
117*5c90c05cSAndroid Build Coastguard Worker<div class="feature">
118*5c90c05cSAndroid Build Coastguard Worker<h2>Portability</h2>
119*5c90c05cSAndroid Build Coastguard Worker<p>
120*5c90c05cSAndroid Build Coastguard Worker  {fmt} has a <b>small self-contained codebase</b> with the core consisting of
121*5c90c05cSAndroid Build Coastguard Worker  just three headers and no external dependencies.
122*5c90c05cSAndroid Build Coastguard Worker</p>
123*5c90c05cSAndroid Build Coastguard Worker<p>
124*5c90c05cSAndroid Build Coastguard Worker  The library is highly portable and requires only a minimal <b>subset of
125*5c90c05cSAndroid Build Coastguard Worker  C++11</b> features which are available in GCC 4.9, Clang 3.4, MSVC 19.0
126*5c90c05cSAndroid Build Coastguard Worker  (2015) and later. Newer compiler and standard library features are used
127*5c90c05cSAndroid Build Coastguard Worker  if available, and enable additional functionality.
128*5c90c05cSAndroid Build Coastguard Worker</p>
129*5c90c05cSAndroid Build Coastguard Worker<p>
130*5c90c05cSAndroid Build Coastguard Worker  Where possible, the output of formatting functions is <b>consistent across
131*5c90c05cSAndroid Build Coastguard Worker  platforms</b>.
132*5c90c05cSAndroid Build Coastguard Worker</p>
133*5c90c05cSAndroid Build Coastguard Worker</p>
134*5c90c05cSAndroid Build Coastguard Worker</div>
135*5c90c05cSAndroid Build Coastguard Worker
136*5c90c05cSAndroid Build Coastguard Worker<div class="feature">
137*5c90c05cSAndroid Build Coastguard Worker<h2>Open source</h2>
138*5c90c05cSAndroid Build Coastguard Worker<p>
139*5c90c05cSAndroid Build Coastguard Worker  {fmt} is in the top hundred open-source C++ libraries on GitHub and has
140*5c90c05cSAndroid Build Coastguard Worker  <a href="https://github.com/fmtlib/fmt/graphs/contributors">hundreds of
141*5c90c05cSAndroid Build Coastguard Worker  all-time contributors</a>.
142*5c90c05cSAndroid Build Coastguard Worker</p>
143*5c90c05cSAndroid Build Coastguard Worker<p>
144*5c90c05cSAndroid Build Coastguard Worker  The library is distributed under a permissive MIT
145*5c90c05cSAndroid Build Coastguard Worker  <a href="https://github.com/fmtlib/fmt#license">license</a> and is
146*5c90c05cSAndroid Build Coastguard Worker  <b>relied upon by many open-source projects</b>, including Blender, PyTorch,
147*5c90c05cSAndroid Build Coastguard Worker  Apple's FoundationDB, Windows Terminal, MongoDB, and others.
148*5c90c05cSAndroid Build Coastguard Worker</p>
149*5c90c05cSAndroid Build Coastguard Worker</div>
150*5c90c05cSAndroid Build Coastguard Worker
151*5c90c05cSAndroid Build Coastguard Worker</div>
152