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