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