Home | History | Annotate | Download | only in fmtlib
      1 3.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-Michal 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 Keskinz) <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 
     15 3.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 
    183 2.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 
    193 2.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 
    215 2.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 
    230 2.0.0 - 2015-12-01
    231 ------------------
    232 
    233 General
    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 
    383 Optimization
    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 
    401 Distribution
    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 
    435 Documentation
    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 
    470 Fixes
    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 
    585 1.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 
    656 1.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 
    702 0.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 
    761 0.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 
    783 0.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 
    865 0.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 
    911 0.8.0 - 2014-04-14
    912 ------------------
    913 
    914 * Initial release
    915