14.0.1 - TBD
2-----------
3
44.0.0 - 2017-06-27
5------------------
6
7* Removed old compatibility headers ``cppformat/*.h`` and CMake options (`#527 <https://github.com/pull/527>`_). Thanks `@maddinat0r (Alex Martin) <https://github.com/maddinat0r>`_.
8
9* Added ``string.h`` containing ``fmt::to_string()`` as alternative to ``std::to_string()`` as well as other string writer functionality (`#326 <https://github.com/fmtlib/fmt/issues/326>`_ and `#441 <https://github.com/fmtlib/fmt/pull/441>`_):
10
11  .. code:: c++
12
13    #include "fmt/string.h"
14
15    std::string answer = fmt::to_string(42);
16
17  Thanks to `@glebov-andrey (Andrey Glebov) <https://github.com/glebov-andrey>`_.
18
19* Moved ``fmt::printf()`` to new ``printf.h`` header and allowed ``%s`` as generic specifier (`#453 <https://github.com/fmtlib/fmt/pull/453>`_), made ``%.f`` more conformant to regular ``printf()`` (`#490 <https://github.com/fmtlib/fmt/pull/490>`_), added custom writer support (`#476 <https://github.com/fmtlib/fmt/issues/476>`_) and implemented missing custom argument formatting (`#339 <https://github.com/fmtlib/fmt/pull/339>`_ and `#340 <https://github.com/fmtlib/fmt/pull/340>`_):
20
21  .. code:: c++
22
23    #include "fmt/printf.h"
24
25    // %s format specifier can be used with any argument type.
26    fmt::printf("%s", 42);
27
28  Thanks `@mojoBrendan <https://github.com/mojoBrendan>`_, `@manylegged (Arthur Danskin) <https://github.com/manylegged>`_ and `@spacemoose (Glen Stark) <https://github.com/spacemoose>`_. See also `#360 <https://github.com/fmtlib/fmt/issues/360>`_, `#335 <https://github.com/fmtlib/fmt/issues/335>`_ and `#331 <https://github.com/fmtlib/fmt/issues/331>`_.
29
30* Added ``container.h`` containing a ``BasicContainerWriter`` to write to containers like ``std::vector`` (`#450 <https://github.com/fmtlib/fmt/pull/450>`_). Thanks `@polyvertex (Jean-Charles Lefebvre) <https://github.com/polyvertex>`_.
31
32* Added ``fmt::join()`` function that takes a range and formats its elements separated by a given string (`#466 <https://github.com/fmtlib/fmt/pull/466>`_):
33
34  .. code:: c++
35
36    #include "fmt/format.h"
37
38    std::vector<double> v = {1.2, 3.4, 5.6};
39    // Prints "(+01.20, +03.40, +05.60)".
40    fmt::print("({:+06.2f})", fmt::join(v.begin(), v.end(), ", "));
41
42  Thanks `@olivier80 <https://github.com/olivier80>`_.
43
44* Added support for custom formatting specifications to simplify customization of built-in formatting (`#444 <https://github.com/fmtlib/fmt/pull/444>`_). Thanks `@polyvertex (Jean-Charles Lefebvre) <https://github.com/polyvertex>`_. See also `#439 <https://github.com/fmtlib/fmt/issues/439>`_.
45
46* Added ``fmt::format_system_error()`` for error code formatting (`#323 <https://github.com/fmtlib/fmt/issues/323>`_ and `#526 <https://github.com/fmtlib/fmt/pull/526>`_). Thanks `@maddinat0r (Alex Martin) <https://github.com/maddinat0r>`_.
47
48* Added thread-safe ``fmt::localtime()`` and ``fmt::gmtime()`` as replacement for the standard version to ``time.h`` (`#396 <https://github.com/fmtlib/fmt/pull/396>`_). Thanks `@codicodi <https://github.com/codicodi>`_.
49
50* Internal improvements to ``NamedArg`` and ``ArgLists`` (`#389 <https://github.com/fmtlib/fmt/pull/389>`_ and `#390 <https://github.com/fmtlib/fmt/pull/390>`_). Thanks `@chronoxor <https://github.com/chronoxor>`_.
51
52* Fixed crash due to bug in ``FormatBuf`` (`#493 <https://github.com/fmtlib/fmt/pull/493>`_). Thanks `@effzeh <https://github.com/effzeh>`_. See also `#480 <https://github.com/fmtlib/fmt/issues/480>`_ and `#491 <https://github.com/fmtlib/fmt/issues/491>`_.
53
54* Fixed handling of wide strings in ``fmt::StringWriter``.
55
56* Improved compiler error messages (`#357 <https://github.com/fmtlib/fmt/issues/357>`_).
57
58* Fixed various warnings and issues with various compilers (`#494 <https://github.com/fmtlib/fmt/pull/494>`_, `#499 <https://github.com/fmtlib/fmt/pull/499>`_, `#483 <https://github.com/fmtlib/fmt/pull/483>`_, `#519 <https://github.com/fmtlib/fmt/pull/519>`_, `#485 <https://github.com/fmtlib/fmt/pull/485>`_, `#482 <https://github.com/fmtlib/fmt/pull/482>`_, `#475 <https://github.com/fmtlib/fmt/pull/475>`_, `#473 <https://github.com/fmtlib/fmt/pull/473>`_ and `#414 <https://github.com/fmtlib/fmt/pull/414>`_). Thanks `@chronoxor <https://github.com/chronoxor>`_, `@zhaohuaxishi <https://github.com/zhaohuaxishi>`_, `@pkestene (Pierre Kestener) <https://github.com/pkestene>`_, `@dschmidt (Dominik Schmidt) <https://github.com/dschmidt>`_ and `@0x414c (Alexey Gorishny) <https://github.com/0x414c>`_ .
59
60* Improved CMake: targets are now namespaced (`#511 <https://github.com/fmtlib/fmt/pull/511>`_ and `#513 <https://github.com/fmtlib/fmt/pull/513>`_), supported header-only ``printf.h`` (`#354 <https://github.com/fmtlib/fmt/pull/354>`_), fixed issue with minimal supported library subset (`#418 <https://github.com/fmtlib/fmt/issues/418>`_, `#419 <https://github.com/fmtlib/fmt/pull/419>`_ and `#420 <https://github.com/fmtlib/fmt/pull/420>`_). Thanks `@bjoernthiel (Bjoern Thiel) <https://github.com/bjoernthiel>`_,
61  `@niosHD (Mario Werner) <https://github.com/niosHD>`_, `@LogicalKnight (Sean LK) <https://github.com/LogicalKnight>`_ and `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_.
62
63* Improved documentation. Thanks to `@pwm1234 (Phil) <https://github.com/pwm1234>`_ for `#393 <https://github.com/fmtlib/fmt/pull/393>`_.
64
653.0.2 - 2017-06-14
66------------------
67
68* Added ``FMT_VERSION`` macro (`#411 <https://github.com/fmtlib/fmt/issues/411>`_).
69
70* Used ``FMT_NULL`` instead of literal ``0`` (`#409 <https://github.com/fmtlib/fmt/pull/409>`_). Thanks `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_.
71
72* Added extern templates for ``format_float`` (`#413 <https://github.com/fmtlib/fmt/issues/413>`_).
73
74* Fixed implicit conversion issue (`#507 <https://github.com/fmtlib/fmt/issues/507>`_).
75
76* Fixed signbit detection (`#423 <https://github.com/fmtlib/fmt/issues/423>`_).
77
78* Fixed naming collision (`#425 <https://github.com/fmtlib/fmt/issues/425>`_).
79
80* Fixed missing intrinsic for C++/CLI (`#457 <https://github.com/fmtlib/fmt/pull/457>`_). Thanks `@calumr (Calum Robinson) <https://github.com/calumr>`_
81
82* Fixed Android detection (`#458 <https://github.com/fmtlib/fmt/pull/458>`_). Thanks `@Gachapen (Magnus Bjerke Vik) <https://github.com/Gachapen>`_.
83
84* Use lean ``windows.h`` if not in header-only mode (`#503 <https://github.com/fmtlib/fmt/pull/503>`_). Thanks `@Quentin01 (Quentin Buathier) <https://github.com/Quentin01>`_.
85
86* Fixed issue with CMake exporting C++11 flag (`#445 <https://github.com/fmtlib/fmt/pull/455>`_). Thanks `@EricWF (Eric) <https://github.com/EricWF>`_.
87
88* Fixed issue with nvcc and MSVC compiler bug and MinGW (`#505 <https://github.com/fmtlib/fmt/issues/505>`_).
89
90* Fixed DLL issues (`#469 <https://github.com/fmtlib/fmt/pull/469>`_ and `#502 <https://github.com/fmtlib/fmt/pull/502>`_). Thanks `@richardeakin (Richard Eakin) <https://github.com/richardeakin>`_ and `@AndreasSchoenle (Andreas Schönle) <https://github.com/AndreasSchoenle>`_.
91
92* Fixed test compilation under FreeBSD (`#433 <https://github.com/fmtlib/fmt/issues/433>`_).
93
94* Fixed various warnings (`#403 <https://github.com/fmtlib/fmt/pull/403>`_, `#410 <https://github.com/fmtlib/fmt/pull/410>`_ and `#510 <https://github.com/fmtlib/fmt/pull/510>`_). Thanks `@Lecetem <https://github.com/Lectem>`_, `@chenhayat (Chen Hayat) <https://github.com/chenhayat>`_ and `@trozen <https://github.com/trozen>`_.
95
96* Removed redundant include (`#479 <https://github.com/fmtlib/fmt/issues/479>`_).
97
98* Fixed documentation issues.
99
1003.0.1 - 2016-11-01
101------------------
102* Fixed handling of thousands seperator (`#353 <https://github.com/fmtlib/fmt/issues/353>`_)
103
104* Fixed handling of ``unsigned char`` strings (`#373 <https://github.com/fmtlib/fmt/issues/373>`_)
105
106* Corrected buffer growth when formatting time (`#367 <https://github.com/fmtlib/fmt/issues/367>`_)
107
108* Removed warnings under MSVC and clang (`#318 <https://github.com/fmtlib/fmt/issues/318>`_, `#250 <https://github.com/fmtlib/fmt/issues/250>`_, also merged `#385 <https://github.com/fmtlib/fmt/pull/385>`_ and `#361 <https://github.com/fmtlib/fmt/pull/361>`_). Thanks `@jcelerier (Jean-Michaël Celerier) <https://github.com/jcelerier>`_ and `@nmoehrle (Nils Moehrle) <https://github.com/nmoehrle>`_.
109
110* Fixed compilation issues under Android (`#327 <https://github.com/fmtlib/fmt/pull/327>`_, `#345 <https://github.com/fmtlib/fmt/issues/345>`_ and `#381 <https://github.com/fmtlib/fmt/pull/381>`_), FreeBSD (`#358 <https://github.com/fmtlib/fmt/pull/358>`_), Cygwin (`#388 <https://github.com/fmtlib/fmt/issues/388>`_), MinGW (`#355 <https://github.com/fmtlib/fmt/issues/355>`_) as well as other issues (`#350 <https://github.com/fmtlib/fmt/issues/350>`_, `#366 <https://github.com/fmtlib/fmt/issues/355>`_, `#348 <https://github.com/fmtlib/fmt/pull/348>`_, `#402 <https://github.com/fmtlib/fmt/pull/402>`_, `#405 <https://github.com/fmtlib/fmt/pull/405>`_). Thanks to `@dpantele (Dmitry) <https://github.com/dpantele>`_, `@hghwng (Hugh Wang) <https://github.com/hghwng>`_, `@arvedarved (Tilman Keskinöz) <https://github.com/arvedarved>`_, `@LogicalKnight (Sean) <https://github.com/LogicalKnight>`_ and `@JanHellwig (Jan Hellwig) <https://github.com/janhellwig>`_.
111
112* Fixed some documentation issues and extended specification (`#320 <https://github.com/fmtlib/fmt/issues/320>`_, `#333 <https://github.com/fmtlib/fmt/pull/333>`_, `#347 <https://github.com/fmtlib/fmt/issues/347>`_, `#362 <https://github.com/fmtlib/fmt/pull/362>`_). Thanks to `@smellman (Taro Matsuzawa aka. btm) <https://github.com/smellman>`_.
113
1143.0.0 - 2016-05-07
115------------------
116
117* The project has been renamed from C++ Format (cppformat) to fmt for
118  consistency with the used namespace and macro prefix
119  (`#307 <https://github.com/fmtlib/fmt/issues/307>`_).
120  Library headers are now located in the ``fmt`` directory:
121
122  .. code:: c++
123
124    #include "fmt/format.h"
125
126  Including ``format.h`` from the ``cppformat`` directory is deprecated
127  but works via a proxy header which will be removed in the next major version.
128
129  The documentation is now available at http://fmtlib.net.
130
131* Added support for `strftime <http://en.cppreference.com/w/cpp/chrono/c/strftime>`_-like
132  `date and time formatting <http://fmtlib.net/3.0.0/api.html#date-and-time-formatting>`_
133  (`#283 <https://github.com/fmtlib/fmt/issues/283>`_):
134
135  .. code:: c++
136
137    #include "fmt/time.h"
138
139    std::time_t t = std::time(nullptr);
140    // Prints "The date is 2016-04-29." (with the current date)
141    fmt::print("The date is {:%Y-%m-%d}.", *std::localtime(&t));
142
143* ``std::ostream`` support including formatting of user-defined types that provide
144  overloaded ``operator<<`` has been moved to ``fmt/ostream.h``:
145
146  .. code:: c++
147
148    #include "fmt/ostream.h"
149
150    class Date {
151      int year_, month_, day_;
152    public:
153      Date(int year, int month, int day) : year_(year), month_(month), day_(day) {}
154
155      friend std::ostream &operator<<(std::ostream &os, const Date &d) {
156        return os << d.year_ << '-' << d.month_ << '-' << d.day_;
157      }
158    };
159
160    std::string s = fmt::format("The date is {}", Date(2012, 12, 9));
161    // s == "The date is 2012-12-9"
162
163* Added support for `custom argument formatters
164  <http://fmtlib.net/3.0.0/api.html#argument-formatters>`_
165  (`#235 <https://github.com/fmtlib/fmt/issues/235>`_).
166
167* Added support for locale-specific integer formatting with the ``n`` specifier
168  (`#305 <https://github.com/fmtlib/fmt/issues/305>`_):
169
170  .. code:: c++
171
172    std::setlocale(LC_ALL, "en_US.utf8");
173    fmt::print("cppformat: {:n}\n", 1234567); // prints 1,234,567
174
175* Sign is now preserved when formatting an integer with an incorrect ``printf``
176  format specifier (`#265 <https://github.com/fmtlib/fmt/issues/265>`_):
177
178  .. code:: c++
179
180    fmt::printf("%lld", -42); // prints -42
181
182  Note that it would be an undefined behavior in ``std::printf``.
183
184* Length modifiers such as ``ll`` are now optional in printf formatting
185  functions and the correct type is determined automatically
186  (`#255 <https://github.com/fmtlib/fmt/issues/255>`_):
187
188  .. code:: c++
189
190    fmt::printf("%d", std::numeric_limits<long long>::max());
191
192  Note that it would be an undefined behavior in ``std::printf``.
193
194* Added initial support for custom formatters
195  (`#231 <https://github.com/fmtlib/fmt/issues/231>`_).
196
197* Fixed detection of user-defined literal support on Intel C++ compiler
198  (`#311 <https://github.com/fmtlib/fmt/issues/311>`_,
199  `#312 <https://github.com/fmtlib/fmt/pull/312>`_).
200  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_ and
201  `@speth (Ray Speth) <https://github.com/speth>`_.
202
203* Reduced compile time
204  (`#243 <https://github.com/fmtlib/fmt/pull/243>`_,
205  `#249 <https://github.com/fmtlib/fmt/pull/249>`_,
206  `#317 <https://github.com/fmtlib/fmt/issues/317>`_):
207
208  .. image:: https://cloud.githubusercontent.com/assets/4831417/11614060/
209             b9e826d2-9c36-11e5-8666-d4131bf503ef.png
210
211  .. image:: https://cloud.githubusercontent.com/assets/4831417/11614080/
212             6ac903cc-9c37-11e5-8165-26df6efae364.png
213
214  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.
215
216* Compile test fixes (`#313 <https://github.com/fmtlib/fmt/pull/313>`_).
217  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.
218
219* Documentation fixes (`#239 <https://github.com/fmtlib/fmt/pull/239>`_,
220  `#248 <https://github.com/fmtlib/fmt/issues/248>`_,
221  `#252 <https://github.com/fmtlib/fmt/issues/252>`_,
222  `#258 <https://github.com/fmtlib/fmt/pull/258>`_,
223  `#260 <https://github.com/fmtlib/fmt/issues/260>`_,
224  `#301 <https://github.com/fmtlib/fmt/issues/301>`_,
225  `#309 <https://github.com/fmtlib/fmt/pull/309>`_).
226  Thanks to `@ReadmeCritic <https://github.com/ReadmeCritic>`_
227  `@Gachapen (Magnus Bjerke Vik) <https://github.com/Gachapen>`_ and
228  `@jwilk (Jakub Wilk) <https://github.com/jwilk>`_.
229
230* Fixed compiler and sanitizer warnings (
231  `#244 <https://github.com/fmtlib/fmt/issues/244>`_,
232  `#256 <https://github.com/fmtlib/fmt/pull/256>`_,
233  `#259 <https://github.com/fmtlib/fmt/pull/259>`_,
234  `#263 <https://github.com/fmtlib/fmt/issues/263>`_,
235  `#274 <https://github.com/fmtlib/fmt/issues/274>`_,
236  `#277 <https://github.com/fmtlib/fmt/pull/277>`_,
237  `#286 <https://github.com/fmtlib/fmt/pull/286>`_,
238  `#291 <https://github.com/fmtlib/fmt/issues/291>`_,
239  `#296 <https://github.com/fmtlib/fmt/issues/296>`_,
240  `#308 <https://github.com/fmtlib/fmt/issues/308>`_)
241  Thanks to `@mwinterb <https://github.com/mwinterb>`_,
242  `@pweiskircher (Patrik Weiskircher) <https://github.com/pweiskircher>`_,
243  `@Naios <https://github.com/Naios>`_.
244
245* Improved compatibility with Windows Store apps
246  (`#280 <https://github.com/fmtlib/fmt/issues/280>`_,
247  `#285 <https://github.com/fmtlib/fmt/pull/285>`_)
248  Thanks to `@mwinterb <https://github.com/mwinterb>`_.
249
250* Added tests of compatibility with older C++ standards
251  (`#273 <https://github.com/fmtlib/fmt/pull/273>`_).
252  Thanks to `@niosHD <https://github.com/niosHD>`_.
253
254* Fixed Android build (`#271 <https://github.com/fmtlib/fmt/pull/271>`_).
255  Thanks to `@newnon <https://github.com/newnon>`_.
256
257* Changed ``ArgMap`` to be backed by a vector instead of a map.
258  (`#261 <https://github.com/fmtlib/fmt/issues/261>`_,
259  `#262 <https://github.com/fmtlib/fmt/pull/262>`_).
260  Thanks to `@mwinterb <https://github.com/mwinterb>`_.
261
262* Added ``fprintf`` overload that writes to a ``std::ostream``
263  (`#251 <https://github.com/fmtlib/fmt/pull/251>`_).
264  Thanks to `nickhutchinson (Nicholas Hutchinson) <https://github.com/nickhutchinson>`_.
265
266* Export symbols when building a Windows DLL
267  (`#245 <https://github.com/fmtlib/fmt/pull/245>`_).
268  Thanks to `macdems (Maciek Dems) <https://github.com/macdems>`_.
269
270* Fixed compilation on Cygwin (`#304 <https://github.com/fmtlib/fmt/issues/304>`_).
271
272* Implemented a workaround for a bug in Apple LLVM version 4.2 of clang
273  (`#276 <https://github.com/fmtlib/fmt/issues/276>`_).
274
275* Implemented a workaround for Google Test bug
276  `#705 <https://github.com/google/googletest/issues/705>`_ on gcc 6
277  (`#268 <https://github.com/fmtlib/fmt/issues/268>`_).
278  Thanks to `octoploid <https://github.com/octoploid>`_.
279
280* Removed Biicode support because the latter has been discontinued.
281
2822.1.1 - 2016-04-11
283------------------
284
285* The install location for generated CMake files is now configurable via
286  the ``FMT_CMAKE_DIR`` CMake variable
287  (`#299 <https://github.com/fmtlib/fmt/pull/299>`_).
288  Thanks to `@niosHD <https://github.com/niosHD>`_.
289
290* Documentation fixes (`#252 <https://github.com/fmtlib/fmt/issues/252>`_).
291
2922.1.0 - 2016-03-21
293------------------
294
295* Project layout and build system improvements
296  (`#267 <https://github.com/fmtlib/fmt/pull/267>`_):
297
298  * The code have been moved to the ``cppformat`` directory.
299    Including ``format.h`` from the top-level directory is deprecated
300    but works via a proxy header which will be removed in the next
301    major version.
302
303  * C++ Format CMake targets now have proper interface definitions.
304
305  * Installed version of the library now supports the header-only
306    configuration.
307
308  * Targets ``doc``, ``install``, and ``test`` are now disabled if C++ Format
309    is included as a CMake subproject. They can be enabled by setting
310    ``FMT_DOC``, ``FMT_INSTALL``, and ``FMT_TEST`` in the parent project.
311
312  Thanks to `@niosHD <https://github.com/niosHD>`_.
313
3142.0.1 - 2016-03-13
315------------------
316
317* Improved CMake find and package support
318  (`#264 <https://github.com/fmtlib/fmt/issues/264>`_).
319  Thanks to `@niosHD <https://github.com/niosHD>`_.
320
321* Fix compile error with Android NDK and mingw32
322  (`#241 <https://github.com/fmtlib/fmt/issues/241>`_).
323  Thanks to `@Gachapen (Magnus Bjerke Vik) <https://github.com/Gachapen>`_.
324
325* Documentation fixes
326  (`#248 <https://github.com/fmtlib/fmt/issues/248>`_,
327  `#260 <https://github.com/fmtlib/fmt/issues/260>`_).
328
3292.0.0 - 2015-12-01
330------------------
331
332General
333~~~~~~~
334
335* [Breaking] Named arguments
336  (`#169 <https://github.com/fmtlib/fmt/pull/169>`_,
337  `#173 <https://github.com/fmtlib/fmt/pull/173>`_,
338  `#174 <https://github.com/fmtlib/fmt/pull/174>`_):
339
340  .. code:: c++
341
342    fmt::print("The answer is {answer}.", fmt::arg("answer", 42));
343
344  Thanks to `@jamboree <https://github.com/jamboree>`_.
345
346* [Experimental] User-defined literals for format and named arguments
347  (`#204 <https://github.com/fmtlib/fmt/pull/204>`_,
348  `#206 <https://github.com/fmtlib/fmt/pull/206>`_,
349  `#207 <https://github.com/fmtlib/fmt/pull/207>`_):
350
351  .. code:: c++
352
353    using namespace fmt::literals;
354    fmt::print("The answer is {answer}.", "answer"_a=42);
355
356  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.
357
358* [Breaking] Formatting of more than 16 arguments is now supported when using
359  variadic templates
360  (`#141 <https://github.com/fmtlib/fmt/issues/141>`_).
361  Thanks to `@Shauren <https://github.com/Shauren>`_.
362
363* Runtime width specification
364  (`#168 <https://github.com/fmtlib/fmt/pull/168>`_):
365
366  .. code:: c++
367
368    fmt::format("{0:{1}}", 42, 5); // gives "   42"
369
370  Thanks to `@jamboree <https://github.com/jamboree>`_.
371
372* [Breaking] Enums are now formatted with an overloaded ``std::ostream`` insertion
373  operator (``operator<<``) if available
374  (`#232 <https://github.com/fmtlib/fmt/issues/232>`_).
375
376* [Breaking] Changed default ``bool`` format to textual, "true" or "false"
377  (`#170 <https://github.com/fmtlib/fmt/issues/170>`_):
378
379  .. code:: c++
380
381    fmt::print("{}", true); // prints "true"
382
383  To print ``bool`` as a number use numeric format specifier such as ``d``:
384
385  .. code:: c++
386
387    fmt::print("{:d}", true); // prints "1"
388
389* ``fmt::printf`` and ``fmt::sprintf`` now support formatting of ``bool`` with the
390  ``%s`` specifier giving textual output, "true" or "false"
391  (`#223 <https://github.com/fmtlib/fmt/pull/223>`_):
392
393  .. code:: c++
394
395    fmt::printf("%s", true); // prints "true"
396
397  Thanks to `@LarsGullik <https://github.com/LarsGullik>`_.
398
399* [Breaking] ``signed char`` and ``unsigned char`` are now formatted as integers by default
400  (`#217 <https://github.com/fmtlib/fmt/pull/217>`_).
401
402* [Breaking] Pointers to C strings can now be formatted with the ``p`` specifier
403  (`#223 <https://github.com/fmtlib/fmt/pull/223>`_):
404
405  .. code:: c++
406
407    fmt::print("{:p}", "test"); // prints pointer value
408
409  Thanks to `@LarsGullik <https://github.com/LarsGullik>`_.
410
411* [Breaking] ``fmt::printf`` and ``fmt::sprintf`` now print null pointers as ``(nil)``
412  and null strings as ``(null)`` for consistency with glibc
413  (`#226 <https://github.com/fmtlib/fmt/pull/226>`_).
414  Thanks to `@LarsGullik <https://github.com/LarsGullik>`_.
415
416* [Breaking] ``fmt::(s)printf`` now supports formatting of objects of user-defined types
417  that provide an overloaded ``std::ostream`` insertion operator (``operator<<``)
418  (`#201 <https://github.com/fmtlib/fmt/issues/201>`_):
419
420  .. code:: c++
421
422    fmt::printf("The date is %s", Date(2012, 12, 9));
423
424* [Breaking] The ``Buffer`` template is now part of the public API and can be used
425  to implement custom memory buffers
426  (`#140 <https://github.com/fmtlib/fmt/issues/140>`_).
427  Thanks to `@polyvertex (Jean-Charles Lefebvre) <https://github.com/polyvertex>`_.
428
429* [Breaking] Improved compatibility between ``BasicStringRef`` and
430  `std::experimental::basic_string_view
431  <http://en.cppreference.com/w/cpp/experimental/basic_string_view>`_
432  (`#100 <https://github.com/fmtlib/fmt/issues/100>`_,
433  `#159 <https://github.com/fmtlib/fmt/issues/159>`_,
434  `#183 <https://github.com/fmtlib/fmt/issues/183>`_):
435
436  - Comparison operators now compare string content, not pointers
437  - ``BasicStringRef::c_str`` replaced by ``BasicStringRef::data``
438  - ``BasicStringRef`` is no longer assumed to be null-terminated
439
440  References to null-terminated strings are now represented by a new class,
441  ``BasicCStringRef``.
442
443* Dependency on pthreads introduced by Google Test is now optional
444  (`#185 <https://github.com/fmtlib/fmt/issues/185>`_).
445
446* New CMake options ``FMT_DOC``, ``FMT_INSTALL`` and ``FMT_TEST`` to control
447  generation of ``doc``, ``install`` and ``test`` targets respectively, on by default
448  (`#197 <https://github.com/fmtlib/fmt/issues/197>`_,
449  `#198 <https://github.com/fmtlib/fmt/issues/198>`_,
450  `#200 <https://github.com/fmtlib/fmt/issues/200>`_).
451  Thanks to `@maddinat0r (Alex Martin) <https://github.com/maddinat0r>`_.
452
453* ``noexcept`` is now used when compiling with MSVC2015
454  (`#215 <https://github.com/fmtlib/fmt/pull/215>`_).
455  Thanks to `@dmkrepo (Dmitriy) <https://github.com/dmkrepo>`_.
456
457* Added an option to disable use of ``windows.h`` when ``FMT_USE_WINDOWS_H``
458  is defined as 0 before including ``format.h``
459  (`#171 <https://github.com/fmtlib/fmt/issues/171>`_).
460  Thanks to `@alfps (Alf P. Steinbach) <https://github.com/alfps>`_.
461
462* [Breaking] ``windows.h`` is now included with ``NOMINMAX`` unless
463  ``FMT_WIN_MINMAX`` is defined. This is done to prevent breaking code using
464  ``std::min`` and ``std::max`` and only affects the header-only configuration
465  (`#152 <https://github.com/fmtlib/fmt/issues/152>`_,
466  `#153 <https://github.com/fmtlib/fmt/pull/153>`_,
467  `#154 <https://github.com/fmtlib/fmt/pull/154>`_).
468  Thanks to `@DevO2012 <https://github.com/DevO2012>`_.
469
470* Improved support for custom character types
471  (`#171 <https://github.com/fmtlib/fmt/issues/171>`_).
472  Thanks to `@alfps (Alf P. Steinbach) <https://github.com/alfps>`_.
473
474* Added an option to disable use of IOStreams when ``FMT_USE_IOSTREAMS``
475  is defined as 0 before including ``format.h``
476  (`#205 <https://github.com/fmtlib/fmt/issues/205>`_,
477  `#208 <https://github.com/fmtlib/fmt/pull/208>`_).
478  Thanks to `@JodiTheTigger <https://github.com/JodiTheTigger>`_.
479
480* Improved detection of ``isnan``, ``isinf`` and ``signbit``.
481
482Optimization
483~~~~~~~~~~~~
484
485* Made formatting of user-defined types more efficient with a custom stream buffer
486  (`#92 <https://github.com/fmtlib/fmt/issues/92>`_,
487  `#230 <https://github.com/fmtlib/fmt/pull/230>`_).
488  Thanks to `@NotImplemented <https://github.com/NotImplemented>`_.
489
490* Further improved performance of ``fmt::Writer`` on integer formatting
491  and fixed a minor regression. Now it is ~7% faster than ``karma::generate``
492  on Karma's benchmark
493  (`#186 <https://github.com/fmtlib/fmt/issues/186>`_).
494
495* [Breaking] Reduced `compiled code size
496  <https://github.com/fmtlib/fmt#compile-time-and-code-bloat>`_
497  (`#143 <https://github.com/fmtlib/fmt/issues/143>`_,
498  `#149 <https://github.com/fmtlib/fmt/pull/149>`_).
499
500Distribution
501~~~~~~~~~~~~
502
503* [Breaking] Headers are now installed in
504  ``${CMAKE_INSTALL_PREFIX}/include/cppformat``
505  (`#178 <https://github.com/fmtlib/fmt/issues/178>`_).
506  Thanks to `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.
507
508* [Breaking] Changed the library name from ``format`` to ``cppformat``
509  for consistency with the project name and to avoid potential conflicts
510  (`#178 <https://github.com/fmtlib/fmt/issues/178>`_).
511  Thanks to `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.
512
513* C++ Format is now available in `Debian <https://www.debian.org/>`_ GNU/Linux
514  (`stretch <https://packages.debian.org/source/stretch/cppformat>`_,
515  `sid <https://packages.debian.org/source/sid/cppformat>`_) and
516  derived distributions such as
517  `Ubuntu <https://launchpad.net/ubuntu/+source/cppformat>`_ 15.10 and later
518  (`#155 <https://github.com/fmtlib/fmt/issues/155>`_)::
519
520    $ sudo apt-get install libcppformat1-dev
521
522  Thanks to `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.
523
524* `Packages for Fedora and RHEL <https://admin.fedoraproject.org/pkgdb/package/cppformat/>`_
525  are now available. Thanks to Dave Johansen.
526
527* C++ Format can now be installed via `Homebrew <http://brew.sh/>`_ on OS X
528  (`#157 <https://github.com/fmtlib/fmt/issues/157>`_)::
529
530    $ brew install cppformat
531
532  Thanks to `@ortho <https://github.com/ortho>`_, Anatoliy Bulukin.
533
534Documentation
535~~~~~~~~~~~~~
536
537* Migrated from ReadTheDocs to GitHub Pages for better responsiveness
538  and reliability
539  (`#128 <https://github.com/fmtlib/fmt/issues/128>`_).
540  New documentation address is http://cppformat.github.io/.
541
542
543* Added `Building the documentation
544  <http://fmtlib.net/2.0.0/usage.html#building-the-documentation>`_
545  section to the documentation.
546
547* Documentation build script is now compatible with Python 3 and newer pip versions.
548  (`#189 <https://github.com/fmtlib/fmt/pull/189>`_,
549  `#209 <https://github.com/fmtlib/fmt/issues/209>`_).
550  Thanks to `@JodiTheTigger <https://github.com/JodiTheTigger>`_ and
551  `@xentec <https://github.com/xentec>`_.
552
553* Documentation fixes and improvements
554  (`#36 <https://github.com/fmtlib/fmt/issues/36>`_,
555  `#75 <https://github.com/fmtlib/fmt/issues/75>`_,
556  `#125 <https://github.com/fmtlib/fmt/issues/125>`_,
557  `#160 <https://github.com/fmtlib/fmt/pull/160>`_,
558  `#161 <https://github.com/fmtlib/fmt/pull/161>`_,
559  `#162 <https://github.com/fmtlib/fmt/issues/162>`_,
560  `#165 <https://github.com/fmtlib/fmt/issues/165>`_,
561  `#210 <https://github.com/fmtlib/fmt/issues/210>`_).
562  Thanks to `@syohex (Syohei YOSHIDA) <https://github.com/syohex>`_ and
563  bug reporters.
564
565* Fixed out-of-tree documentation build
566  (`#177 <https://github.com/fmtlib/fmt/issues/177>`_).
567  Thanks to `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.
568
569Fixes
570~~~~~
571
572* Fixed ``initializer_list`` detection
573  (`#136 <https://github.com/fmtlib/fmt/issues/136>`_).
574  Thanks to `@Gachapen (Magnus Bjerke Vik) <https://github.com/Gachapen>`_.
575
576* [Breaking] Fixed formatting of enums with numeric format specifiers in
577  ``fmt::(s)printf``
578  (`#131 <https://github.com/fmtlib/fmt/issues/131>`_,
579  `#139 <https://github.com/fmtlib/fmt/issues/139>`_):
580
581  .. code:: c++
582
583    enum { ANSWER = 42 };
584    fmt::printf("%d", ANSWER);
585
586  Thanks to `@Naios <https://github.com/Naios>`_.
587
588* Improved compatibility with old versions of MinGW
589  (`#129 <https://github.com/fmtlib/fmt/issues/129>`_,
590  `#130 <https://github.com/fmtlib/fmt/pull/130>`_,
591  `#132 <https://github.com/fmtlib/fmt/issues/132>`_).
592  Thanks to `@cstamford (Christopher Stamford) <https://github.com/cstamford>`_.
593
594* Fixed a compile error on MSVC with disabled exceptions
595  (`#144 <https://github.com/fmtlib/fmt/issues/144>`_).
596
597* Added a workaround for broken implementation of variadic templates in MSVC2012
598  (`#148 <https://github.com/fmtlib/fmt/issues/148>`_).
599
600* Placed the anonymous namespace within ``fmt`` namespace for the header-only
601  configuration
602  (`#171 <https://github.com/fmtlib/fmt/issues/171>`_).
603  Thanks to `@alfps (Alf P. Steinbach) <https://github.com/alfps>`_.
604
605* Fixed issues reported by Coverity Scan
606  (`#187 <https://github.com/fmtlib/fmt/issues/187>`_,
607  `#192 <https://github.com/fmtlib/fmt/issues/192>`_).
608
609* Implemented a workaround for a name lookup bug in MSVC2010
610  (`#188 <https://github.com/fmtlib/fmt/issues/188>`_).
611
612* Fixed compiler warnings
613  (`#95 <https://github.com/fmtlib/fmt/issues/95>`_,
614  `#96 <https://github.com/fmtlib/fmt/issues/96>`_,
615  `#114 <https://github.com/fmtlib/fmt/pull/114>`_,
616  `#135 <https://github.com/fmtlib/fmt/issues/135>`_,
617  `#142 <https://github.com/fmtlib/fmt/issues/142>`_,
618  `#145 <https://github.com/fmtlib/fmt/issues/145>`_,
619  `#146 <https://github.com/fmtlib/fmt/issues/146>`_,
620  `#158 <https://github.com/fmtlib/fmt/issues/158>`_,
621  `#163 <https://github.com/fmtlib/fmt/issues/163>`_,
622  `#175 <https://github.com/fmtlib/fmt/issues/175>`_,
623  `#190 <https://github.com/fmtlib/fmt/issues/190>`_,
624  `#191 <https://github.com/fmtlib/fmt/pull/191>`_,
625  `#194 <https://github.com/fmtlib/fmt/issues/194>`_,
626  `#196 <https://github.com/fmtlib/fmt/pull/196>`_,
627  `#216 <https://github.com/fmtlib/fmt/issues/216>`_,
628  `#218 <https://github.com/fmtlib/fmt/pull/218>`_,
629  `#220 <https://github.com/fmtlib/fmt/pull/220>`_,
630  `#229 <https://github.com/fmtlib/fmt/pull/229>`_,
631  `#233 <https://github.com/fmtlib/fmt/issues/233>`_,
632  `#234 <https://github.com/fmtlib/fmt/issues/234>`_,
633  `#236 <https://github.com/fmtlib/fmt/pull/236>`_,
634  `#281 <https://github.com/fmtlib/fmt/issues/281>`_,
635  `#289 <https://github.com/fmtlib/fmt/issues/289>`_).
636  Thanks to `@seanmiddleditch (Sean Middleditch) <https://github.com/seanmiddleditch>`_,
637  `@dixlorenz (Dix Lorenz) <https://github.com/dixlorenz>`_,
638  `@CarterLi (李通洲) <https://github.com/CarterLi>`_,
639  `@Naios <https://github.com/Naios>`_,
640  `@fmatthew5876 (Matthew Fioravante) <https://github.com/fmatthew5876>`_,
641  `@LevskiWeng (Levski Weng) <https://github.com/LevskiWeng>`_,
642  `@rpopescu <https://github.com/rpopescu>`_,
643  `@gabime (Gabi Melman) <https://github.com/gabime>`_,
644  `@cubicool (Jeremy Moles) <https://github.com/cubicool>`_,
645  `@jkflying (Julian Kent) <https://github.com/jkflying>`_,
646  `@LogicalKnight (Sean L) <https://github.com/LogicalKnight>`_,
647  `@inguin (Ingo van Lil) <https://github.com/inguin>`_ and
648  `@Jopie64 (Johan) <https://github.com/Jopie64>`_.
649
650* Fixed portability issues (mostly causing test failures) on ARM, ppc64, ppc64le,
651  s390x and SunOS 5.11 i386 (
652  `#138 <https://github.com/fmtlib/fmt/issues/138>`_,
653  `#179 <https://github.com/fmtlib/fmt/issues/179>`_,
654  `#180 <https://github.com/fmtlib/fmt/issues/180>`_,
655  `#202 <https://github.com/fmtlib/fmt/issues/202>`_,
656  `#225 <https://github.com/fmtlib/fmt/issues/225>`_,
657  `Red Hat Bugzilla Bug 1260297 <https://bugzilla.redhat.com/show_bug.cgi?id=1260297>`_).
658  Thanks to `@Naios <https://github.com/Naios>`_,
659  `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_ and Dave Johansen.
660
661* Fixed a name conflict with macro ``free`` defined in
662  ``crtdbg.h`` when ``_CRTDBG_MAP_ALLOC`` is set
663  (`#211 <https://github.com/fmtlib/fmt/issues/211>`_).
664
665* Fixed shared library build on OS X
666  (`#212 <https://github.com/fmtlib/fmt/pull/212>`_).
667  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.
668
669* Fixed an overload conflict on MSVC when ``/Zc:wchar_t-`` option is specified
670  (`#214 <https://github.com/fmtlib/fmt/pull/214>`_).
671  Thanks to `@slavanap (Vyacheslav Napadovsky) <https://github.com/slavanap>`_.
672
673* Improved compatibility with MSVC 2008
674  (`#236 <https://github.com/fmtlib/fmt/pull/236>`_).
675  Thanks to `@Jopie64 (Johan) <https://github.com/Jopie64>`_.
676
677* Improved compatibility with bcc32
678  (`#227 <https://github.com/fmtlib/fmt/issues/227>`_).
679
680* Fixed ``static_assert`` detection on Clang
681  (`#228 <https://github.com/fmtlib/fmt/pull/228>`_).
682  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.
683
6841.1.0 - 2015-03-06
685------------------
686
687* Added ``BasicArrayWriter``, a class template that provides operations for
688  formatting and writing data into a fixed-size array
689  (`#105 <https://github.com/fmtlib/fmt/issues/105>`_ and
690  `#122 <https://github.com/fmtlib/fmt/issues/122>`_):
691
692  .. code:: c++
693
694    char buffer[100];
695    fmt::ArrayWriter w(buffer);
696    w.write("The answer is {}", 42);
697
698* Added `0 A.D. <http://play0ad.com/>`_ and `PenUltima Online (POL)
699  <http://www.polserver.com/>`_ to the list of notable projects using C++ Format.
700
701* C++ Format now uses MSVC intrinsics for better formatting performance
702  (`#115 <https://github.com/fmtlib/fmt/pull/115>`_,
703  `#116 <https://github.com/fmtlib/fmt/pull/116>`_,
704  `#118 <https://github.com/fmtlib/fmt/pull/118>`_ and
705  `#121 <https://github.com/fmtlib/fmt/pull/121>`_).
706  Previously these optimizations where only used on GCC and Clang.
707  Thanks to `@CarterLi <https://github.com/CarterLi>`_ and
708  `@objectx <https://github.com/objectx>`_.
709
710* CMake install target (`#119 <https://github.com/fmtlib/fmt/pull/119>`_).
711  Thanks to `@TrentHouliston <https://github.com/TrentHouliston>`_.
712
713  You can now install C++ Format with ``make install`` command.
714
715* Improved `Biicode <http://www.biicode.com/>`_ support
716  (`#98 <https://github.com/fmtlib/fmt/pull/98>`_ and
717  `#104 <https://github.com/fmtlib/fmt/pull/104>`_). Thanks to
718  `@MariadeAnton <https://github.com/MariadeAnton>`_ and
719  `@franramirez688 <https://github.com/franramirez688>`_.
720
721* Improved support for building with `Android NDK
722  <https://developer.android.com/tools/sdk/ndk/index.html>`_
723  (`#107 <https://github.com/fmtlib/fmt/pull/107>`_).
724  Thanks to `@newnon <https://github.com/newnon>`_.
725
726  The `android-ndk-example <https://github.com/fmtlib/android-ndk-example>`_
727  repository provides and example of using C++ Format with Android NDK:
728
729  .. image:: https://raw.githubusercontent.com/fmtlib/android-ndk-example/
730            master/screenshot.png
731
732* Improved documentation of ``SystemError`` and ``WindowsError``
733  (`#54 <https://github.com/fmtlib/fmt/issues/54>`_).
734
735* Various code improvements
736  (`#110 <https://github.com/fmtlib/fmt/pull/110>`_,
737  `#111 <https://github.com/fmtlib/fmt/pull/111>`_
738  `#112 <https://github.com/fmtlib/fmt/pull/112>`_).
739  Thanks to `@CarterLi <https://github.com/CarterLi>`_.
740
741* Improved compile-time errors when formatting wide into narrow strings
742  (`#117 <https://github.com/fmtlib/fmt/issues/117>`_).
743
744* Fixed ``BasicWriter::write`` without formatting arguments when C++11 support
745  is disabled (`#109 <https://github.com/fmtlib/fmt/issues/109>`_).
746
747* Fixed header-only build on OS X with GCC 4.9
748  (`#124 <https://github.com/fmtlib/fmt/issues/124>`_).
749
750* Fixed packaging issues (`#94 <https://github.com/fmtlib/fmt/issues/94>`_).
751
752* Added `changelog <https://github.com/fmtlib/fmt/blob/master/ChangeLog.rst>`_
753  (`#103 <https://github.com/fmtlib/fmt/issues/103>`_).
754
7551.0.0 - 2015-02-05
756------------------
757
758* Add support for a header-only configuration when ``FMT_HEADER_ONLY`` is
759  defined before including ``format.h``:
760
761  .. code:: c++
762
763    #define FMT_HEADER_ONLY
764    #include "format.h"
765
766* Compute string length in the constructor of ``BasicStringRef``
767  instead of the ``size`` method
768  (`#79 <https://github.com/fmtlib/fmt/issues/79>`_).
769  This eliminates size computation for string literals on reasonable optimizing
770  compilers.
771
772* Fix formatting of types with overloaded ``operator <<`` for ``std::wostream``
773  (`#86 <https://github.com/fmtlib/fmt/issues/86>`_):
774
775  .. code:: c++
776
777    fmt::format(L"The date is {0}", Date(2012, 12, 9));
778
779* Fix linkage of tests on Arch Linux
780  (`#89 <https://github.com/fmtlib/fmt/issues/89>`_).
781
782* Allow precision specifier for non-float arguments
783  (`#90 <https://github.com/fmtlib/fmt/issues/90>`_):
784
785  .. code:: c++
786
787    fmt::print("{:.3}\n", "Carpet"); // prints "Car"
788
789* Fix build on Android NDK
790  (`#93 <https://github.com/fmtlib/fmt/issues/93>`_)
791
792* Improvements to documentation build procedure.
793
794* Remove ``FMT_SHARED`` CMake variable in favor of standard `BUILD_SHARED_LIBS
795  <http://www.cmake.org/cmake/help/v3.0/variable/BUILD_SHARED_LIBS.html>`_.
796
797* Fix error handling in ``fmt::fprintf``.
798
799* Fix a number of warnings.
800
8010.12.0 - 2014-10-25
802-------------------
803
804* [Breaking] Improved separation between formatting and buffer management.
805  ``Writer`` is now a base class that cannot be instantiated directly.
806  The new ``MemoryWriter`` class implements the default buffer management
807  with small allocations done on stack. So ``fmt::Writer`` should be replaced
808  with ``fmt::MemoryWriter`` in variable declarations.
809
810  Old code:
811
812  .. code:: c++
813
814    fmt::Writer w;
815
816  New code:
817
818  .. code:: c++
819
820    fmt::MemoryWriter w;
821
822  If you pass ``fmt::Writer`` by reference, you can continue to do so:
823
824  .. code:: c++
825
826      void f(fmt::Writer &w);
827
828  This doesn't affect the formatting API.
829
830* Support for custom memory allocators
831  (`#69 <https://github.com/fmtlib/fmt/issues/69>`_)
832
833* Formatting functions now accept `signed char` and `unsigned char` strings as
834  arguments (`#73 <https://github.com/fmtlib/fmt/issues/73>`_):
835
836  .. code:: c++
837
838    auto s = format("GLSL version: {}", glGetString(GL_VERSION));
839
840* Reduced code bloat. According to the new `benchmark results
841  <https://github.com/fmtlib/fmt#compile-time-and-code-bloat>`_,
842  cppformat is close to ``printf`` and by the order of magnitude better than
843  Boost Format in terms of compiled code size.
844
845* Improved appearance of the documentation on mobile by using the `Sphinx
846  Bootstrap theme <http://ryan-roemer.github.io/sphinx-bootstrap-theme/>`_:
847
848  .. |old| image:: https://cloud.githubusercontent.com/assets/576385/4792130/
849                   cd256436-5de3-11e4-9a62-c077d0c2b003.png
850
851  .. |new| image:: https://cloud.githubusercontent.com/assets/576385/4792131/
852                   cd29896c-5de3-11e4-8f59-cac952942bf0.png
853
854  +-------+-------+
855  |  Old  |  New  |
856  +-------+-------+
857  | |old| | |new| |
858  +-------+-------+
859
8600.11.0 - 2014-08-21
861-------------------
862
863* Safe printf implementation with a POSIX extension for positional arguments:
864
865  .. code:: c++
866
867    fmt::printf("Elapsed time: %.2f seconds", 1.23);
868    fmt::printf("%1$s, %3$d %2$s", weekday, month, day);
869
870* Arguments of ``char`` type can now be formatted as integers
871  (Issue `#55 <https://github.com/fmtlib/fmt/issues/55>`_):
872
873  .. code:: c++
874
875    fmt::format("0x{0:02X}", 'a');
876
877* Deprecated parts of the API removed.
878
879* The library is now built and tested on MinGW with Appveyor in addition to
880  existing test platforms Linux/GCC, OS X/Clang, Windows/MSVC.
881
8820.10.0 - 2014-07-01
883-------------------
884
885**Improved API**
886
887* All formatting methods are now implemented as variadic functions instead
888  of using ``operator<<`` for feeding arbitrary arguments into a temporary
889  formatter object. This works both with C++11 where variadic templates are
890  used and with older standards where variadic functions are emulated by
891  providing lightweight wrapper functions defined with the ``FMT_VARIADIC``
892  macro. You can use this macro for defining your own portable variadic
893  functions:
894
895  .. code:: c++
896
897    void report_error(const char *format, const fmt::ArgList &args) {
898      fmt::print("Error: {}");
899      fmt::print(format, args);
900    }
901    FMT_VARIADIC(void, report_error, const char *)
902
903    report_error("file not found: {}", path);
904
905  Apart from a more natural syntax, this also improves performance as there
906  is no need to construct temporary formatter objects and control arguments'
907  lifetimes. Because the wrapper functions are very lightweight, this doesn't
908  cause code bloat even in pre-C++11 mode.
909
910* Simplified common case of formatting an ``std::string``. Now it requires a
911  single function call:
912
913  .. code:: c++
914
915    std::string s = format("The answer is {}.", 42);
916
917  Previously it required 2 function calls:
918
919  .. code:: c++
920
921    std::string s = str(Format("The answer is {}.") << 42);
922
923  Instead of unsafe ``c_str`` function, ``fmt::Writer`` should be used directly
924  to bypass creation of ``std::string``:
925
926  .. code:: c++
927
928    fmt::Writer w;
929    w.write("The answer is {}.", 42);
930    w.c_str();  // returns a C string
931
932  This doesn't do dynamic memory allocation for small strings and is less error
933  prone as the lifetime of the string is the same as for ``std::string::c_str``
934  which is well understood (hopefully).
935
936* Improved consistency in naming functions that are a part of the public API.
937  Now all public functions are lowercase following the standard library
938  conventions. Previously it was a combination of lowercase and
939  CapitalizedWords.
940  Issue `#50 <https://github.com/fmtlib/fmt/issues/50>`_.
941
942* Old functions are marked as deprecated and will be removed in the next
943  release.
944
945**Other Changes**
946
947* Experimental support for printf format specifications (work in progress):
948
949  .. code:: c++
950
951    fmt::printf("The answer is %d.", 42);
952    std::string s = fmt::sprintf("Look, a %s!", "string");
953
954* Support for hexadecimal floating point format specifiers ``a`` and ``A``:
955
956  .. code:: c++
957
958    print("{:a}", -42.0); // Prints -0x1.5p+5
959    print("{:A}", -42.0); // Prints -0X1.5P+5
960
961* CMake option ``FMT_SHARED`` that specifies whether to build format as a
962  shared library (off by default).
963
9640.9.0 - 2014-05-13
965------------------
966
967* More efficient implementation of variadic formatting functions.
968
969* ``Writer::Format`` now has a variadic overload:
970
971  .. code:: c++
972
973    Writer out;
974    out.Format("Look, I'm {}!", "variadic");
975
976* For efficiency and consistency with other overloads, variadic overload of
977  the ``Format`` function now returns ``Writer`` instead of ``std::string``.
978  Use the ``str`` function to convert it to ``std::string``:
979
980  .. code:: c++
981
982    std::string s = str(Format("Look, I'm {}!", "variadic"));
983
984* Replaced formatter actions with output sinks: ``NoAction`` -> ``NullSink``,
985  ``Write`` -> ``FileSink``, ``ColorWriter`` -> ``ANSITerminalSink``.
986  This improves naming consistency and shouldn't affect client code unless
987  these classes are used directly which should be rarely needed.
988
989* Added ``ThrowSystemError`` function that formats a message and throws
990  ``SystemError`` containing the formatted message and system-specific error
991  description. For example, the following code
992
993  .. code:: c++
994
995    FILE *f = fopen(filename, "r");
996    if (!f)
997      ThrowSystemError(errno, "Failed to open file '{}'") << filename;
998
999  will throw ``SystemError`` exception with description
1000  "Failed to open file '<filename>': No such file or directory" if file
1001  doesn't exist.
1002
1003* Support for AppVeyor continuous integration platform.
1004
1005* ``Format`` now throws ``SystemError`` in case of I/O errors.
1006
1007* Improve test infrastructure. Print functions are now tested by redirecting
1008  the output to a pipe.
1009
10100.8.0 - 2014-04-14
1011------------------
1012
1013* Initial release
1014