xref: /aosp_15_r20/external/armnn/third-party/fmt/README.rst (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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