2016-04-24 10:46:21 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{fmt}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								=====
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 08:26:46 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 08:05:40 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								..  image ::  https://travis-ci.org/fmtlib/fmt.png?branch=master
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								   :target:  https://travis-ci.org/fmtlib/fmt 
 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-14 23:19:38 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 08:13:56 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								..  image ::  https://ci.appveyor.com/api/projects/status/ehjkiefde6gucy1v
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								   :target:  https://ci.appveyor.com/project/vitaut/fmt 
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-06 15:19:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								   
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 07:15:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								..  image ::  https://badges.gitter.im/Join%20Chat.svg
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 08:15:49 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								   :alt:  Join the chat at https://gitter.im/fmtlib/fmt 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								   :target:  https://gitter.im/fmtlib/fmt 
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 07:42:56 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-04-24 10:46:21 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								**fmt**  is an open-source formatting library for C++.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 19:17:20 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								It can be used as a safe alternative to printf or as a fast
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-21 12:05:45 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								alternative to IOStreams.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 14:18:37 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 18:26:23 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`Documentation  <http://fmtlib.net/latest/> `_ 
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-22 06:50:46 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 14:18:37 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Features
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								--------
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-05-10 07:29:31 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  Two APIs: faster concatenation-based `write API
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  <http://fmtlib.net/latest/api.html#write-api>`_ and slower,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  but still very fast, replacement-based `format API
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  <http://fmtlib.net/latest/api.html#format-api>`_ with positional arguments
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  for localization.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 08:26:03 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  Write API similar to the one used by IOStreams but stateless allowing
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  faster implementation.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-21 12:05:45 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  Format API with `format string syntax
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 18:26:23 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  <http://fmtlib.net/latest/syntax.html>`_
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-24 19:44:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  similar to the one used by `str.format
 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 08:09:53 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  <https://docs.python.org/2/library/stdtypes.html#str.format>`_ in Python.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-26 09:05:20 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  Safe `printf implementation
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 18:26:23 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  <http://fmtlib.net/latest/api.html#printf-formatting-functions>`_
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-26 08:10:36 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  including the POSIX extension for positional arguments.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 14:32:48 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  Support for user-defined types.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-21 12:05:45 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  High speed: performance of the format API is close to that of
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 07:36:55 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  glibc's `printf  <http://en.cppreference.com/w/cpp/io/c/fprintf> `_ 
 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-10 07:29:31 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  and better than the performance of IOStreams. See `Speed tests`_  and
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-13 09:53:01 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  `Fast integer to string conversion in C++
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  <http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html>`_.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-03 08:40:07 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  Small code size both in terms of source code (the core library consists of a single
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-11 16:30:27 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  header file and a single source file) and compiled code.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  See `Compile time and code bloat`_ .
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  Reliability: the library has an extensive set of `unit tests
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 08:23:03 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  <https://github.com/fmtlib/fmt/tree/master/test>`_.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-11 16:30:27 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  Safety: the library is fully type safe, errors in format strings are
 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-08 13:47:38 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  reported using exceptions, automatic memory management prevents buffer
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  overflow errors.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-11 16:30:27 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  Ease of use: small self-contained code base, no external dependencies,
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-07 06:43:13 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  permissive BSD `license
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 08:23:03 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  <https://github.com/fmtlib/fmt/blob/master/LICENSE.rst>`_
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 18:26:23 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `Portability  <http://fmtlib.net/latest/index.html#portability> `_  with consistent output
 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-18 08:26:23 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  across platforms and support for older compilers.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-03 09:06:49 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  Clean warning-free codebase even on high warning levels
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  (-Wall -Wextra -pedantic).
 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-04 22:03:37 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  Support for wide strings.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 08:40:40 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  Optional header-only configuration enabled with the `` FMT_HEADER_ONLY ``  macro.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 14:18:37 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 18:26:23 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								See the `documentation  <http://fmtlib.net/latest/> `_  for more details.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-21 10:11:59 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 14:32:48 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Examples
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								--------
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-07 07:04:03 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								This prints `` Hello, world! ``  to stdout:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								..  code ::  c++
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 14:18:37 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-26 07:25:31 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    fmt::print("Hello, {}!", "world");  // uses Python-like format string syntax
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    fmt::printf("Hello, %s!", "world"); // uses printf format string syntax
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 13:20:50 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-02 10:24:47 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Arguments can be accessed by position and arguments' indices can be repeated:
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-13 08:12:09 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-07 07:04:03 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								..  code ::  c++
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-09 10:25:38 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-06-29 11:57:36 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    std::string s = fmt::format("{0}{1}{0}", "abra", "cad");
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-09 10:25:38 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // s == "abracadabra"
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-04-25 06:36:26 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								fmt can be used as a safe portable replacement for `` itoa `` :
 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-06 15:12:46 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-07 07:04:03 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								..  code ::  c++
 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-06 15:12:46 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-02 06:44:34 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    fmt::MemoryWriter w;
 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-06 15:18:57 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    w << 42;           // replaces itoa(42, buffer, 10)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    w << fmt::hex(42); // replaces itoa(42, buffer, 16)
 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-06 15:17:22 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // access the string using w.str() or w.c_str()
 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-06 15:12:46 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-09 19:22:38 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								An object of any user-defined type for which there is an overloaded
 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-03 13:33:22 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								:code: `std::ostream`  insertion operator (`` operator<< `` ) can be formatted:
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-13 08:12:09 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-07 07:04:03 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								..  code ::  c++
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-09 19:19:47 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-07-16 08:44:27 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    #include "fmt/ostream.h"
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-09 19:19:47 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    class Date {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      int year_, month_, day_;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     public:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      Date(int year, int month, int day) : year_(year), month_(month), day_(day) {}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      friend std::ostream &operator<<(std::ostream &os, const Date &d) {
 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-08 13:47:38 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return os << d.year_ << '-' << d.month_ << '-' << d.day_;
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-09 19:19:47 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    };
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-06-29 11:58:21 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    std::string s = fmt::format("The date is {}", Date(2012, 12, 9));
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-09 19:19:47 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // s == "The date is 2012-12-9"
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-06-29 11:51:27 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								You can use the `FMT_VARIADIC
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 18:26:23 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								<http://fmtlib.net/latest/api.html#utilities> `_
 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-29 11:51:27 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								macro to create your own functions similar to `format
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 18:26:23 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								<http://fmtlib.net/latest/api.html#format> `_ and
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`print  <http://fmtlib.net/latest/api.html#print> `_ 
 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-29 11:51:27 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								which take arbitrary arguments:
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-13 08:12:09 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-07 07:04:03 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								..  code ::  c++
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-11 13:54:53 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-06-29 14:22:53 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // Prints formatted error message.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-21 08:13:35 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    void report_error(const char *format, fmt::ArgList args) {
 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-01 16:59:25 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      fmt::print("Error: ");
 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-29 14:22:53 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      fmt::print(format, args);
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-11 13:54:53 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    }
 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-29 14:22:53 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    FMT_VARIADIC(void, report_error, const char *)
 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-29 11:51:27 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-06-29 14:22:53 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    report_error("file not found: {}", path);
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-11 13:54:53 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-09-21 08:13:35 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Note that you only need to define one function that takes `` fmt::ArgList `` 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								argument. `` FMT_VARIADIC ``  automatically defines necessary wrappers that
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								accept variable number of arguments.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-11 13:54:53 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-30 11:16:27 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Projects using this library
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								---------------------------
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-06 13:46:19 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `0 A.D.  <http://play0ad.com/> `_ : A free, open-source, cross-platform real-time strategy game
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-12 14:18:17 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `AMPL/MP  <https://github.com/ampl/mp> `_ :
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  An open-source library for mathematical programming
 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-30 11:16:27 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-10 08:29:44 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `CUAUV  <http://cuauv.org/> `_ : Cornell University's autonomous underwater vehicle
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 08:09:53 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `HarpyWar/pvpgn  <https://github.com/pvpgn/pvpgn-server> `_ :
 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-28 19:17:13 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  Player vs Player Gaming Network with tweaks
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 08:09:53 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `KBEngine  <http://kbengine.org/> `_ : An open-source MMOG server engine
 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-13 08:44:49 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-10 10:52:21 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `Keypirinha  <http://keypirinha.com/> `_ : A semantic launcher for Windows
 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-10 10:51:52 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-12 14:18:17 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `Lifeline  <https://github.com/peter-clark/lifeline> `_ : A 2D game
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-01 14:28:52 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `MongoDB Smasher  <https://github.com/duckie/mongo_smasher> `_ : A small tool to generate randomized datasets
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-07 08:31:17 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `PenUltima Online (POL)  <http://www.polserver.com/> `_ :
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  An MMO server, compatible with most Ultima Online clients
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-27 07:02:15 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `quasardb  <https://www.quasardb.net/> `_ : A distributed, high-performance, associative database
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-02 06:39:16 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `readpe  <https://bitbucket.org/sys_dev/readpe> `_ : Read Portable Executable
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-16 21:33:51 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `redis-cerberus  <https://github.com/HunanTV/redis-cerberus> `_ : A Redis cluster proxy
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 08:09:53 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `Saddy  <https://github.com/mamontov-cpp/saddy-graphics-engine-2d> `_ :
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-06 13:46:19 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  Small crossplatform 2D graphic engine
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-02 12:54:12 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `Salesforce Analytics Cloud  <http://www.salesforce.com/analytics-cloud/overview/> `_ :
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  Business intelligence software
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-10 08:29:44 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `Scylla  <http://www.scylladb.com/> `_ : A Cassandra-compatible NoSQL data store that can handle
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  1 million transactions per second on a single server
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `Seastar  <http://www.seastar-project.org/> `_ : An advanced, open-source C++ framework for
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  high-performance server applications on modern hardware
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-08 06:15:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `spdlog  <https://github.com/gabime/spdlog> `_ : Super fast C++ logging library
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-16 21:45:27 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `Stellar  <https://www.stellar.org/> `_ : Financial platform
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-08 18:58:25 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `Touch Surgery  <https://www.touchsurgery.com/> `_ : Surgery simulator
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-17 19:43:47 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `TrinityCore  <https://github.com/TrinityCore/TrinityCore> `_ : Open-source MMORPG framework
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-06 14:03:44 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`More...  <https://github.com/search?q=cppformat&type=Code> `_ 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-06-29 11:51:27 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								If you are aware of other projects using this library, please let me know
 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-12 14:18:17 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								by `email  <mailto:victor.zverovich@gmail.com> `_  or by submitting an
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 08:23:03 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`issue  <https://github.com/fmtlib/fmt/issues> `_ .
 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-30 11:16:27 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 15:33:27 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Motivation
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								----------
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								So why yet another formatting library?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								There are plenty of methods for doing this task, from standard ones like
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								the printf family of function and IOStreams to Boost Format library and
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								FastFormat. The reason for creating a new library is that every existing
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								solution that I found either had serious issues or didn't provide
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								all the features I needed.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Printf
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								~~~~~~
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-08 09:11:25 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The good thing about printf is that it is pretty fast and readily available
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 19:17:20 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								being a part of the C standard library. The main drawback is that it
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-09 10:09:15 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								doesn't support user-defined types. Printf also has safety issues although
 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-08 09:11:25 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								they are mostly solved with `__attribute__ ((format (printf, ...))
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 07:36:55 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								<http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html> `_ in GCC.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-09 10:09:15 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								There is a POSIX extension that adds positional arguments required for
 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 08:09:53 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`i18n  <https://en.wikipedia.org/wiki/Internationalization_and_localization> `_ 
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-09 10:09:15 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								to printf but it is not a part of C99 and may not be available on some
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								platforms.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 15:33:27 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								IOStreams
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								~~~~~~~~~
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-13 08:12:09 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The main issue with IOStreams is best illustrated with an example:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-07 07:04:03 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								..  code ::  c++
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 15:33:27 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    std::cout << std::setprecision(2) << std::fixed << 1.23456 << "\n";
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-13 08:12:09 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								which is a lot of typing compared to printf:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-07 07:04:03 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								..  code ::  c++
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 15:33:27 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    printf("%.2f\n", 1.23456);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-02 10:24:47 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Matthew Wilson, the author of FastFormat, referred to this situation with
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-09 10:09:15 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								IOStreams as "chevron hell". IOStreams doesn't support positional arguments
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								by design.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 15:33:27 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								The good part is that IOStreams supports user-defined types and is safe
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								although error reporting is awkward.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Boost Format library
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								~~~~~~~~~~~~~~~~~~~~
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								This is a very powerful library which supports both printf-like format
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								strings and positional arguments. The main its drawback is performance.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-09 10:09:15 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								According to various benchmarks it is much slower than other methods
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								considered here. Boost Format also has excessive build times and severe
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								code bloat issues (see `Benchmarks`_ ).
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 15:33:27 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								FastFormat
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								~~~~~~~~~~
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								This is an interesting library which is fast, safe and has positional
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								arguments. However it has significant limitations, citing its author:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    Three features that have no hope of being accommodated within the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    current design are:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    *  Leading zeros (or any other non-space padding)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    *  Octal/hexadecimal encoding
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    *  Runtime width/alignment specification
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								It is also quite big and has a heavy dependency, STLSoft, which might be
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								too restrictive for using it in some projects.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Loki SafeFormat
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								~~~~~~~~~~~~~~~
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-16 16:48:08 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								SafeFormat is a formatting library which uses printf-like format strings
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								and is type safe. It doesn't support user-defined types or positional
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-16 16:48:59 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								arguments. It makes unconventional use of `` operator() ``  for passing
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-16 16:48:08 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								format arguments.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 15:33:27 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Tinyformat
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								~~~~~~~~~~
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								This library supports printf-like format strings and is very small and
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								fast. Unfortunately it doesn't support positional arguments and wrapping
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-15 09:32:13 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								it in C++98 is somewhat difficult. Also its performance and code compactness
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								are limited by IOStreams.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 15:33:27 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-24 21:31:05 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Boost Spirit.Karma
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								~~~~~~~~~~~~~~~~~~
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								This is not really a formatting library but I decided to include it here
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								for completeness. As IOStreams it suffers from the problem of mixing
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-13 09:53:01 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								verbatim text with arguments. The library is pretty fast, but slower
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								on integer formatting than `` fmt::Writer ``  on Karma's own benchmark,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								see `Fast integer to string conversion in C++
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 07:36:55 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								<http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html> `_.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-24 21:31:05 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 13:20:50 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Benchmarks
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								----------
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 14:32:48 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Speed tests
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								~~~~~~~~~~~
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								The following speed tests results were generated by building
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-10 19:32:33 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`` tinyformat_test.cpp ``  on Ubuntu GNU/Linux 14.04.1 with
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`` g++-4.8.2 -O3 -DSPEED_TEST -DHAVE_FORMAT `` , and taking the best of three
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 14:32:48 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								runs.  In the test, the format string `` "%0.10f:%04d:%+g:%s:%p:%c:%%\n" ``  or
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								equivalent is filled 2000000 times with output sent to `` /dev/null `` ; for
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								further details see the `source
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 08:28:24 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								<https://github.com/fmtlib/format-benchmark/blob/master/tinyformat_test.cpp> `_.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 14:32:48 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-17 06:15:44 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								================= ============= ===========
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-17 06:14:32 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Library           Method        Run Time, s
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-17 06:15:44 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								================= ============= ===========
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-17 06:12:44 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								EGLIBC 2.19       printf          1.30
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-17 06:24:40 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								libstdc++ 4.8.2   std::ostream    1.85
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-25 06:36:26 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								fmt 1.0           fmt::print      1.42
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-17 06:12:44 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								tinyformat 2.0.1  tfm::printf     2.25
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Boost Format 1.54 boost::format   9.94
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-17 06:15:44 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								================= ============= ===========
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 14:32:48 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-09 08:48:08 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								As you can see `` boost::format ``  is much slower than the alternative methods; this
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 07:36:55 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								is confirmed by `other tests  <http://accu.org/index.php/journals/1539> `_ .
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 15:33:27 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Tinyformat is quite good coming close to IOStreams.  Unfortunately tinyformat
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								cannot be faster than the IOStreams because it uses them internally.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-25 06:36:26 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Performance of fmt is close to that of printf, being `faster than printf on integer
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-10 19:36:29 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								formatting <http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html>`_,
 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-10 19:31:22 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								but slower on floating-point formatting which dominates this benchmark.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 14:32:48 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-01-09 07:30:01 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Compile time and code bloat
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-23 07:00:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The script `bloat-test.py
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 08:28:24 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								<https://github.com/fmtlib/format-benchmark/blob/master/bloat-test.py> `_
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								from `format-benchmark  <https://github.com/fmtlib/format-benchmark> `_ 
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-22 06:08:50 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								tests compile time and code bloat for nontrivial projects.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								It generates 100 translation units and uses `` printf() ``  or its alternative
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								five times in each to simulate a medium sized project.  The resulting
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								executable size and compile time (g++-4.8.1, Ubuntu GNU/Linux 13.10,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								best of three) is shown in the following tables.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 13:20:50 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-22 06:08:50 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								**Optimized build (-O3)** 
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 13:20:50 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-23 08:58:28 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								============ =============== ==================== ==================
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Method       Compile Time, s Executable size, KiB Stripped size, KiB
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								============ =============== ==================== ==================
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								printf                   2.6                   41                 30
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								IOStreams               19.4                   92                 70
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-25 06:36:26 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								fmt                     46.8                   46                 34
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-23 08:58:28 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								tinyformat              64.6                  418                386
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Boost Format           222.8                  990                923
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								============ =============== ==================== ==================
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-04-25 06:36:26 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								As you can see, fmt has two times less overhead in terms of resulting
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-23 08:58:28 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								code size compared to IOStreams and comes pretty close to `` printf `` .
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Boost Format has by far the largest overheads.
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 13:20:50 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-22 06:08:50 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								**Non-optimized build** 
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 13:20:50 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-23 08:58:28 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								============ =============== ==================== ==================
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Method       Compile Time, s Executable size, KiB Stripped size, KiB
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								============ =============== ==================== ==================
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								printf                   2.1                   41                 30
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								IOStreams               19.7                   86                 62
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-25 06:36:26 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								fmt                     47.9                  108                 86
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-23 08:58:28 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								tinyformat              27.7                  234                190
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Boost Format           122.6                  884                763
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								============ =============== ==================== ==================
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 13:20:50 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-04-25 06:36:26 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`` libc `` , `` libstdc++ ``  and `` libfmt ``  are all linked as shared
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-23 06:59:03 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								libraries to compare formatting function overhead only. Boost Format
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								and tinyformat are header-only libraries so they don't provide any
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								linkage options.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 13:20:50 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Running the tests
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								~~~~~~~~~~~~~~~~~
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-19 07:50:41 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Please refer to `Building the library`__  for the instructions on how to build
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								the library and run the unit tests.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-19 07:49:54 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 18:26:23 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								__ http://fmtlib.net/latest/usage.html#building-the-library
 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-17 21:28:00 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-23 06:59:03 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Benchmarks reside in a separate repository,
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 08:28:24 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`format-benchmarks  <https://github.com/fmtlib/format-benchmark> `_ ,
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-23 06:59:03 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								so to run the benchmarks you first need to clone this repository and
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-23 07:09:41 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								generate Makefiles with CMake::
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-23 06:59:03 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 08:28:24 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    $ git clone --recursive https://github.com/fmtlib/format-benchmark.git
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-23 06:59:03 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    $ cd format-benchmark
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    $ cmake .
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Then you can run the speed test::
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 13:20:50 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-23 06:59:03 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    $ make speed-test
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 13:20:50 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								or the bloat test::
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-22 08:17:30 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    $ make bloat-test
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 13:20:50 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-12 07:44:41 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								License
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								-------
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-04-25 06:36:26 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								fmt is distributed under the BSD `license
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 08:23:03 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								<https://github.com/fmtlib/fmt/blob/master/LICENSE.rst> `_.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-14 06:43:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-01-14 06:47:10 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The `Format String Syntax
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 18:26:23 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								<http://fmtlib.net/latest/syntax.html> `_
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-14 06:43:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								section in the documentation is based on the one from Python `string module
 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 08:09:53 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								documentation <https://docs.python.org/3/library/string.html#module-string>`_
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-14 06:43:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								adapted for the current library. For this reason the documentation is
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								distributed under the Python Software Foundation license available in
 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-07 06:47:22 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`doc/python-license.txt
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-27 08:28:24 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								<https://raw.github.com/fmtlib/fmt/master/doc/python-license.txt> `_.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-04-25 06:36:26 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								It only applies if you distribute the documentation of fmt.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-14 06:43:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 13:20:50 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Acknowledgments
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								---------------
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-10-31 18:19:49 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The fmt library is maintained by Victor Zverovich (`vitaut  <https://github.com/vitaut> `_ )
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								and Jonathan Müller (`foonathan  <https://github.com/foonathan> `_ ) with contributions from many
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								other people. See `Contributors  <https://github.com/fmtlib/fmt/graphs/contributors> `_  and `Releases  <https://github.com/fmtlib/fmt/releases> `_  for some of the names. Let us know if your contribution
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								is not listed or mentioned incorrectly and we'll make it right.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-07 13:20:50 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The benchmark section of this readme file and the performance tests are taken
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 07:36:55 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								from the excellent `tinyformat  <https://github.com/c42f/tinyformat> `_  library
 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-09 10:09:15 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								written by Chris Foster.  Boost Format library is acknowledged transitively
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								since it had some influence on tinyformat.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Some ideas used in the implementation are borrowed from `Loki
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 07:36:55 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								<http://loki-lib.sourceforge.net/> `_ SafeFormat and `  Diagnostic API
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								<http://clang.llvm.org/doxygen/classclang_1_1Diagnostic.html> `_ in
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`Clang  <http://clang.llvm.org/> `_ .
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-14 06:43:31 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Format string syntax and the documentation are based on Python's `str.format
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 07:36:55 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								<http://docs.python.org/2/library/stdtypes.html#str.format> `_.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Thanks `Doug Turnbull  <https://github.com/softwaredoug> `_  for his valuable
 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-14 08:57:19 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								comments and contribution to the design of the type-safe API and
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-05 07:36:55 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`Gregory Czajkowski  <https://github.com/gcflymoto> `_  for implementing binary
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								formatting. Thanks `Ruslan Baratov  <https://github.com/ruslo> `_  for comprehensive
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`comparison of integer formatting algorithms  <https://github.com/ruslo/int-dec-format-tests> `_ 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								and useful comments regarding performance, `Boris Kaul  <https://github.com/localvoid> `_  for
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`C++ counting digits benchmark  <https://github.com/localvoid/cxx-benchmark-count-digits> `_ .
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-15 06:39:03 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Thanks to `CarterLi  <https://github.com/CarterLi> `_  for contributing various
 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-01 14:28:52 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								improvements to the code.