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