1*89c4ff92SAndroid Build Coastguard Worker{fmt} 2*89c4ff92SAndroid Build Coastguard Worker===== 3*89c4ff92SAndroid Build Coastguard Worker 4*89c4ff92SAndroid Build Coastguard Worker.. image:: https://travis-ci.org/fmtlib/fmt.png?branch=master 5*89c4ff92SAndroid Build Coastguard Worker :target: https://travis-ci.org/fmtlib/fmt 6*89c4ff92SAndroid Build Coastguard Worker 7*89c4ff92SAndroid Build Coastguard Worker.. image:: https://ci.appveyor.com/api/projects/status/ehjkiefde6gucy1v 8*89c4ff92SAndroid Build Coastguard Worker :target: https://ci.appveyor.com/project/vitaut/fmt 9*89c4ff92SAndroid Build Coastguard Worker 10*89c4ff92SAndroid Build Coastguard Worker.. image:: https://oss-fuzz-build-logs.storage.googleapis.com/badges/libfmt.svg 11*89c4ff92SAndroid Build Coastguard Worker :alt: fmt is continuously fuzzed at oss-fuzz 12*89c4ff92SAndroid Build Coastguard Worker :target: https://bugs.chromium.org/p/oss-fuzz/issues/list?\ 13*89c4ff92SAndroid Build Coastguard Worker colspec=ID%20Type%20Component%20Status%20Proj%20Reported%20Owner%20\ 14*89c4ff92SAndroid Build Coastguard Worker Summary&q=proj%3Dlibfmt&can=1 15*89c4ff92SAndroid Build Coastguard Worker 16*89c4ff92SAndroid Build Coastguard Worker.. image:: https://img.shields.io/badge/stackoverflow-fmt-blue.svg 17*89c4ff92SAndroid Build Coastguard Worker :alt: Ask questions at StackOverflow with the tag fmt 18*89c4ff92SAndroid Build Coastguard Worker :target: https://stackoverflow.com/questions/tagged/fmt 19*89c4ff92SAndroid Build Coastguard Worker 20*89c4ff92SAndroid Build Coastguard Worker**{fmt}** is an open-source formatting library for C++. 21*89c4ff92SAndroid Build Coastguard WorkerIt can be used as a safe and fast alternative to (s)printf and iostreams. 22*89c4ff92SAndroid Build Coastguard Worker 23*89c4ff92SAndroid Build Coastguard Worker`Documentation <https://fmt.dev>`__ 24*89c4ff92SAndroid Build Coastguard Worker 25*89c4ff92SAndroid Build Coastguard WorkerQ&A: ask questions on `StackOverflow with the tag fmt 26*89c4ff92SAndroid Build Coastguard Worker<https://stackoverflow.com/questions/tagged/fmt>`_. 27*89c4ff92SAndroid Build Coastguard Worker 28*89c4ff92SAndroid Build Coastguard WorkerFeatures 29*89c4ff92SAndroid Build Coastguard Worker-------- 30*89c4ff92SAndroid Build Coastguard Worker 31*89c4ff92SAndroid Build Coastguard Worker* Simple `format API <https://fmt.dev/latest/api.html>`_ with positional arguments 32*89c4ff92SAndroid Build Coastguard Worker for localization 33*89c4ff92SAndroid Build Coastguard Worker* Implementation of `C++20 std::format 34*89c4ff92SAndroid Build Coastguard Worker <https://en.cppreference.com/w/cpp/utility/format>`__ 35*89c4ff92SAndroid Build Coastguard Worker* `Format string syntax <https://fmt.dev/latest/syntax.html>`_ similar to Python's 36*89c4ff92SAndroid Build Coastguard Worker `format <https://docs.python.org/3/library/stdtypes.html#str.format>`_ 37*89c4ff92SAndroid Build Coastguard Worker* Safe `printf implementation 38*89c4ff92SAndroid Build Coastguard Worker <https://fmt.dev/latest/api.html#printf-formatting>`_ including the POSIX 39*89c4ff92SAndroid Build Coastguard Worker extension for positional arguments 40*89c4ff92SAndroid Build Coastguard Worker* Extensibility: `support for user-defined types 41*89c4ff92SAndroid Build Coastguard Worker <https://fmt.dev/latest/api.html#formatting-user-defined-types>`_ 42*89c4ff92SAndroid Build Coastguard Worker* High performance: faster than common standard library implementations of 43*89c4ff92SAndroid Build Coastguard Worker ``(s)printf``, iostreams, ``to_string`` and ``to_chars``, see `Speed tests`_ 44*89c4ff92SAndroid Build Coastguard Worker and `Converting a hundred million integers to strings per second 45*89c4ff92SAndroid Build Coastguard Worker <http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html>`_ 46*89c4ff92SAndroid Build Coastguard Worker* Small code size both in terms of source code with the minimum configuration 47*89c4ff92SAndroid Build Coastguard Worker consisting of just three files, ``core.h``, ``format.h`` and ``format-inl.h``, 48*89c4ff92SAndroid Build Coastguard Worker and compiled code; see `Compile time and code bloat`_ 49*89c4ff92SAndroid Build Coastguard Worker* Reliability: the library has an extensive set of `unit tests 50*89c4ff92SAndroid Build Coastguard Worker <https://github.com/fmtlib/fmt/tree/master/test>`_ and is continuously fuzzed 51*89c4ff92SAndroid Build Coastguard Worker* Safety: the library is fully type safe, errors in format strings can be 52*89c4ff92SAndroid Build Coastguard Worker reported at compile time, automatic memory management prevents buffer overflow 53*89c4ff92SAndroid Build Coastguard Worker errors 54*89c4ff92SAndroid Build Coastguard Worker* Ease of use: small self-contained code base, no external dependencies, 55*89c4ff92SAndroid Build Coastguard Worker permissive MIT `license 56*89c4ff92SAndroid Build Coastguard Worker <https://github.com/fmtlib/fmt/blob/master/LICENSE.rst>`_ 57*89c4ff92SAndroid Build Coastguard Worker* `Portability <https://fmt.dev/latest/index.html#portability>`_ with 58*89c4ff92SAndroid Build Coastguard Worker consistent output across platforms and support for older compilers 59*89c4ff92SAndroid Build Coastguard Worker* Clean warning-free codebase even on high warning levels such as 60*89c4ff92SAndroid Build Coastguard Worker ``-Wall -Wextra -pedantic`` 61*89c4ff92SAndroid Build Coastguard Worker* Locale-independence by default 62*89c4ff92SAndroid Build Coastguard Worker* Optional header-only configuration enabled with the ``FMT_HEADER_ONLY`` macro 63*89c4ff92SAndroid Build Coastguard Worker 64*89c4ff92SAndroid Build Coastguard WorkerSee the `documentation <https://fmt.dev>`_ for more details. 65*89c4ff92SAndroid Build Coastguard Worker 66*89c4ff92SAndroid Build Coastguard WorkerExamples 67*89c4ff92SAndroid Build Coastguard Worker-------- 68*89c4ff92SAndroid Build Coastguard Worker 69*89c4ff92SAndroid Build Coastguard WorkerPrint ``Hello, world!`` to ``stdout``: 70*89c4ff92SAndroid Build Coastguard Worker 71*89c4ff92SAndroid Build Coastguard Worker.. code:: c++ 72*89c4ff92SAndroid Build Coastguard Worker 73*89c4ff92SAndroid Build Coastguard Worker #include <fmt/core.h> 74*89c4ff92SAndroid Build Coastguard Worker 75*89c4ff92SAndroid Build Coastguard Worker int main() { 76*89c4ff92SAndroid Build Coastguard Worker fmt::print("Hello, world!\n"); 77*89c4ff92SAndroid Build Coastguard Worker } 78*89c4ff92SAndroid Build Coastguard Worker 79*89c4ff92SAndroid Build Coastguard WorkerFormat a string: 80*89c4ff92SAndroid Build Coastguard Worker 81*89c4ff92SAndroid Build Coastguard Worker.. code:: c++ 82*89c4ff92SAndroid Build Coastguard Worker 83*89c4ff92SAndroid Build Coastguard Worker std::string s = fmt::format("The answer is {}.", 42); 84*89c4ff92SAndroid Build Coastguard Worker // s == "The answer is 42." 85*89c4ff92SAndroid Build Coastguard Worker 86*89c4ff92SAndroid Build Coastguard WorkerFormat a string using positional arguments: 87*89c4ff92SAndroid Build Coastguard Worker 88*89c4ff92SAndroid Build Coastguard Worker.. code:: c++ 89*89c4ff92SAndroid Build Coastguard Worker 90*89c4ff92SAndroid Build Coastguard Worker std::string s = fmt::format("I'd rather be {1} than {0}.", "right", "happy"); 91*89c4ff92SAndroid Build Coastguard Worker // s == "I'd rather be happy than right." 92*89c4ff92SAndroid Build Coastguard Worker 93*89c4ff92SAndroid Build Coastguard WorkerPrint chrono durations: 94*89c4ff92SAndroid Build Coastguard Worker 95*89c4ff92SAndroid Build Coastguard Worker.. code:: c++ 96*89c4ff92SAndroid Build Coastguard Worker 97*89c4ff92SAndroid Build Coastguard Worker #include <fmt/chrono.h> 98*89c4ff92SAndroid Build Coastguard Worker 99*89c4ff92SAndroid Build Coastguard Worker int main() { 100*89c4ff92SAndroid Build Coastguard Worker using namespace std::literals::chrono_literals; 101*89c4ff92SAndroid Build Coastguard Worker fmt::print("Default format: {} {}\n", 42s, 100ms); 102*89c4ff92SAndroid Build Coastguard Worker fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s); 103*89c4ff92SAndroid Build Coastguard Worker } 104*89c4ff92SAndroid Build Coastguard Worker 105*89c4ff92SAndroid Build Coastguard Worker* Output:: 106*89c4ff92SAndroid Build Coastguard Worker 107*89c4ff92SAndroid Build Coastguard Worker Default format: 42s 100ms 108*89c4ff92SAndroid Build Coastguard Worker strftime-like format: 03:15:30 109*89c4ff92SAndroid Build Coastguard Worker 110*89c4ff92SAndroid Build Coastguard WorkerPrint a container: 111*89c4ff92SAndroid Build Coastguard Worker 112*89c4ff92SAndroid Build Coastguard Worker.. code:: c++ 113*89c4ff92SAndroid Build Coastguard Worker 114*89c4ff92SAndroid Build Coastguard Worker #include <vector> 115*89c4ff92SAndroid Build Coastguard Worker #include <fmt/ranges.h> 116*89c4ff92SAndroid Build Coastguard Worker 117*89c4ff92SAndroid Build Coastguard Worker int main() { 118*89c4ff92SAndroid Build Coastguard Worker std::vector<int> v = {1, 2, 3}; 119*89c4ff92SAndroid Build Coastguard Worker fmt::print("{}\n", v); 120*89c4ff92SAndroid Build Coastguard Worker } 121*89c4ff92SAndroid Build Coastguard Worker 122*89c4ff92SAndroid Build Coastguard Worker* Output:: 123*89c4ff92SAndroid Build Coastguard Worker 124*89c4ff92SAndroid Build Coastguard Worker {1, 2, 3} 125*89c4ff92SAndroid Build Coastguard Worker 126*89c4ff92SAndroid Build Coastguard WorkerCheck a format string at compile time: 127*89c4ff92SAndroid Build Coastguard Worker 128*89c4ff92SAndroid Build Coastguard Worker.. code:: c++ 129*89c4ff92SAndroid Build Coastguard Worker 130*89c4ff92SAndroid Build Coastguard Worker std::string s = fmt::format(FMT_STRING("{:d}"), "don't panic"); 131*89c4ff92SAndroid Build Coastguard Worker 132*89c4ff92SAndroid Build Coastguard WorkerThis gives a compile-time error because ``d`` is an invalid format specifier for 133*89c4ff92SAndroid Build Coastguard Workera string. 134*89c4ff92SAndroid Build Coastguard Worker 135*89c4ff92SAndroid Build Coastguard WorkerWrite a file from a single thread: 136*89c4ff92SAndroid Build Coastguard Worker 137*89c4ff92SAndroid Build Coastguard Worker.. code:: c++ 138*89c4ff92SAndroid Build Coastguard Worker 139*89c4ff92SAndroid Build Coastguard Worker #include <fmt/os.h> 140*89c4ff92SAndroid Build Coastguard Worker 141*89c4ff92SAndroid Build Coastguard Worker int main() { 142*89c4ff92SAndroid Build Coastguard Worker auto out = fmt::output_file("guide.txt"); 143*89c4ff92SAndroid Build Coastguard Worker out.print("Don't {}", "Panic"); 144*89c4ff92SAndroid Build Coastguard Worker } 145*89c4ff92SAndroid Build Coastguard Worker 146*89c4ff92SAndroid Build Coastguard WorkerThis is up to 6x faster than glibc's ``fprintf``. 147*89c4ff92SAndroid Build Coastguard Worker 148*89c4ff92SAndroid Build Coastguard WorkerBenchmarks 149*89c4ff92SAndroid Build Coastguard Worker---------- 150*89c4ff92SAndroid Build Coastguard Worker 151*89c4ff92SAndroid Build Coastguard WorkerSpeed tests 152*89c4ff92SAndroid Build Coastguard Worker~~~~~~~~~~~ 153*89c4ff92SAndroid Build Coastguard Worker 154*89c4ff92SAndroid Build Coastguard Worker================= ============= =========== 155*89c4ff92SAndroid Build Coastguard WorkerLibrary Method Run Time, s 156*89c4ff92SAndroid Build Coastguard Worker================= ============= =========== 157*89c4ff92SAndroid Build Coastguard Workerlibc printf 1.04 158*89c4ff92SAndroid Build Coastguard Workerlibc++ std::ostream 3.05 159*89c4ff92SAndroid Build Coastguard Worker{fmt} 6.1.1 fmt::print 0.75 160*89c4ff92SAndroid Build Coastguard WorkerBoost Format 1.67 boost::format 7.24 161*89c4ff92SAndroid Build Coastguard WorkerFolly Format folly::format 2.23 162*89c4ff92SAndroid Build Coastguard Worker================= ============= =========== 163*89c4ff92SAndroid Build Coastguard Worker 164*89c4ff92SAndroid Build Coastguard Worker{fmt} is the fastest of the benchmarked methods, ~35% faster than ``printf``. 165*89c4ff92SAndroid Build Coastguard Worker 166*89c4ff92SAndroid Build Coastguard WorkerThe above results were generated by building ``tinyformat_test.cpp`` on macOS 167*89c4ff92SAndroid Build Coastguard Worker10.14.6 with ``clang++ -O3 -DNDEBUG -DSPEED_TEST -DHAVE_FORMAT``, and taking the 168*89c4ff92SAndroid Build Coastguard Workerbest of three runs. In the test, the format string ``"%0.10f:%04d:%+g:%s:%p:%c:%%\n"`` 169*89c4ff92SAndroid Build Coastguard Workeror equivalent is filled 2,000,000 times with output sent to ``/dev/null``; for 170*89c4ff92SAndroid Build Coastguard Workerfurther details refer to the `source 171*89c4ff92SAndroid Build Coastguard Worker<https://github.com/fmtlib/format-benchmark/blob/master/tinyformat_test.cpp>`_. 172*89c4ff92SAndroid Build Coastguard Worker 173*89c4ff92SAndroid Build Coastguard Worker{fmt} is up to 10x faster than ``std::ostringstream`` and ``sprintf`` on 174*89c4ff92SAndroid Build Coastguard Workerfloating-point formatting (`dtoa-benchmark <https://github.com/fmtlib/dtoa-benchmark>`_) 175*89c4ff92SAndroid Build Coastguard Workerand faster than `double-conversion <https://github.com/google/double-conversion>`_: 176*89c4ff92SAndroid Build Coastguard Worker 177*89c4ff92SAndroid Build Coastguard Worker.. image:: https://user-images.githubusercontent.com/576385/ 178*89c4ff92SAndroid Build Coastguard Worker 69767160-cdaca400-112f-11ea-9fc5-347c9f83caad.png 179*89c4ff92SAndroid Build Coastguard Worker :target: https://fmt.dev/unknown_mac64_clang10.0.html 180*89c4ff92SAndroid Build Coastguard Worker 181*89c4ff92SAndroid Build Coastguard WorkerCompile time and code bloat 182*89c4ff92SAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~~~~~~~~~~~~ 183*89c4ff92SAndroid Build Coastguard Worker 184*89c4ff92SAndroid Build Coastguard WorkerThe script `bloat-test.py 185*89c4ff92SAndroid Build Coastguard Worker<https://github.com/fmtlib/format-benchmark/blob/master/bloat-test.py>`_ 186*89c4ff92SAndroid Build Coastguard Workerfrom `format-benchmark <https://github.com/fmtlib/format-benchmark>`_ 187*89c4ff92SAndroid Build Coastguard Workertests compile time and code bloat for nontrivial projects. 188*89c4ff92SAndroid Build Coastguard WorkerIt generates 100 translation units and uses ``printf()`` or its alternative 189*89c4ff92SAndroid Build Coastguard Workerfive times in each to simulate a medium sized project. The resulting 190*89c4ff92SAndroid Build Coastguard Workerexecutable size and compile time (Apple LLVM version 8.1.0 (clang-802.0.42), 191*89c4ff92SAndroid Build Coastguard WorkermacOS Sierra, best of three) is shown in the following tables. 192*89c4ff92SAndroid Build Coastguard Worker 193*89c4ff92SAndroid Build Coastguard Worker**Optimized build (-O3)** 194*89c4ff92SAndroid Build Coastguard Worker 195*89c4ff92SAndroid Build Coastguard Worker============= =============== ==================== ================== 196*89c4ff92SAndroid Build Coastguard WorkerMethod Compile Time, s Executable size, KiB Stripped size, KiB 197*89c4ff92SAndroid Build Coastguard Worker============= =============== ==================== ================== 198*89c4ff92SAndroid Build Coastguard Workerprintf 2.6 29 26 199*89c4ff92SAndroid Build Coastguard Workerprintf+string 16.4 29 26 200*89c4ff92SAndroid Build Coastguard Workeriostreams 31.1 59 55 201*89c4ff92SAndroid Build Coastguard Worker{fmt} 19.0 37 34 202*89c4ff92SAndroid Build Coastguard WorkerBoost Format 91.9 226 203 203*89c4ff92SAndroid Build Coastguard WorkerFolly Format 115.7 101 88 204*89c4ff92SAndroid Build Coastguard Worker============= =============== ==================== ================== 205*89c4ff92SAndroid Build Coastguard Worker 206*89c4ff92SAndroid Build Coastguard WorkerAs you can see, {fmt} has 60% less overhead in terms of resulting binary code 207*89c4ff92SAndroid Build Coastguard Workersize compared to iostreams and comes pretty close to ``printf``. Boost Format 208*89c4ff92SAndroid Build Coastguard Workerand Folly Format have the largest overheads. 209*89c4ff92SAndroid Build Coastguard Worker 210*89c4ff92SAndroid Build Coastguard Worker``printf+string`` is the same as ``printf`` but with extra ``<string>`` 211*89c4ff92SAndroid Build Coastguard Workerinclude to measure the overhead of the latter. 212*89c4ff92SAndroid Build Coastguard Worker 213*89c4ff92SAndroid Build Coastguard Worker**Non-optimized build** 214*89c4ff92SAndroid Build Coastguard Worker 215*89c4ff92SAndroid Build Coastguard Worker============= =============== ==================== ================== 216*89c4ff92SAndroid Build Coastguard WorkerMethod Compile Time, s Executable size, KiB Stripped size, KiB 217*89c4ff92SAndroid Build Coastguard Worker============= =============== ==================== ================== 218*89c4ff92SAndroid Build Coastguard Workerprintf 2.2 33 30 219*89c4ff92SAndroid Build Coastguard Workerprintf+string 16.0 33 30 220*89c4ff92SAndroid Build Coastguard Workeriostreams 28.3 56 52 221*89c4ff92SAndroid Build Coastguard Worker{fmt} 18.2 59 50 222*89c4ff92SAndroid Build Coastguard WorkerBoost Format 54.1 365 303 223*89c4ff92SAndroid Build Coastguard WorkerFolly Format 79.9 445 430 224*89c4ff92SAndroid Build Coastguard Worker============= =============== ==================== ================== 225*89c4ff92SAndroid Build Coastguard Worker 226*89c4ff92SAndroid Build Coastguard Worker``libc``, ``lib(std)c++`` and ``libfmt`` are all linked as shared libraries to 227*89c4ff92SAndroid Build Coastguard Workercompare formatting function overhead only. Boost Format is a 228*89c4ff92SAndroid Build Coastguard Workerheader-only library so it doesn't provide any linkage options. 229*89c4ff92SAndroid Build Coastguard Worker 230*89c4ff92SAndroid Build Coastguard WorkerRunning the tests 231*89c4ff92SAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~~ 232*89c4ff92SAndroid Build Coastguard Worker 233*89c4ff92SAndroid Build Coastguard WorkerPlease refer to `Building the library`__ for the instructions on how to build 234*89c4ff92SAndroid Build Coastguard Workerthe library and run the unit tests. 235*89c4ff92SAndroid Build Coastguard Worker 236*89c4ff92SAndroid Build Coastguard Worker__ https://fmt.dev/latest/usage.html#building-the-library 237*89c4ff92SAndroid Build Coastguard Worker 238*89c4ff92SAndroid Build Coastguard WorkerBenchmarks reside in a separate repository, 239*89c4ff92SAndroid Build Coastguard Worker`format-benchmarks <https://github.com/fmtlib/format-benchmark>`_, 240*89c4ff92SAndroid Build Coastguard Workerso to run the benchmarks you first need to clone this repository and 241*89c4ff92SAndroid Build Coastguard Workergenerate Makefiles with CMake:: 242*89c4ff92SAndroid Build Coastguard Worker 243*89c4ff92SAndroid Build Coastguard Worker $ git clone --recursive https://github.com/fmtlib/format-benchmark.git 244*89c4ff92SAndroid Build Coastguard Worker $ cd format-benchmark 245*89c4ff92SAndroid Build Coastguard Worker $ cmake . 246*89c4ff92SAndroid Build Coastguard Worker 247*89c4ff92SAndroid Build Coastguard WorkerThen you can run the speed test:: 248*89c4ff92SAndroid Build Coastguard Worker 249*89c4ff92SAndroid Build Coastguard Worker $ make speed-test 250*89c4ff92SAndroid Build Coastguard Worker 251*89c4ff92SAndroid Build Coastguard Workeror the bloat test:: 252*89c4ff92SAndroid Build Coastguard Worker 253*89c4ff92SAndroid Build Coastguard Worker $ make bloat-test 254*89c4ff92SAndroid Build Coastguard Worker 255*89c4ff92SAndroid Build Coastguard WorkerProjects using this library 256*89c4ff92SAndroid Build Coastguard Worker--------------------------- 257*89c4ff92SAndroid Build Coastguard Worker 258*89c4ff92SAndroid Build Coastguard Worker* `0 A.D. <https://play0ad.com/>`_: A free, open-source, cross-platform 259*89c4ff92SAndroid Build Coastguard Worker real-time strategy game 260*89c4ff92SAndroid Build Coastguard Worker 261*89c4ff92SAndroid Build Coastguard Worker* `AMPL/MP <https://github.com/ampl/mp>`_: 262*89c4ff92SAndroid Build Coastguard Worker An open-source library for mathematical programming 263*89c4ff92SAndroid Build Coastguard Worker 264*89c4ff92SAndroid Build Coastguard Worker* `Aseprite <https://github.com/aseprite/aseprite>`_: 265*89c4ff92SAndroid Build Coastguard Worker Animated sprite editor & pixel art tool 266*89c4ff92SAndroid Build Coastguard Worker 267*89c4ff92SAndroid Build Coastguard Worker* `AvioBook <https://www.aviobook.aero/en>`_: A comprehensive aircraft 268*89c4ff92SAndroid Build Coastguard Worker operations suite 269*89c4ff92SAndroid Build Coastguard Worker 270*89c4ff92SAndroid Build Coastguard Worker* `Celestia <https://celestia.space/>`_: Real-time 3D visualization of space 271*89c4ff92SAndroid Build Coastguard Worker 272*89c4ff92SAndroid Build Coastguard Worker* `Ceph <https://ceph.com/>`_: A scalable distributed storage system 273*89c4ff92SAndroid Build Coastguard Worker 274*89c4ff92SAndroid Build Coastguard Worker* `ccache <https://ccache.dev/>`_: A compiler cache 275*89c4ff92SAndroid Build Coastguard Worker 276*89c4ff92SAndroid Build Coastguard Worker* `ClickHouse <https://github.com/ClickHouse/ClickHouse>`_: analytical database 277*89c4ff92SAndroid Build Coastguard Worker management system 278*89c4ff92SAndroid Build Coastguard Worker 279*89c4ff92SAndroid Build Coastguard Worker* `CUAUV <http://cuauv.org/>`_: Cornell University's autonomous underwater 280*89c4ff92SAndroid Build Coastguard Worker vehicle 281*89c4ff92SAndroid Build Coastguard Worker 282*89c4ff92SAndroid Build Coastguard Worker* `Drake <https://drake.mit.edu/>`_: A planning, control, and analysis toolbox 283*89c4ff92SAndroid Build Coastguard Worker for nonlinear dynamical systems (MIT) 284*89c4ff92SAndroid Build Coastguard Worker 285*89c4ff92SAndroid Build Coastguard Worker* `Envoy <https://lyft.github.io/envoy/>`_: C++ L7 proxy and communication bus 286*89c4ff92SAndroid Build Coastguard Worker (Lyft) 287*89c4ff92SAndroid Build Coastguard Worker 288*89c4ff92SAndroid Build Coastguard Worker* `FiveM <https://fivem.net/>`_: a modification framework for GTA V 289*89c4ff92SAndroid Build Coastguard Worker 290*89c4ff92SAndroid Build Coastguard Worker* `Folly <https://github.com/facebook/folly>`_: Facebook open-source library 291*89c4ff92SAndroid Build Coastguard Worker 292*89c4ff92SAndroid Build Coastguard Worker* `HarpyWar/pvpgn <https://github.com/pvpgn/pvpgn-server>`_: 293*89c4ff92SAndroid Build Coastguard Worker Player vs Player Gaming Network with tweaks 294*89c4ff92SAndroid Build Coastguard Worker 295*89c4ff92SAndroid Build Coastguard Worker* `KBEngine <https://github.com/kbengine/kbengine>`_: An open-source MMOG server 296*89c4ff92SAndroid Build Coastguard Worker engine 297*89c4ff92SAndroid Build Coastguard Worker 298*89c4ff92SAndroid Build Coastguard Worker* `Keypirinha <https://keypirinha.com/>`_: A semantic launcher for Windows 299*89c4ff92SAndroid Build Coastguard Worker 300*89c4ff92SAndroid Build Coastguard Worker* `Kodi <https://kodi.tv/>`_ (formerly xbmc): Home theater software 301*89c4ff92SAndroid Build Coastguard Worker 302*89c4ff92SAndroid Build Coastguard Worker* `Knuth <https://kth.cash/>`_: High-performance Bitcoin full-node 303*89c4ff92SAndroid Build Coastguard Worker 304*89c4ff92SAndroid Build Coastguard Worker* `Microsoft Verona <https://github.com/microsoft/verona>`_: 305*89c4ff92SAndroid Build Coastguard Worker Research programming language for concurrent ownership 306*89c4ff92SAndroid Build Coastguard Worker 307*89c4ff92SAndroid Build Coastguard Worker* `MongoDB <https://mongodb.com/>`_: Distributed document database 308*89c4ff92SAndroid Build Coastguard Worker 309*89c4ff92SAndroid Build Coastguard Worker* `MongoDB Smasher <https://github.com/duckie/mongo_smasher>`_: A small tool to 310*89c4ff92SAndroid Build Coastguard Worker generate randomized datasets 311*89c4ff92SAndroid Build Coastguard Worker 312*89c4ff92SAndroid Build Coastguard Worker* `OpenSpace <https://openspaceproject.com/>`_: An open-source 313*89c4ff92SAndroid Build Coastguard Worker astrovisualization framework 314*89c4ff92SAndroid Build Coastguard Worker 315*89c4ff92SAndroid Build Coastguard Worker* `PenUltima Online (POL) <https://www.polserver.com/>`_: 316*89c4ff92SAndroid Build Coastguard Worker An MMO server, compatible with most Ultima Online clients 317*89c4ff92SAndroid Build Coastguard Worker 318*89c4ff92SAndroid Build Coastguard Worker* `PyTorch <https://github.com/pytorch/pytorch>`_: An open-source machine 319*89c4ff92SAndroid Build Coastguard Worker learning library 320*89c4ff92SAndroid Build Coastguard Worker 321*89c4ff92SAndroid Build Coastguard Worker* `quasardb <https://www.quasardb.net/>`_: A distributed, high-performance, 322*89c4ff92SAndroid Build Coastguard Worker associative database 323*89c4ff92SAndroid Build Coastguard Worker 324*89c4ff92SAndroid Build Coastguard Worker* `readpe <https://bitbucket.org/sys_dev/readpe>`_: Read Portable Executable 325*89c4ff92SAndroid Build Coastguard Worker 326*89c4ff92SAndroid Build Coastguard Worker* `redis-cerberus <https://github.com/HunanTV/redis-cerberus>`_: A Redis cluster 327*89c4ff92SAndroid Build Coastguard Worker proxy 328*89c4ff92SAndroid Build Coastguard Worker 329*89c4ff92SAndroid Build Coastguard Worker* `redpanda <https://vectorized.io/redpanda>`_: A 10x faster Kafka® replacement 330*89c4ff92SAndroid Build Coastguard Worker for mission critical systems written in C++ 331*89c4ff92SAndroid Build Coastguard Worker 332*89c4ff92SAndroid Build Coastguard Worker* `rpclib <http://rpclib.net/>`_: A modern C++ msgpack-RPC server and client 333*89c4ff92SAndroid Build Coastguard Worker library 334*89c4ff92SAndroid Build Coastguard Worker 335*89c4ff92SAndroid Build Coastguard Worker* `Salesforce Analytics Cloud 336*89c4ff92SAndroid Build Coastguard Worker <https://www.salesforce.com/analytics-cloud/overview/>`_: 337*89c4ff92SAndroid Build Coastguard Worker Business intelligence software 338*89c4ff92SAndroid Build Coastguard Worker 339*89c4ff92SAndroid Build Coastguard Worker* `Scylla <https://www.scylladb.com/>`_: A Cassandra-compatible NoSQL data store 340*89c4ff92SAndroid Build Coastguard Worker that can handle 1 million transactions per second on a single server 341*89c4ff92SAndroid Build Coastguard Worker 342*89c4ff92SAndroid Build Coastguard Worker* `Seastar <http://www.seastar-project.org/>`_: An advanced, open-source C++ 343*89c4ff92SAndroid Build Coastguard Worker framework for high-performance server applications on modern hardware 344*89c4ff92SAndroid Build Coastguard Worker 345*89c4ff92SAndroid Build Coastguard Worker* `spdlog <https://github.com/gabime/spdlog>`_: Super fast C++ logging library 346*89c4ff92SAndroid Build Coastguard Worker 347*89c4ff92SAndroid Build Coastguard Worker* `Stellar <https://www.stellar.org/>`_: Financial platform 348*89c4ff92SAndroid Build Coastguard Worker 349*89c4ff92SAndroid Build Coastguard Worker* `Touch Surgery <https://www.touchsurgery.com/>`_: Surgery simulator 350*89c4ff92SAndroid Build Coastguard Worker 351*89c4ff92SAndroid Build Coastguard Worker* `TrinityCore <https://github.com/TrinityCore/TrinityCore>`_: Open-source 352*89c4ff92SAndroid Build Coastguard Worker MMORPG framework 353*89c4ff92SAndroid Build Coastguard Worker 354*89c4ff92SAndroid Build Coastguard Worker* `Windows Terminal <https://github.com/microsoft/terminal>`_: The new Windows 355*89c4ff92SAndroid Build Coastguard Worker Terminal 356*89c4ff92SAndroid Build Coastguard Worker 357*89c4ff92SAndroid Build Coastguard Worker`More... <https://github.com/search?q=fmtlib&type=Code>`_ 358*89c4ff92SAndroid Build Coastguard Worker 359*89c4ff92SAndroid Build Coastguard WorkerIf you are aware of other projects using this library, please let me know 360*89c4ff92SAndroid Build Coastguard Workerby `email <mailto:[email protected]>`_ or by submitting an 361*89c4ff92SAndroid Build Coastguard Worker`issue <https://github.com/fmtlib/fmt/issues>`_. 362*89c4ff92SAndroid Build Coastguard Worker 363*89c4ff92SAndroid Build Coastguard WorkerMotivation 364*89c4ff92SAndroid Build Coastguard Worker---------- 365*89c4ff92SAndroid Build Coastguard Worker 366*89c4ff92SAndroid Build Coastguard WorkerSo why yet another formatting library? 367*89c4ff92SAndroid Build Coastguard Worker 368*89c4ff92SAndroid Build Coastguard WorkerThere are plenty of methods for doing this task, from standard ones like 369*89c4ff92SAndroid Build Coastguard Workerthe printf family of function and iostreams to Boost Format and FastFormat 370*89c4ff92SAndroid Build Coastguard Workerlibraries. The reason for creating a new library is that every existing 371*89c4ff92SAndroid Build Coastguard Workersolution that I found either had serious issues or didn't provide 372*89c4ff92SAndroid Build Coastguard Workerall the features I needed. 373*89c4ff92SAndroid Build Coastguard Worker 374*89c4ff92SAndroid Build Coastguard Workerprintf 375*89c4ff92SAndroid Build Coastguard Worker~~~~~~ 376*89c4ff92SAndroid Build Coastguard Worker 377*89c4ff92SAndroid Build Coastguard WorkerThe good thing about ``printf`` is that it is pretty fast and readily available 378*89c4ff92SAndroid Build Coastguard Workerbeing a part of the C standard library. The main drawback is that it 379*89c4ff92SAndroid Build Coastguard Workerdoesn't support user-defined types. ``printf`` also has safety issues although 380*89c4ff92SAndroid Build Coastguard Workerthey are somewhat mitigated with `__attribute__ ((format (printf, ...)) 381*89c4ff92SAndroid Build Coastguard Worker<https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html>`_ in GCC. 382*89c4ff92SAndroid Build Coastguard WorkerThere is a POSIX extension that adds positional arguments required for 383*89c4ff92SAndroid Build Coastguard Worker`i18n <https://en.wikipedia.org/wiki/Internationalization_and_localization>`_ 384*89c4ff92SAndroid Build Coastguard Workerto ``printf`` but it is not a part of C99 and may not be available on some 385*89c4ff92SAndroid Build Coastguard Workerplatforms. 386*89c4ff92SAndroid Build Coastguard Worker 387*89c4ff92SAndroid Build Coastguard Workeriostreams 388*89c4ff92SAndroid Build Coastguard Worker~~~~~~~~~ 389*89c4ff92SAndroid Build Coastguard Worker 390*89c4ff92SAndroid Build Coastguard WorkerThe main issue with iostreams is best illustrated with an example: 391*89c4ff92SAndroid Build Coastguard Worker 392*89c4ff92SAndroid Build Coastguard Worker.. code:: c++ 393*89c4ff92SAndroid Build Coastguard Worker 394*89c4ff92SAndroid Build Coastguard Worker std::cout << std::setprecision(2) << std::fixed << 1.23456 << "\n"; 395*89c4ff92SAndroid Build Coastguard Worker 396*89c4ff92SAndroid Build Coastguard Workerwhich is a lot of typing compared to printf: 397*89c4ff92SAndroid Build Coastguard Worker 398*89c4ff92SAndroid Build Coastguard Worker.. code:: c++ 399*89c4ff92SAndroid Build Coastguard Worker 400*89c4ff92SAndroid Build Coastguard Worker printf("%.2f\n", 1.23456); 401*89c4ff92SAndroid Build Coastguard Worker 402*89c4ff92SAndroid Build Coastguard WorkerMatthew Wilson, the author of FastFormat, called this "chevron hell". iostreams 403*89c4ff92SAndroid Build Coastguard Workerdon't support positional arguments by design. 404*89c4ff92SAndroid Build Coastguard Worker 405*89c4ff92SAndroid Build Coastguard WorkerThe good part is that iostreams support user-defined types and are safe although 406*89c4ff92SAndroid Build Coastguard Workererror handling is awkward. 407*89c4ff92SAndroid Build Coastguard Worker 408*89c4ff92SAndroid Build Coastguard WorkerBoost Format 409*89c4ff92SAndroid Build Coastguard Worker~~~~~~~~~~~~ 410*89c4ff92SAndroid Build Coastguard Worker 411*89c4ff92SAndroid Build Coastguard WorkerThis is a very powerful library which supports both ``printf``-like format 412*89c4ff92SAndroid Build Coastguard Workerstrings and positional arguments. Its main drawback is performance. According to 413*89c4ff92SAndroid Build Coastguard Workervarious, benchmarks it is much slower than other methods considered here. Boost 414*89c4ff92SAndroid Build Coastguard WorkerFormat also has excessive build times and severe code bloat issues (see 415*89c4ff92SAndroid Build Coastguard Worker`Benchmarks`_). 416*89c4ff92SAndroid Build Coastguard Worker 417*89c4ff92SAndroid Build Coastguard WorkerFastFormat 418*89c4ff92SAndroid Build Coastguard Worker~~~~~~~~~~ 419*89c4ff92SAndroid Build Coastguard Worker 420*89c4ff92SAndroid Build Coastguard WorkerThis is an interesting library which is fast, safe and has positional arguments. 421*89c4ff92SAndroid Build Coastguard WorkerHowever, it has significant limitations, citing its author: 422*89c4ff92SAndroid Build Coastguard Worker 423*89c4ff92SAndroid Build Coastguard Worker Three features that have no hope of being accommodated within the 424*89c4ff92SAndroid Build Coastguard Worker current design are: 425*89c4ff92SAndroid Build Coastguard Worker 426*89c4ff92SAndroid Build Coastguard Worker * Leading zeros (or any other non-space padding) 427*89c4ff92SAndroid Build Coastguard Worker * Octal/hexadecimal encoding 428*89c4ff92SAndroid Build Coastguard Worker * Runtime width/alignment specification 429*89c4ff92SAndroid Build Coastguard Worker 430*89c4ff92SAndroid Build Coastguard WorkerIt is also quite big and has a heavy dependency, STLSoft, which might be too 431*89c4ff92SAndroid Build Coastguard Workerrestrictive for using it in some projects. 432*89c4ff92SAndroid Build Coastguard Worker 433*89c4ff92SAndroid Build Coastguard WorkerBoost Spirit.Karma 434*89c4ff92SAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~~~ 435*89c4ff92SAndroid Build Coastguard Worker 436*89c4ff92SAndroid Build Coastguard WorkerThis is not really a formatting library but I decided to include it here for 437*89c4ff92SAndroid Build Coastguard Workercompleteness. As iostreams, it suffers from the problem of mixing verbatim text 438*89c4ff92SAndroid Build Coastguard Workerwith arguments. The library is pretty fast, but slower on integer formatting 439*89c4ff92SAndroid Build Coastguard Workerthan ``fmt::format_to`` with format string compilation on Karma's own benchmark, 440*89c4ff92SAndroid Build Coastguard Workersee `Converting a hundred million integers to strings per second 441*89c4ff92SAndroid Build Coastguard Worker<http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html>`_. 442*89c4ff92SAndroid Build Coastguard Worker 443*89c4ff92SAndroid Build Coastguard WorkerLicense 444*89c4ff92SAndroid Build Coastguard Worker------- 445*89c4ff92SAndroid Build Coastguard Worker 446*89c4ff92SAndroid Build Coastguard Worker{fmt} is distributed under the MIT `license 447*89c4ff92SAndroid Build Coastguard Worker<https://github.com/fmtlib/fmt/blob/master/LICENSE.rst>`_. 448*89c4ff92SAndroid Build Coastguard Worker 449*89c4ff92SAndroid Build Coastguard WorkerDocumentation License 450*89c4ff92SAndroid Build Coastguard Worker--------------------- 451*89c4ff92SAndroid Build Coastguard Worker 452*89c4ff92SAndroid Build Coastguard WorkerThe `Format String Syntax <https://fmt.dev/latest/syntax.html>`_ 453*89c4ff92SAndroid Build Coastguard Workersection in the documentation is based on the one from Python `string module 454*89c4ff92SAndroid Build Coastguard Workerdocumentation <https://docs.python.org/3/library/string.html#module-string>`_. 455*89c4ff92SAndroid Build Coastguard WorkerFor this reason the documentation is distributed under the Python Software 456*89c4ff92SAndroid Build Coastguard WorkerFoundation license available in `doc/python-license.txt 457*89c4ff92SAndroid Build Coastguard Worker<https://raw.github.com/fmtlib/fmt/master/doc/python-license.txt>`_. 458*89c4ff92SAndroid Build Coastguard WorkerIt only applies if you distribute the documentation of {fmt}. 459*89c4ff92SAndroid Build Coastguard Worker 460*89c4ff92SAndroid Build Coastguard WorkerMaintainers 461*89c4ff92SAndroid Build Coastguard Worker----------- 462*89c4ff92SAndroid Build Coastguard Worker 463*89c4ff92SAndroid Build Coastguard WorkerThe {fmt} library is maintained by Victor Zverovich (`vitaut 464*89c4ff92SAndroid Build Coastguard Worker<https://github.com/vitaut>`_) and Jonathan Müller (`foonathan 465*89c4ff92SAndroid Build Coastguard Worker<https://github.com/foonathan>`_) with contributions from many other people. 466*89c4ff92SAndroid Build Coastguard WorkerSee `Contributors <https://github.com/fmtlib/fmt/graphs/contributors>`_ and 467*89c4ff92SAndroid Build Coastguard Worker`Releases <https://github.com/fmtlib/fmt/releases>`_ for some of the names. 468*89c4ff92SAndroid Build Coastguard WorkerLet us know if your contribution is not listed or mentioned incorrectly and 469*89c4ff92SAndroid Build Coastguard Workerwe'll make it right. 470