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