7.1.3 - 2020-11-24
------------------

* Fixed handling of buffer boundaries in ``format_to_n``
  (`#1996 <https://github.com/fmtlib/fmt/issues/1996>`_,
  `#2029 <https://github.com/fmtlib/fmt/issues/2029>`_).

* Fixed linkage errors when linking with a shared library
  (`#2011 <https://github.com/fmtlib/fmt/issues/2011>`_).

* Reintroduced ostream support to range formatters
  (`#2014 <https://github.com/fmtlib/fmt/issues/2014>`_).

* Worked around an issue with mixing std versions in gcc
  (`#2017 <https://github.com/fmtlib/fmt/issues/2017>`_).

7.1.2 - 2020-11-04
------------------

* Fixed floating point formatting with large precision
  (`#1976 <https://github.com/fmtlib/fmt/issues/1976>`_).

7.1.1 - 2020-11-01
------------------

* Fixed ABI compatibility with 7.0.x
  (`#1961 <https://github.com/fmtlib/fmt/issues/1961>`_).

* Added the ``FMT_ARM_ABI_COMPATIBILITY`` macro to work around ABI
  incompatibility between GCC and Clang on ARM
  (`#1919 <https://github.com/fmtlib/fmt/issues/1919>`_).

* Worked around a SFINAE bug in GCC 8
  (`#1957 <https://github.com/fmtlib/fmt/issues/1957>`_).

* Fixed linkage errors when building with GCC's LTO
  (`#1955 <https://github.com/fmtlib/fmt/issues/1955>`_).

* Fixed a compilation error when building without ``__builtin_clz`` or equivalent
  (`#1968 <https://github.com/fmtlib/fmt/pull/1968>`_).
  Thanks `@tohammer (Tobias Hammer) <https://github.com/tohammer>`_.

* Fixed a sign conversion warning
  (`#1964 <https://github.com/fmtlib/fmt/pull/1964>`_).
  Thanks `@OptoCloud <https://github.com/OptoCloud>`_.

7.1.0 - 2020-10-25
------------------

* Switched from `Grisu3
  <https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf>`_
  to `Dragonbox <https://github.com/jk-jeon/dragonbox>`_ for the default
  floating-point formatting which gives the shortest decimal representation
  with round-trip guarantee and correct rounding
  (`#1882 <https://github.com/fmtlib/fmt/pull/1882>`_,
  `#1887 <https://github.com/fmtlib/fmt/pull/1887>`_,
  `#1894 <https://github.com/fmtlib/fmt/pull/1894>`_). This makes {fmt} up to
  20-30x faster than common implementations of ``std::ostringstream`` and
  ``sprintf`` on `dtoa-benchmark <https://github.com/fmtlib/dtoa-benchmark>`_
  and faster than double-conversion and Ryū:

  .. image:: https://user-images.githubusercontent.com/576385/
             95684665-11719600-0ba8-11eb-8e5b-972ff4e49428.png

  It is possible to get even better performance at the cost of larger binary
  size by compiling with the ``FMT_USE_FULL_CACHE_DRAGONBOX`` macro set to 1.

  Thanks `@jk-jeon (Junekey Jeon) <https://github.com/jk-jeon>`_.

* Added an experimental unsynchronized file output API which, together with
  `format string compilation <https://fmt.dev/latest/api.html#compile-api>`_,
  can give `5-9 times speed up compared to fprintf
  <https://www.zverovich.net/2020/08/04/optimal-file-buffer-size.html>`_
  on common platforms (`godbolt <https://godbolt.org/z/nsTcG8>`__):

  .. code:: c++

     #include <fmt/os.h>

     int main() {
       auto f = fmt::output_file("guide");
       f.print("The answer is {}.", 42);
     }

* Added a formatter for ``std::chrono::time_point<system_clock>``
  (`#1819 <https://github.com/fmtlib/fmt/issues/1819>`_,
  `#1837 <https://github.com/fmtlib/fmt/pull/1837>`_). For example
  (`godbolt <https://godbolt.org/z/c4M6fh>`__):

  .. code:: c++

     #include <fmt/chrono.h>

     int main() {
       auto now = std::chrono::system_clock::now();
       fmt::print("The time is {:%H:%M:%S}.\n", now);
     }

  Thanks `@adamburgess (Adam Burgess) <https://github.com/adamburgess>`_.

* Added support for ranges with non-const ``begin``/``end`` to ``fmt::join``
  (`#1784 <https://github.com/fmtlib/fmt/issues/1784>`_,
  `#1786 <https://github.com/fmtlib/fmt/pull/1786>`_). For example
  (`godbolt <https://godbolt.org/z/jP63Tv>`__):

  .. code:: c++

     #include <fmt/ranges.h>
     #include <range/v3/view/filter.hpp>

     int main() {
       using std::literals::string_literals::operator""s;
       auto strs = std::array{"a"s, "bb"s, "ccc"s};
       auto range = strs | ranges::views::filter(
         [] (const std::string &x) { return x.size() != 2; }
       );
       fmt::print("{}\n", fmt::join(range, ""));
     }

  prints "accc".

  Thanks `@tonyelewis (Tony E Lewis) <https://github.com/tonyelewis>`_.

* Added a ``memory_buffer::append`` overload that takes a range
  (`#1806 <https://github.com/fmtlib/fmt/pull/1806>`_).
  Thanks `@BRevzin (Barry Revzin) <https://github.com/BRevzin>`_.

* Improved handling of single code units in ``FMT_COMPILE``. For example:

  .. code:: c++

     #include <fmt/compile.h>

     char* f(char* buf) {
       return fmt::format_to(buf, FMT_COMPILE("x{}"), 42);
     }

  compiles to just (`godbolt <https://godbolt.org/z/5vncz3>`__):

  .. code:: asm

     _Z1fPc:
       movb $120, (%rdi)
       xorl %edx, %edx
       cmpl $42, _ZN3fmt2v76detail10basic_dataIvE23zero_or_powers_of_10_32E+8(%rip)
       movl $3, %eax
       seta %dl
       subl %edx, %eax
       movzwl _ZN3fmt2v76detail10basic_dataIvE6digitsE+84(%rip), %edx
       cltq
       addq %rdi, %rax
       movw %dx, -2(%rax)
       ret

  Here a single ``mov`` instruction writes ``'x'`` (``$120``) to the output
  buffer.

* Added dynamic width support to format string compilation
  (`#1809 <https://github.com/fmtlib/fmt/issues/1809>`_).

* Improved error reporting for unformattable types: now you'll get the type name
  directly in the error message instead of the note:

  .. code:: c++

     #include <fmt/core.h>

     struct how_about_no {};

     int main() {
       fmt::print("{}", how_about_no());
     }

  Error (`godbolt <https://godbolt.org/z/GoxM4e>`__):

  ``fmt/core.h:1438:3: error: static_assert failed due to requirement
  'fmt::v7::formattable<how_about_no>()' "Cannot format an argument.
  To make type T formattable provide a formatter<T> specialization:
  https://fmt.dev/latest/api.html#udt"
  ...``

* Added the `make_args_checked <https://fmt.dev/7.1.0/api.html#argument-lists>`_
  function template that allows you to write formatting functions with
  compile-time format string checks and avoid binary code bloat
  (`godbolt <https://godbolt.org/z/PEf9qr>`__):

  .. code:: c++

     void vlog(const char* file, int line, fmt::string_view format,
               fmt::format_args args) {
       fmt::print("{}: {}: ", file, line);
       fmt::vprint(format, args);
     }

     template <typename S, typename... Args>
     void log(const char* file, int line, const S& format, Args&&... args) {
       vlog(file, line, format,
           fmt::make_args_checked<Args...>(format, args...));
     }

     #define MY_LOG(format, ...) \
       log(__FILE__, __LINE__, FMT_STRING(format), __VA_ARGS__)

     MY_LOG("invalid squishiness: {}", 42);

* Replaced ``snprintf`` fallback with a faster internal IEEE 754 ``float`` and
  ``double`` formatter for arbitrary precision. For example
  (`godbolt <https://godbolt.org/z/dPhWvj>`__):

  .. code:: c++

     #include <fmt/core.h>

     int main() {
       fmt::print("{:.500}\n", 4.9406564584124654E-324);
     }

  prints

  ``4.9406564584124654417656879286822137236505980261432476442558568250067550727020875186529983636163599237979656469544571773092665671035593979639877479601078187812630071319031140452784581716784898210368871863605699873072305000638740915356498438731247339727316961514003171538539807412623856559117102665855668676818703956031062493194527159149245532930545654440112748012970999954193198940908041656332452475714786901472678015935523861155013480352649347201937902681071074917033322268447533357208324319360923829e-324``.

* Made ``format_to_n`` and ``formatted_size`` part of the `core API
  <https://fmt.dev/latest/api.html#core-api>`__
  (`godbolt <https://godbolt.org/z/sPjY1K>`__):

  .. code:: c++

     #include <fmt/core.h>

     int main() {
       char buffer[10];
       auto result = fmt::format_to_n(buffer, sizeof(buffer), "{}", 42);
     }

* Added ``fmt::format_to_n`` overload with format string compilation
  (`#1764 <https://github.com/fmtlib/fmt/issues/1764>`_,
  `#1767 <https://github.com/fmtlib/fmt/pull/1767>`_,
  `#1869 <https://github.com/fmtlib/fmt/pull/1869>`_). For example
  (`godbolt <https://godbolt.org/z/93h86q>`__):

  .. code:: c++

     #include <fmt/compile.h>

     int main() {
       char buffer[8];
       fmt::format_to_n(buffer, sizeof(buffer), FMT_COMPILE("{}"), 42);
     }

  Thanks `@Kurkin (Dmitry Kurkin) <https://github.com/Kurkin>`_,
  `@alexezeder (Alexey Ochapov) <https://github.com/alexezeder>`_.

* Added ``fmt::format_to`` overload that take ``text_style``
  (`#1593 <https://github.com/fmtlib/fmt/issues/1593>`_,
  `#1842 <https://github.com/fmtlib/fmt/issues/1842>`_,
  `#1843 <https://github.com/fmtlib/fmt/pull/1843>`_). For example
  (`godbolt <https://godbolt.org/z/91153r>`__):

  .. code:: c++

     #include <fmt/color.h>

     int main() {
       std::string out;
       fmt::format_to(std::back_inserter(out),
                      fmt::emphasis::bold | fg(fmt::color::red),
                      "The answer is {}.", 42);
     }

  Thanks `@Naios (Denis Blank) <https://github.com/Naios>`_.

* Made the ``#`` specifier emit trailing zeros in addition to the decimal point
  (`#1797 <https://github.com/fmtlib/fmt/issues/1797>`_). For example
  (`godbolt <https://godbolt.org/z/bhdcW9>`__):

  .. code:: c++

     #include <fmt/core.h>

     int main() {
       fmt::print("{:#.2g}", 0.5);
     }

  prints ``0.50``.

* Changed the default floating point format to not include ``.0`` for
  consistency with ``std::format`` and ``std::to_chars``
  (`#1893 <https://github.com/fmtlib/fmt/issues/1893>`_,
  `#1943 <https://github.com/fmtlib/fmt/issues/1943>`_). It is possible to get
  the decimal point and trailing zero with the ``#`` specifier.

* Fixed an issue with floating-point formatting that could result in addition of
  a non-significant trailing zero in rare cases e.g. ``1.00e-34`` instead of
  ``1.0e-34`` (`#1873 <https://github.com/fmtlib/fmt/issues/1873>`_,
  `#1917 <https://github.com/fmtlib/fmt/issues/1917>`_).

* Made ``fmt::to_string`` fallback on ``ostream`` insertion operator if
  the ``formatter`` specialization is not provided
  (`#1815 <https://github.com/fmtlib/fmt/issues/1815>`_,
  `#1829 <https://github.com/fmtlib/fmt/pull/1829>`_).
  Thanks `@alexezeder (Alexey Ochapov) <https://github.com/alexezeder>`_.

* Added support for the append mode to the experimental file API and
  improved ``fcntl.h`` detection.
  (`#1847 <https://github.com/fmtlib/fmt/pull/1847>`_,
  `#1848 <https://github.com/fmtlib/fmt/pull/1848>`_).
  Thanks `@t-wiser <https://github.com/t-wiser>`_.

* Fixed handling of types that have both an implicit conversion operator and
  an overloaded ``ostream`` insertion operator
  (`#1766 <https://github.com/fmtlib/fmt/issues/1766>`_).

* Fixed a slicing issue in an internal iterator type
  (`#1822 <https://github.com/fmtlib/fmt/pull/1822>`_).
  Thanks `@BRevzin (Barry Revzin) <https://github.com/BRevzin>`_.

* Fixed an issue in locale-specific integer formatting
  (`#1927 <https://github.com/fmtlib/fmt/issues/1927>`_).

* Fixed handling of exotic code unit types
  (`#1870 <https://github.com/fmtlib/fmt/issues/1870>`_,
  `#1932 <https://github.com/fmtlib/fmt/issues/1932>`_).

* Improved ``FMT_ALWAYS_INLINE``
  (`#1878 <https://github.com/fmtlib/fmt/pull/1878>`_).
  Thanks `@jk-jeon (Junekey Jeon) <https://github.com/jk-jeon>`_.

* Removed dependency on ``windows.h``
  (`#1900 <https://github.com/fmtlib/fmt/pull/1900>`_).
  Thanks `@bernd5 (Bernd Baumanns) <https://github.com/bernd5>`_.

* Optimized counting of decimal digits on MSVC
  (`#1890 <https://github.com/fmtlib/fmt/pull/1890>`_).
  Thanks `@mwinterb <https://github.com/mwinterb>`_.

* Improved documentation
  (`#1772 <https://github.com/fmtlib/fmt/issues/1772>`_,
  `#1775 <https://github.com/fmtlib/fmt/pull/1775>`_,
  `#1792 <https://github.com/fmtlib/fmt/pull/1792>`_,
  `#1838 <https://github.com/fmtlib/fmt/pull/1838>`_,
  `#1888 <https://github.com/fmtlib/fmt/pull/1888>`_,
  `#1918 <https://github.com/fmtlib/fmt/pull/1918>`_,
  `#1939 <https://github.com/fmtlib/fmt/pull/1939>`_).
  Thanks `@leolchat (Léonard Gérard) <https://github.com/leolchat>`_,
  `@pepsiman (Malcolm Parsons) <https://github.com/pepsiman>`_,
  `@Klaim (Joël Lamotte) <https://github.com/Klaim>`_,
  `@ravijanjam (Ravi J) <https://github.com/ravijanjam>`_,
  `@francesco-st <https://github.com/francesco-st>`_,
  `@udnaan (Adnan) <https://github.com/udnaan>`_.

* Added the ``FMT_REDUCE_INT_INSTANTIATIONS`` CMake option that reduces the
  binary code size at the cost of some integer formatting performance. This can
  be useful for extremely memory-constrained embedded systems
  (`#1778 <https://github.com/fmtlib/fmt/issues/1778>`_,
  `#1781 <https://github.com/fmtlib/fmt/pull/1781>`_).
  Thanks `@kammce (Khalil Estell) <https://github.com/kammce>`_.

* Added the ``FMT_USE_INLINE_NAMESPACES`` macro to control usage of inline
  namespaces (`#1945 <https://github.com/fmtlib/fmt/pull/1945>`_).
  Thanks `@darklukee <https://github.com/darklukee>`_.

* Improved build configuration
  (`#1760 <https://github.com/fmtlib/fmt/pull/1760>`_,
  `#1770 <https://github.com/fmtlib/fmt/pull/1770>`_,
  `#1779 <https://github.com/fmtlib/fmt/issues/1779>`_,
  `#1783 <https://github.com/fmtlib/fmt/pull/1783>`_,
  `#1823 <https://github.com/fmtlib/fmt/pull/1823>`_).
  Thanks `@dvetutnev (Dmitriy Vetutnev) <https://github.com/dvetutnev>`_,
  `@xvitaly (Vitaly Zaitsev) <https://github.com/xvitaly>`_,
  `@tambry (Raul Tambre) <https://github.com/tambry>`_,
  `@medithe <https://github.com/medithe>`_,
  `@martinwuehrer (Martin Wührer) <https://github.com/martinwuehrer>`_.

* Fixed various warnings and compilation issues
  (`#1790 <https://github.com/fmtlib/fmt/pull/1790>`_,
  `#1802 <https://github.com/fmtlib/fmt/pull/1802>`_,
  `#1808 <https://github.com/fmtlib/fmt/pull/1808>`_,
  `#1810 <https://github.com/fmtlib/fmt/issues/1810>`_,
  `#1811 <https://github.com/fmtlib/fmt/issues/1811>`_,
  `#1812 <https://github.com/fmtlib/fmt/pull/1812>`_,
  `#1814 <https://github.com/fmtlib/fmt/pull/1814>`_,
  `#1816 <https://github.com/fmtlib/fmt/pull/1816>`_,
  `#1817 <https://github.com/fmtlib/fmt/pull/1817>`_,
  `#1818 <https://github.com/fmtlib/fmt/pull/1818>`_,
  `#1825 <https://github.com/fmtlib/fmt/issues/1825>`_,
  `#1836 <https://github.com/fmtlib/fmt/pull/1836>`_,
  `#1855 <https://github.com/fmtlib/fmt/pull/1855>`_,
  `#1856 <https://github.com/fmtlib/fmt/pull/1856>`_,
  `#1860 <https://github.com/fmtlib/fmt/pull/1860>`_,
  `#1877 <https://github.com/fmtlib/fmt/pull/1877>`_,
  `#1879 <https://github.com/fmtlib/fmt/pull/1879>`_,
  `#1880 <https://github.com/fmtlib/fmt/pull/1880>`_,
  `#1896 <https://github.com/fmtlib/fmt/issues/1896>`_,
  `#1897 <https://github.com/fmtlib/fmt/pull/1897>`_,
  `#1898 <https://github.com/fmtlib/fmt/pull/1898>`_,
  `#1904 <https://github.com/fmtlib/fmt/issues/1904>`_,
  `#1908 <https://github.com/fmtlib/fmt/pull/1908>`_,
  `#1911 <https://github.com/fmtlib/fmt/issues/1911>`_,
  `#1912 <https://github.com/fmtlib/fmt/issues/1912>`_,
  `#1928 <https://github.com/fmtlib/fmt/issues/1928>`_,
  `#1929 <https://github.com/fmtlib/fmt/pull/1929>`_,
  `#1935 <https://github.com/fmtlib/fmt/issues/1935>`_
  `#1937 <https://github.com/fmtlib/fmt/pull/1937>`_,
  `#1942 <https://github.com/fmtlib/fmt/pull/1942>`_,
  `#1949 <https://github.com/fmtlib/fmt/issues/1949>`_).
  Thanks `@TheQwertiest <https://github.com/TheQwertiest>`_,
  `@medithe <https://github.com/medithe>`_,
  `@martinwuehrer (Martin Wührer) <https://github.com/martinwuehrer>`_,
  `@n16h7hunt3r <https://github.com/n16h7hunt3r>`_,
  `@Othereum (Seokjin Lee) <https://github.com/Othereum>`_,
  `@gsjaardema (Greg Sjaardema) <https://github.com/gsjaardema>`_,
  `@AlexanderLanin (Alexander Lanin) <https://github.com/AlexanderLanin>`_,
  `@gcerretani (Giovanni Cerretani) <https://github.com/gcerretani>`_,
  `@chronoxor (Ivan Shynkarenka) <https://github.com/chronoxor>`_,
  `@noizefloor (Jan Schwers) <https://github.com/noizefloor>`_,
  `@akohlmey (Axel Kohlmeyer) <https://github.com/akohlmey>`_,
  `@jk-jeon (Junekey Jeon) <https://github.com/jk-jeon>`_,
  `@rimathia <https://github.com/rimathia>`_,
  `@rglarix (Riccardo Ghetta (larix)) <https://github.com/rglarix>`_,
  `@moiwi <https://github.com/moiwi>`_,
  `@heckad (Kazantcev Andrey) <https://github.com/heckad>`_,
  `@MarcDirven <https://github.com/MarcDirven>`_.
  `@BartSiwek (Bart Siwek) <https://github.com/BartSiwek>`_,
  `@darklukee <https://github.com/darklukee>`_.

7.0.3 - 2020-08-06
------------------

* Worked around broken ``numeric_limits`` for 128-bit integers
  (`#1787 <https://github.com/fmtlib/fmt/issues/1787>`_).

* Added error reporting on missing named arguments
  (`#1796 <https://github.com/fmtlib/fmt/issues/1796>`_).

* Stopped using 128-bit integers with clang-cl
  (`#1800 <https://github.com/fmtlib/fmt/pull/1800>`_).
  Thanks `@Kingcom <https://github.com/Kingcom>`_.

* Fixed issues in locale-specific integer formatting
  (`#1782 <https://github.com/fmtlib/fmt/issues/1782>`_,
  `#1801 <https://github.com/fmtlib/fmt/issues/1801>`_).

7.0.2 - 2020-07-29
------------------

* Worked around broken ``numeric_limits`` for 128-bit integers
  (`#1725 <https://github.com/fmtlib/fmt/issues/1725>`_).

* Fixed compatibility with CMake 3.4
  (`#1779 <https://github.com/fmtlib/fmt/issues/1779>`_).

* Fixed handling of digit separators in locale-specific formatting
  (`#1782 <https://github.com/fmtlib/fmt/issues/1782>`_).

7.0.1 - 2020-07-07
------------------

* Updated the inline version namespace name.

* Worked around a gcc bug in mangling of alias templates
  (`#1753 <https://github.com/fmtlib/fmt/issues/1753>`_).

* Fixed a linkage error on Windows
  (`#1757 <https://github.com/fmtlib/fmt/issues/1757>`_).
  Thanks `@Kurkin (Dmitry Kurkin) <https://github.com/Kurkin>`_.

* Fixed minor issues with the documentation.

7.0.0 - 2020-07-05
------------------

* Reduced the library size. For example, on macOS a stripped test binary
  statically linked with {fmt} `shrank from ~368k to less than 100k
  <http://www.zverovich.net/2020/05/21/reducing-library-size.html>`_.

* Added a simpler and more efficient `format string compilation API
  <https://fmt.dev/7.0.0/api.html#compile-api>`_:

  .. code:: c++

     #include <fmt/compile.h>

     // Converts 42 into std::string using the most efficient method and no
     // runtime format string processing.
     std::string s = fmt::format(FMT_COMPILE("{}"), 42);

  The old ``fmt::compile`` API is now deprecated.

* Optimized integer formatting: ``format_to`` with format string compilation
  and a stack-allocated buffer is now `faster than to_chars on both
  libc++ and libstdc++
  <http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html>`_.

* Optimized handling of small format strings. For example,

  .. code:: c++

      fmt::format("Result: {}: ({},{},{},{})", str1, str2, str3, str4, str5)

  is now ~40% faster (`#1685 <https://github.com/fmtlib/fmt/issues/1685>`_).

* Applied extern templates to improve compile times when using the core API
  and ``fmt/format.h`` (`#1452 <https://github.com/fmtlib/fmt/issues/1452>`_).
  For example, on macOS with clang the compile time of a test translation unit
  dropped from 2.3s to 0.3s with ``-O2`` and from 0.6s to 0.3s with the default
  settings (``-O0``).

  Before (``-O2``)::

    % time c++ -c test.cc -I include -std=c++17 -O2
    c++ -c test.cc -I include -std=c++17 -O2  2.22s user 0.08s system 99% cpu 2.311 total

  After (``-O2``)::

    % time c++ -c test.cc -I include -std=c++17 -O2
    c++ -c test.cc -I include -std=c++17 -O2  0.26s user 0.04s system 98% cpu 0.303 total

  Before (default)::

    % time c++ -c test.cc -I include -std=c++17
    c++ -c test.cc -I include -std=c++17  0.53s user 0.06s system 98% cpu 0.601 total

  After (default)::

    % time c++ -c test.cc -I include -std=c++17
    c++ -c test.cc -I include -std=c++17  0.24s user 0.06s system 98% cpu 0.301 total

  It is still recommended to use ``fmt/core.h`` instead of ``fmt/format.h`` but
  the compile time difference is now smaller. Thanks
  `@alex3d <https://github.com/alex3d>`_ for the suggestion.

* Named arguments are now stored on stack (no dynamic memory allocations) and
  the compiled code is more compact and efficient. For example

  .. code:: c++

     #include <fmt/core.h>

     int main() {
       fmt::print("The answer is {answer}\n", fmt::arg("answer", 42));
     }

  compiles to just (`godbolt <https://godbolt.org/z/NcfEp_>`__)

  .. code:: asm

      .LC0:
              .string "answer"
      .LC1:
              .string "The answer is {answer}\n"
      main:
              sub     rsp, 56
              mov     edi, OFFSET FLAT:.LC1
              mov     esi, 23
              movabs  rdx, 4611686018427387905
              lea     rax, [rsp+32]
              lea     rcx, [rsp+16]
              mov     QWORD PTR [rsp+8], 1
              mov     QWORD PTR [rsp], rax
              mov     DWORD PTR [rsp+16], 42
              mov     QWORD PTR [rsp+32], OFFSET FLAT:.LC0
              mov     DWORD PTR [rsp+40], 0
              call    fmt::v6::vprint(fmt::v6::basic_string_view<char>,
                                      fmt::v6::format_args)
              xor     eax, eax
              add     rsp, 56
              ret

          .L.str.1:
                  .asciz  "answer"

* Implemented compile-time checks for dynamic width and precision
  (`#1614 <https://github.com/fmtlib/fmt/issues/1614>`_):

  .. code:: c++

     #include <fmt/format.h>

     int main() {
       fmt::print(FMT_STRING("{0:{1}}"), 42);
     }

  now gives a compilation error because argument 1 doesn't exist::

    In file included from test.cc:1:
    include/fmt/format.h:2726:27: error: constexpr variable 'invalid_format' must be
    initialized by a constant expression
      FMT_CONSTEXPR_DECL bool invalid_format =
                              ^
    ...
    include/fmt/core.h:569:26: note: in call to
    '&checker(s, {}).context_->on_error(&"argument not found"[0])'
        if (id >= num_args_) on_error("argument not found");
                            ^

* Added sentinel support to ``fmt::join``
  (`#1689 <https://github.com/fmtlib/fmt/pull/1689>`_)

  .. code:: c++

    struct zstring_sentinel {};
    bool operator==(const char* p, zstring_sentinel) { return *p == '\0'; }
    bool operator!=(const char* p, zstring_sentinel) { return *p != '\0'; }

    struct zstring {
      const char* p;
      const char* begin() const { return p; }
      zstring_sentinel end() const { return {}; }
    };

    auto s = fmt::format("{}", fmt::join(zstring{"hello"}, "_"));
    // s == "h_e_l_l_o"

  Thanks `@BRevzin (Barry Revzin) <https://github.com/BRevzin>`_.

* Added support for named arguments, ``clear`` and ``reserve`` to
  ``dynamic_format_arg_store``
  (`#1655 <https://github.com/fmtlib/fmt/issues/1655>`_,
  `#1663 <https://github.com/fmtlib/fmt/pull/1663>`_,
  `#1674 <https://github.com/fmtlib/fmt/pull/1674>`_,
  `#1677 <https://github.com/fmtlib/fmt/pull/1677>`_).
  Thanks `@vsolontsov-ll (Vladimir Solontsov)
  <https://github.com/vsolontsov-ll>`_.

* Added support for the ``'c'`` format specifier to integral types for
  compatibility with ``std::format``
  (`#1652 <https://github.com/fmtlib/fmt/issues/1652>`_).

* Replaced the ``'n'`` format specifier with ``'L'`` for compatibility with
  ``std::format`` (`#1624 <https://github.com/fmtlib/fmt/issues/1624>`_).
  The ``'n'`` specifier can be enabled via the ``FMT_DEPRECATED_N_SPECIFIER``
  macro.

* The ``'='`` format specifier is now disabled by default for compatibility with
  ``std::format``. It can be enabled via the ``FMT_DEPRECATED_NUMERIC_ALIGN``
  macro.

* Removed the following deprecated APIs:

  * ``FMT_STRING_ALIAS`` and ``fmt`` macros - replaced by ``FMT_STRING``
  * ``fmt::basic_string_view::char_type`` - replaced by
    ``fmt::basic_string_view::value_type``
  * ``convert_to_int``
  * ``format_arg_store::types``
  * ``*parse_context`` - replaced by ``*format_parse_context``
  * ``FMT_DEPRECATED_INCLUDE_OS``
  * ``FMT_DEPRECATED_PERCENT`` - incompatible with ``std::format``
  * ``*writer`` - replaced by compiled format API

* Renamed the ``internal`` namespace to ``detail``
  (`#1538 <https://github.com/fmtlib/fmt/issues/1538>`_). The former is still
  provided as an alias if the ``FMT_USE_INTERNAL`` macro is defined.

* Improved compatibility between ``fmt::printf`` with the standard specs
  (`#1595 <https://github.com/fmtlib/fmt/issues/1595>`_,
  `#1682 <https://github.com/fmtlib/fmt/pull/1682>`_,
  `#1683 <https://github.com/fmtlib/fmt/pull/1683>`_,
  `#1687 <https://github.com/fmtlib/fmt/pull/1687>`_,
  `#1699 <https://github.com/fmtlib/fmt/pull/1699>`_).
  Thanks `@rimathia <https://github.com/rimathia>`_.

* Fixed handling of ``operator<<`` overloads that use ``copyfmt``
  (`#1666 <https://github.com/fmtlib/fmt/issues/1666>`_).

* Added the ``FMT_OS`` CMake option to control inclusion of OS-specific APIs
  in the fmt target. This can be useful for embedded platforms
  (`#1654 <https://github.com/fmtlib/fmt/issues/1654>`_,
  `#1656 <https://github.com/fmtlib/fmt/pull/1656>`_).
  Thanks `@kwesolowski (Krzysztof Wesolowski)
  <https://github.com/kwesolowski>`_.

* Replaced ``FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION`` with the ``FMT_FUZZ``
  macro to prevent interferring with fuzzing of projects using {fmt}
  (`#1650 <https://github.com/fmtlib/fmt/pull/1650>`_).
  Thanks `@asraa (Asra Ali) <https://github.com/asraa>`_.

* Fixed compatibility with emscripten
  (`#1636 <https://github.com/fmtlib/fmt/issues/1636>`_,
  `#1637 <https://github.com/fmtlib/fmt/pull/1637>`_).
  Thanks `@ArthurSonzogni (Arthur Sonzogni)
  <https://github.com/ArthurSonzogni>`_.

* Improved documentation
  (`#704 <https://github.com/fmtlib/fmt/issues/704>`_,
  `#1643 <https://github.com/fmtlib/fmt/pull/1643>`_,
  `#1660 <https://github.com/fmtlib/fmt/pull/1660>`_,
  `#1681 <https://github.com/fmtlib/fmt/pull/1681>`_,
  `#1691 <https://github.com/fmtlib/fmt/pull/1691>`_,
  `#1706 <https://github.com/fmtlib/fmt/pull/1706>`_,
  `#1714 <https://github.com/fmtlib/fmt/pull/1714>`_,
  `#1721 <https://github.com/fmtlib/fmt/pull/1721>`_,
  `#1739 <https://github.com/fmtlib/fmt/pull/1739>`_,
  `#1740 <https://github.com/fmtlib/fmt/pull/1740>`_,
  `#1741 <https://github.com/fmtlib/fmt/pull/1741>`_,
  `#1751 <https://github.com/fmtlib/fmt/pull/1751>`_).
  Thanks `@senior7515 (Alexander Gallego) <https://github.com/senior7515>`_,
  `@lsr0 (Lindsay Roberts) <https://github.com/lsr0>`_,
  `@puetzk (Kevin Puetz) <https://github.com/puetzk>`_,
  `@fpelliccioni (Fernando Pelliccioni) <https://github.com/fpelliccioni>`_,
  Alexey Kuzmenko, `@jelly (jelle van der Waa) <https://github.com/jelly>`_,
  `@claremacrae (Clare Macrae) <https://github.com/claremacrae>`_,
  `@jiapengwen (文佳鹏) <https://github.com/jiapengwen>`_,
  `@gsjaardema (Greg Sjaardema) <https://github.com/gsjaardema>`_,
  `@alexey-milovidov <https://github.com/alexey-milovidov>`_.

* Implemented various build configuration fixes and improvements
  (`#1603 <https://github.com/fmtlib/fmt/pull/1603>`_,
  `#1657 <https://github.com/fmtlib/fmt/pull/1657>`_,
  `#1702 <https://github.com/fmtlib/fmt/pull/1702>`_,
  `#1728 <https://github.com/fmtlib/fmt/pull/1728>`_).
  Thanks `@scramsby (Scott Ramsby) <https://github.com/scramsby>`_,
  `@jtojnar (Jan Tojnar) <https://github.com/jtojnar>`_,
  `@orivej (Orivej Desh) <https://github.com/orivej>`_,
  `@flagarde <https://github.com/flagarde>`_.

* Fixed various warnings and compilation issues
  (`#1616 <https://github.com/fmtlib/fmt/pull/1616>`_,
  `#1620 <https://github.com/fmtlib/fmt/issues/1620>`_,
  `#1622 <https://github.com/fmtlib/fmt/issues/1622>`_,
  `#1625 <https://github.com/fmtlib/fmt/issues/1625>`_,
  `#1627 <https://github.com/fmtlib/fmt/pull/1627>`_,
  `#1628 <https://github.com/fmtlib/fmt/issues/1628>`_,
  `#1629 <https://github.com/fmtlib/fmt/pull/1629>`_,
  `#1631 <https://github.com/fmtlib/fmt/issues/1631>`_,
  `#1633 <https://github.com/fmtlib/fmt/pull/1633>`_,
  `#1649 <https://github.com/fmtlib/fmt/pull/1649>`_,
  `#1658 <https://github.com/fmtlib/fmt/issues/1658>`_,
  `#1661 <https://github.com/fmtlib/fmt/pull/1661>`_,
  `#1667 <https://github.com/fmtlib/fmt/pull/1667>`_,
  `#1668 <https://github.com/fmtlib/fmt/issues/1668>`_,
  `#1669 <https://github.com/fmtlib/fmt/pull/1669>`_,
  `#1692 <https://github.com/fmtlib/fmt/issues/1692>`_,
  `#1696 <https://github.com/fmtlib/fmt/pull/1696>`_,
  `#1697 <https://github.com/fmtlib/fmt/pull/1697>`_,
  `#1707 <https://github.com/fmtlib/fmt/issues/1707>`_,
  `#1712 <https://github.com/fmtlib/fmt/pull/1712>`_,
  `#1716 <https://github.com/fmtlib/fmt/pull/1716>`_,
  `#1722 <https://github.com/fmtlib/fmt/pull/1722>`_,
  `#1724 <https://github.com/fmtlib/fmt/issues/1724>`_,
  `#1729 <https://github.com/fmtlib/fmt/pull/1729>`_,
  `#1738 <https://github.com/fmtlib/fmt/pull/1738>`_,
  `#1742 <https://github.com/fmtlib/fmt/issues/1742>`_,
  `#1743 <https://github.com/fmtlib/fmt/issues/1743>`_,
  `#1744 <https://github.com/fmtlib/fmt/pull/1744>`_,
  `#1747 <https://github.com/fmtlib/fmt/issues/1747>`_,
  `#1750 <https://github.com/fmtlib/fmt/pull/1750>`_).
  Thanks `@gsjaardema (Greg Sjaardema) <https://github.com/gsjaardema>`_,
  `@gabime (Gabi Melman) <https://github.com/gabime>`_,
  `@johnor (Johan) <https://github.com/johnor>`_,
  `@Kurkin (Dmitry Kurkin) <https://github.com/Kurkin>`_,
  `@invexed (James Beach) <https://github.com/invexed>`_,
  `@peterbell10 <https://github.com/peterbell10>`_,
  `@daixtrose (Markus Werle) <https://github.com/daixtrose>`_,
  `@petrutlucian94 (Lucian Petrut) <https://github.com/petrutlucian94>`_,
  `@Neargye (Daniil Goncharov) <https://github.com/Neargye>`_,
  `@ambitslix (Attila M. Szilagyi) <https://github.com/ambitslix>`_,
  `@gabime (Gabi Melman) <https://github.com/gabime>`_,
  `@erthink (Leonid Yuriev) <https://github.com/erthink>`_,
  `@tohammer (Tobias Hammer) <https://github.com/tohammer>`_,
  `@0x8000-0000 (Florin Iucha) <https://github.com/0x8000-0000>`_.

6.2.1 - 2020-05-09
------------------

* Fixed ostream support in ``sprintf``
  (`#1631 <https://github.com/fmtlib/fmt/issues/1631>`_).

* Fixed type detection when using implicit conversion to ``string_view`` and
  ostream ``operator<<`` inconsistently
  (`#1662 <https://github.com/fmtlib/fmt/issues/1662>`_).

6.2.0 - 2020-04-05
------------------

* Improved error reporting when trying to format an object of a non-formattable
  type:

  .. code:: c++

     fmt::format("{}", S());

  now gives::

    include/fmt/core.h:1015:5: error: static_assert failed due to requirement
    'formattable' "Cannot format argument. To make type T formattable provide a
    formatter<T> specialization:
    https://fmt.dev/latest/api.html#formatting-user-defined-types"
        static_assert(
        ^
    ...
    note: in instantiation of function template specialization
    'fmt::v6::format<char [3], S, char>' requested here
      fmt::format("{}", S());
           ^

  if ``S`` is not formattable.

* Reduced the library size by ~10%.

* Always print decimal point if ``#`` is specified
  (`#1476 <https://github.com/fmtlib/fmt/issues/1476>`_,
  `#1498 <https://github.com/fmtlib/fmt/issues/1498>`_):

  .. code:: c++

     fmt::print("{:#.0f}", 42.0);

  now prints ``42.``

* Implemented the ``'L'`` specifier for locale-specific numeric formatting to
  improve compatibility with ``std::format``. The ``'n'`` specifier is now
  deprecated and will be removed in the next major release.

* Moved OS-specific APIs such as ``windows_error`` from ``fmt/format.h`` to
  ``fmt/os.h``. You can define ``FMT_DEPRECATED_INCLUDE_OS`` to automatically
  include ``fmt/os.h`` from ``fmt/format.h`` for compatibility but this will be
  disabled in the next major release.

* Added precision overflow detection in floating-point formatting.

* Implemented detection of invalid use of ``fmt::arg``.

* Used ``type_identity`` to block unnecessary template argument deduction.
  Thanks Tim Song.

* Improved UTF-8 handling
  (`#1109 <https://github.com/fmtlib/fmt/issues/1109>`_):

  .. code:: c++

     fmt::print("┌{0:─^{2}}┐\n"
                "│{1: ^{2}}│\n"
                "└{0:─^{2}}┘\n", "", "Привет, мир!", 20);

  now prints::

     ┌────────────────────┐
     │    Привет, мир!    │
     └────────────────────┘

  on systems that support Unicode.

* Added experimental dynamic argument storage
  (`#1170 <https://github.com/fmtlib/fmt/issues/1170>`_,
  `#1584 <https://github.com/fmtlib/fmt/pull/1584>`_):

  .. code:: c++

     fmt::dynamic_format_arg_store<fmt::format_context> store;
     store.push_back("answer");
     store.push_back(42);
     fmt::vprint("The {} is {}.\n", store);
  
  prints::

     The answer is 42.

  Thanks `@vsolontsov-ll (Vladimir Solontsov)
  <https://github.com/vsolontsov-ll>`_.

* Made ``fmt::join`` accept ``initializer_list``
  (`#1591 <https://github.com/fmtlib/fmt/pull/1591>`_).
  Thanks `@Rapotkinnik (Nikolay Rapotkin) <https://github.com/Rapotkinnik>`_.

* Fixed handling of empty tuples
  (`#1588 <https://github.com/fmtlib/fmt/issues/1588>`_).

* Fixed handling of output iterators in ``format_to_n``
  (`#1506 <https://github.com/fmtlib/fmt/issues/1506>`_).

* Fixed formatting of ``std::chrono::duration`` types to wide output
  (`#1533 <https://github.com/fmtlib/fmt/pull/1533>`_).
  Thanks `@zeffy (pilao) <https://github.com/zeffy>`_.

* Added const ``begin`` and ``end`` overload to buffers
  (`#1553 <https://github.com/fmtlib/fmt/pull/1553>`_).
  Thanks `@dominicpoeschko <https://github.com/dominicpoeschko>`_.

* Added the ability to disable floating-point formatting via ``FMT_USE_FLOAT``,
  ``FMT_USE_DOUBLE`` and ``FMT_USE_LONG_DOUBLE`` macros for extremely
  memory-constrained embedded system
  (`#1590 <https://github.com/fmtlib/fmt/pull/1590>`_).
  Thanks `@albaguirre (Alberto Aguirre) <https://github.com/albaguirre>`_.

* Made ``FMT_STRING`` work with ``constexpr`` ``string_view``
  (`#1589 <https://github.com/fmtlib/fmt/pull/1589>`_).
  Thanks `@scramsby (Scott Ramsby) <https://github.com/scramsby>`_.

* Implemented a minor optimization in the format string parser
  (`#1560 <https://github.com/fmtlib/fmt/pull/1560>`_).
  Thanks `@IkarusDeveloper <https://github.com/IkarusDeveloper>`_.

* Improved attribute detection
  (`#1469 <https://github.com/fmtlib/fmt/pull/1469>`_,
  `#1475 <https://github.com/fmtlib/fmt/pull/1475>`_,
  `#1576 <https://github.com/fmtlib/fmt/pull/1576>`_).
  Thanks `@federico-busato (Federico) <https://github.com/federico-busato>`_,
  `@chronoxor (Ivan Shynkarenka) <https://github.com/chronoxor>`_,
  `@refnum <https://github.com/refnum>`_.

* Improved documentation
  (`#1481 <https://github.com/fmtlib/fmt/pull/1481>`_,
  `#1523 <https://github.com/fmtlib/fmt/pull/1523>`_).
  Thanks `@JackBoosY (Jack·Boos·Yu) <https://github.com/JackBoosY>`_,
  `@imba-tjd (谭九鼎) <https://github.com/imba-tjd>`_.

* Fixed symbol visibility on Linux when compiling with ``-fvisibility=hidden``
  (`#1535 <https://github.com/fmtlib/fmt/pull/1535>`_).
  Thanks `@milianw (Milian Wolff) <https://github.com/milianw>`_.

* Implemented various build configuration fixes and improvements
  (`#1264 <https://github.com/fmtlib/fmt/issues/1264>`_,
  `#1460 <https://github.com/fmtlib/fmt/issues/1460>`_,
  `#1534 <https://github.com/fmtlib/fmt/pull/1534>`_,
  `#1536 <https://github.com/fmtlib/fmt/issues/1536>`_,
  `#1545 <https://github.com/fmtlib/fmt/issues/1545>`_,
  `#1546 <https://github.com/fmtlib/fmt/pull/1546>`_,
  `#1566 <https://github.com/fmtlib/fmt/issues/1566>`_,
  `#1582 <https://github.com/fmtlib/fmt/pull/1582>`_,
  `#1597 <https://github.com/fmtlib/fmt/issues/1597>`_,
  `#1598 <https://github.com/fmtlib/fmt/pull/1598>`_).
  Thanks `@ambitslix (Attila M. Szilagyi) <https://github.com/ambitslix>`_,
  `@jwillikers (Jordan Williams) <https://github.com/jwillikers>`_,
  `@stac47 (Laurent Stacul) <https://github.com/stac47>`_.

* Fixed various warnings and compilation issues
  (`#1433 <https://github.com/fmtlib/fmt/pull/1433>`_,
  `#1461 <https://github.com/fmtlib/fmt/issues/1461>`_,
  `#1470 <https://github.com/fmtlib/fmt/pull/1470>`_,
  `#1480 <https://github.com/fmtlib/fmt/pull/1480>`_,
  `#1485 <https://github.com/fmtlib/fmt/pull/1485>`_,
  `#1492 <https://github.com/fmtlib/fmt/pull/1492>`_,
  `#1493 <https://github.com/fmtlib/fmt/issues/1493>`_,
  `#1504 <https://github.com/fmtlib/fmt/issues/1504>`_,
  `#1505 <https://github.com/fmtlib/fmt/pull/1505>`_,
  `#1512 <https://github.com/fmtlib/fmt/pull/1512>`_,
  `#1515 <https://github.com/fmtlib/fmt/issues/1515>`_,
  `#1516 <https://github.com/fmtlib/fmt/pull/1516>`_,
  `#1518 <https://github.com/fmtlib/fmt/pull/1518>`_,
  `#1519 <https://github.com/fmtlib/fmt/pull/1519>`_,
  `#1520 <https://github.com/fmtlib/fmt/pull/1520>`_,
  `#1521 <https://github.com/fmtlib/fmt/pull/1521>`_,
  `#1522 <https://github.com/fmtlib/fmt/pull/1522>`_,
  `#1524 <https://github.com/fmtlib/fmt/issues/1524>`_,
  `#1530 <https://github.com/fmtlib/fmt/pull/1530>`_,
  `#1531 <https://github.com/fmtlib/fmt/issues/1531>`_,
  `#1532 <https://github.com/fmtlib/fmt/pull/1532>`_,
  `#1539 <https://github.com/fmtlib/fmt/issues/1539>`_,
  `#1547 <https://github.com/fmtlib/fmt/issues/1547>`_,
  `#1548 <https://github.com/fmtlib/fmt/issues/1548>`_,
  `#1554 <https://github.com/fmtlib/fmt/pull/1554>`_,
  `#1567 <https://github.com/fmtlib/fmt/issues/1567>`_,
  `#1568 <https://github.com/fmtlib/fmt/pull/1568>`_,
  `#1569 <https://github.com/fmtlib/fmt/pull/1569>`_,
  `#1571 <https://github.com/fmtlib/fmt/pull/1571>`_,
  `#1573 <https://github.com/fmtlib/fmt/pull/1573>`_,
  `#1575 <https://github.com/fmtlib/fmt/pull/1575>`_,
  `#1581 <https://github.com/fmtlib/fmt/pull/1581>`_,
  `#1583 <https://github.com/fmtlib/fmt/issues/1583>`_,
  `#1586 <https://github.com/fmtlib/fmt/issues/1586>`_,
  `#1587 <https://github.com/fmtlib/fmt/issues/1587>`_,
  `#1594 <https://github.com/fmtlib/fmt/issues/1594>`_,
  `#1596 <https://github.com/fmtlib/fmt/pull/1596>`_,
  `#1604 <https://github.com/fmtlib/fmt/issues/1604>`_,
  `#1606 <https://github.com/fmtlib/fmt/pull/1606>`_,
  `#1607 <https://github.com/fmtlib/fmt/issues/1607>`_,
  `#1609 <https://github.com/fmtlib/fmt/issues/1609>`_).
  Thanks `@marti4d (Chris Martin) <https://github.com/marti4d>`_,
  `@iPherian <https://github.com/iPherian>`_,
  `@parkertomatoes <https://github.com/parkertomatoes>`_,
  `@gsjaardema (Greg Sjaardema) <https://github.com/gsjaardema>`_,
  `@chronoxor (Ivan Shynkarenka) <https://github.com/chronoxor>`_,
  `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_,
  `@torsten48 <https://github.com/torsten48>`_,
  `@tohammer (Tobias Hammer) <https://github.com/tohammer>`_,
  `@lefticus (Jason Turner) <https://github.com/lefticus>`_,
  `@ryusakki (Haise) <https://github.com/ryusakki>`_,
  `@adnsv (Alex Denisov) <https://github.com/adnsv>`_,
  `@fghzxm <https://github.com/fghzxm>`_,
  `@refnum <https://github.com/refnum>`_,
  `@pramodk (Pramod Kumbhar) <https://github.com/pramodk>`_,
  `@Spirrwell <https://github.com/Spirrwell>`_,
  `@scramsby (Scott Ramsby) <https://github.com/scramsby>`_.

6.1.2 - 2019-12-11
------------------

* Fixed ABI compatibility with ``libfmt.so.6.0.0``
  (`#1471 <https://github.com/fmtlib/fmt/issues/1471>`_).

* Fixed handling types convertible to ``std::string_view``
  (`#1451 <https://github.com/fmtlib/fmt/pull/1451>`_).
  Thanks `@denizevrenci (Deniz Evrenci) <https://github.com/denizevrenci>`_.

* Made CUDA test an opt-in enabled via the ``FMT_CUDA_TEST`` CMake option.

* Fixed sign conversion warnings
  (`#1440 <https://github.com/fmtlib/fmt/pull/1440>`_).
  Thanks `@0x8000-0000 (Florin Iucha) <https://github.com/0x8000-0000>`_.

6.1.1 - 2019-12-04
------------------

* Fixed shared library build on Windows
  (`#1443 <https://github.com/fmtlib/fmt/pull/1443>`_,
  `#1445 <https://github.com/fmtlib/fmt/issues/1445>`_,
  `#1446 <https://github.com/fmtlib/fmt/pull/1446>`_,
  `#1450 <https://github.com/fmtlib/fmt/issues/1450>`_).
  Thanks `@egorpugin (Egor Pugin) <https://github.com/egorpugin>`_,
  `@bbolli (Beat Bolli) <https://github.com/bbolli>`_.

* Added a missing decimal point in exponent notation with trailing zeros.

* Removed deprecated ``format_arg_store::TYPES``.

6.1.0 - 2019-12-01
------------------

* {fmt} now formats IEEE 754 ``float`` and ``double`` using the shortest decimal
  representation with correct rounding by default:

  .. code:: c++

     #include <cmath>
     #include <fmt/core.h>

     int main() {
       fmt::print("{}", M_PI);
     }

  prints ``3.141592653589793``.

* Made the fast binary to decimal floating-point formatter the default,
  simplified it and improved performance. {fmt} is now 15 times faster than
  libc++'s ``std::ostringstream``, 11 times faster than ``printf`` and 10%
  faster than double-conversion on `dtoa-benchmark
  <https://github.com/fmtlib/dtoa-benchmark>`_:

  ==================  =========  =======
  Function            Time (ns)  Speedup
  ==================  =========  =======
  ostringstream        1,346.30    1.00x
  ostrstream           1,195.74    1.13x
  sprintf                995.08    1.35x
  doubleconv              99.10   13.59x
  fmt                     88.34   15.24x
  ==================  =========  =======

  .. image:: https://user-images.githubusercontent.com/576385/
             69767160-cdaca400-112f-11ea-9fc5-347c9f83caad.png

* {fmt} no longer converts ``float`` arguments to ``double``. In particular this
  improves the default (shortest) representation of floats and makes
  ``fmt::format`` consistent with ``std::format`` specs
  (`#1336 <https://github.com/fmtlib/fmt/issues/1336>`_,
  `#1353 <https://github.com/fmtlib/fmt/issues/1353>`_,
  `#1360 <https://github.com/fmtlib/fmt/pull/1360>`_,
  `#1361 <https://github.com/fmtlib/fmt/pull/1361>`_):

  .. code:: c++

     fmt::print("{}", 0.1f);

  prints ``0.1`` instead of ``0.10000000149011612``.

  Thanks `@orivej (Orivej Desh) <https://github.com/orivej>`_.

* Made floating-point formatting output consistent with ``printf``/iostreams
  (`#1376 <https://github.com/fmtlib/fmt/issues/1376>`_,
  `#1417 <https://github.com/fmtlib/fmt/issues/1417>`_).

* Added support for 128-bit integers
  (`#1287 <https://github.com/fmtlib/fmt/pull/1287>`_):

  .. code:: c++

     fmt::print("{}", std::numeric_limits<__int128_t>::max());

  prints ``170141183460469231731687303715884105727``.

  Thanks `@denizevrenci (Deniz Evrenci) <https://github.com/denizevrenci>`_.

* The overload of ``print`` that takes ``text_style`` is now atomic, i.e. the
  output from different threads doesn't interleave
  (`#1351 <https://github.com/fmtlib/fmt/pull/1351>`_).
  Thanks `@tankiJong (Tanki Zhang) <https://github.com/tankiJong>`_.

* Made compile time in the header-only mode ~20% faster by reducing the number
  of template instantiations. ``wchar_t`` overload of ``vprint`` was moved from
  ``fmt/core.h`` to ``fmt/format.h``.

* Added an overload of ``fmt::join`` that works with tuples
  (`#1322 <https://github.com/fmtlib/fmt/issues/1322>`_,
  `#1330 <https://github.com/fmtlib/fmt/pull/1330>`_):

  .. code:: c++

     #include <tuple>
     #include <fmt/ranges.h>

     int main() {
       std::tuple<char, int, float> t{'a', 1, 2.0f};
       fmt::print("{}", t);
     }

  prints ``('a', 1, 2.0)``.

  Thanks `@jeremyong (Jeremy Ong) <https://github.com/jeremyong>`_.

* Changed formatting of octal zero with prefix from "00" to "0":

  .. code:: c++

     fmt::print("{:#o}", 0);

  prints ``0``.

* The locale is now passed to ostream insertion (``<<``) operators
  (`#1406 <https://github.com/fmtlib/fmt/pull/1406>`_):

  .. code:: c++

     #include <fmt/locale.h>
     #include <fmt/ostream.h>

     struct S {
       double value;
     };

     std::ostream& operator<<(std::ostream& os, S s) {
       return os << s.value;
     }

     int main() {
       auto s = fmt::format(std::locale("fr_FR.UTF-8"), "{}", S{0.42});
       // s == "0,42"
     }

  Thanks `@dlaugt (Daniel Laügt) <https://github.com/dlaugt>`_.

* Locale-specific number formatting now uses grouping
  (`#1393 <https://github.com/fmtlib/fmt/issues/1393>`_
  `#1394 <https://github.com/fmtlib/fmt/pull/1394>`_).
  Thanks `@skrdaniel <https://github.com/skrdaniel>`_.

* Fixed handling of types with deleted implicit rvalue conversion to
  ``const char**`` (`#1421 <https://github.com/fmtlib/fmt/issues/1421>`_):

  .. code:: c++

     struct mystring {
       operator const char*() const&;
       operator const char*() &;
       operator const char*() const&& = delete;
       operator const char*() && = delete;
     };
     mystring str;
     fmt::print("{}", str); // now compiles

* Enums are now mapped to correct underlying types instead of ``int``
  (`#1286 <https://github.com/fmtlib/fmt/pull/1286>`_).
  Thanks `@agmt (Egor Seredin) <https://github.com/agmt>`_.

* Enum classes are no longer implicitly converted to ``int``
  (`#1424 <https://github.com/fmtlib/fmt/issues/1424>`_).

* Added ``basic_format_parse_context`` for consistency with C++20
  ``std::format`` and deprecated ``basic_parse_context``.

* Fixed handling of UTF-8 in precision
  (`#1389 <https://github.com/fmtlib/fmt/issues/1389>`_,
  `#1390 <https://github.com/fmtlib/fmt/pull/1390>`_).
  Thanks `@tajtiattila (Attila Tajti) <https://github.com/tajtiattila>`_.

* {fmt} can now be installed on Linux, macOS and Windows with
  `Conda <https://docs.conda.io/en/latest/>`__ using its
  `conda-forge <https://conda-forge.org>`__
  `package <https://github.com/conda-forge/fmt-feedstock>`__
  (`#1410 <https://github.com/fmtlib/fmt/pull/1410>`_)::

    conda install -c conda-forge fmt

  Thanks `@tdegeus (Tom de Geus) <https://github.com/tdegeus>`_.

* Added a CUDA test (`#1285 <https://github.com/fmtlib/fmt/pull/1285>`_,
  `#1317 <https://github.com/fmtlib/fmt/pull/1317>`_).
  Thanks `@luncliff (Park DongHa) <https://github.com/luncliff>`_ and
  `@risa2000 <https://github.com/risa2000>`_.

* Improved documentation (`#1276 <https://github.com/fmtlib/fmt/pull/1276>`_,
  `#1291 <https://github.com/fmtlib/fmt/issues/1291>`_,
  `#1296 <https://github.com/fmtlib/fmt/issues/1296>`_,
  `#1315 <https://github.com/fmtlib/fmt/pull/1315>`_,
  `#1332 <https://github.com/fmtlib/fmt/pull/1332>`_,
  `#1337 <https://github.com/fmtlib/fmt/pull/1337>`_,
  `#1395 <https://github.com/fmtlib/fmt/issues/1395>`_
  `#1418 <https://github.com/fmtlib/fmt/pull/1418>`_).
  Thanks
  `@waywardmonkeys (Bruce Mitchener) <https://github.com/waywardmonkeys>`_,
  `@pauldreik (Paul Dreik) <https://github.com/pauldreik>`_,
  `@jackoalan (Jack Andersen) <https://github.com/jackoalan>`_.

* Various code improvements
  (`#1358 <https://github.com/fmtlib/fmt/pull/1358>`_,
  `#1407 <https://github.com/fmtlib/fmt/pull/1407>`_).
  Thanks `@orivej (Orivej Desh) <https://github.com/orivej>`_,
  `@dpacbach (David P. Sicilia) <https://github.com/dpacbach>`_,

* Fixed compile-time format string checks for user-defined types
  (`#1292 <https://github.com/fmtlib/fmt/issues/1292>`_).

* Worked around a false positive in ``unsigned-integer-overflow`` sanitizer
  (`#1377 <https://github.com/fmtlib/fmt/issues/1377>`_).

* Fixed various warnings and compilation issues
  (`#1273 <https://github.com/fmtlib/fmt/issues/1273>`_,
  `#1278 <https://github.com/fmtlib/fmt/pull/1278>`_,
  `#1280 <https://github.com/fmtlib/fmt/pull/1280>`_,
  `#1281 <https://github.com/fmtlib/fmt/issues/1281>`_,
  `#1288 <https://github.com/fmtlib/fmt/issues/1288>`_,
  `#1290 <https://github.com/fmtlib/fmt/pull/1290>`_,
  `#1301 <https://github.com/fmtlib/fmt/pull/1301>`_,
  `#1305 <https://github.com/fmtlib/fmt/issues/1305>`_,
  `#1306 <https://github.com/fmtlib/fmt/issues/1306>`_,
  `#1309 <https://github.com/fmtlib/fmt/issues/1309>`_,
  `#1312 <https://github.com/fmtlib/fmt/pull/1312>`_,
  `#1313 <https://github.com/fmtlib/fmt/issues/1313>`_,
  `#1316 <https://github.com/fmtlib/fmt/issues/1316>`_,
  `#1319 <https://github.com/fmtlib/fmt/issues/1319>`_,
  `#1320 <https://github.com/fmtlib/fmt/pull/1320>`_,
  `#1326 <https://github.com/fmtlib/fmt/pull/1326>`_,
  `#1328 <https://github.com/fmtlib/fmt/pull/1328>`_,
  `#1344 <https://github.com/fmtlib/fmt/issues/1344>`_,
  `#1345 <https://github.com/fmtlib/fmt/pull/1345>`_,
  `#1347 <https://github.com/fmtlib/fmt/pull/1347>`_,
  `#1349 <https://github.com/fmtlib/fmt/pull/1349>`_,
  `#1354 <https://github.com/fmtlib/fmt/issues/1354>`_,
  `#1362 <https://github.com/fmtlib/fmt/issues/1362>`_,
  `#1366 <https://github.com/fmtlib/fmt/issues/1366>`_,
  `#1364 <https://github.com/fmtlib/fmt/pull/1364>`_,
  `#1370 <https://github.com/fmtlib/fmt/pull/1370>`_,
  `#1371 <https://github.com/fmtlib/fmt/pull/1371>`_,
  `#1385 <https://github.com/fmtlib/fmt/issues/1385>`_,
  `#1388 <https://github.com/fmtlib/fmt/issues/1388>`_,
  `#1397 <https://github.com/fmtlib/fmt/pull/1397>`_,
  `#1414 <https://github.com/fmtlib/fmt/pull/1414>`_,
  `#1416 <https://github.com/fmtlib/fmt/pull/1416>`_,
  `#1422 <https://github.com/fmtlib/fmt/issues/1422>`_
  `#1427 <https://github.com/fmtlib/fmt/pull/1427>`_,
  `#1431 <https://github.com/fmtlib/fmt/issues/1431>`_,
  `#1433 <https://github.com/fmtlib/fmt/pull/1433>`_).
  Thanks `@hhb <https://github.com/hhb>`_,
  `@gsjaardema (Greg Sjaardema) <https://github.com/gsjaardema>`_,
  `@gabime (Gabi Melman) <https://github.com/gabime>`_,
  `@neheb (Rosen Penev) <https://github.com/neheb>`_,
  `@vedranmiletic (Vedran Miletić) <https://github.com/vedranmiletic>`_,
  `@dkavolis (Daumantas Kavolis) <https://github.com/dkavolis>`_,
  `@mwinterb <https://github.com/mwinterb>`_,
  `@orivej (Orivej Desh) <https://github.com/orivej>`_,
  `@denizevrenci (Deniz Evrenci) <https://github.com/denizevrenci>`_
  `@leonklingele <https://github.com/leonklingele>`_,
  `@chronoxor (Ivan Shynkarenka) <https://github.com/chronoxor>`_,
  `@kent-tri <https://github.com/kent-tri>`_,
  `@0x8000-0000 (Florin Iucha) <https://github.com/0x8000-0000>`_,
  `@marti4d (Chris Martin) <https://github.com/marti4d>`_.

6.0.0 - 2019-08-26
------------------

* Switched to the `MIT license
  <https://github.com/fmtlib/fmt/blob/5a4b24613ba16cc689977c3b5bd8274a3ba1dd1f/LICENSE.rst>`_
  with an optional exception that allows distributing binary code without
  attribution.

* Floating-point formatting is now locale-independent by default:

  .. code:: c++

     #include <locale>
     #include <fmt/core.h>

     int main() {
       std::locale::global(std::locale("ru_RU.UTF-8"));
       fmt::print("value = {}", 4.2);
     }

  prints "value = 4.2" regardless of the locale.

  For locale-specific formatting use the ``n`` specifier:

  .. code:: c++

     std::locale::global(std::locale("ru_RU.UTF-8"));
     fmt::print("value = {:n}", 4.2);

  prints "value = 4,2".

* Added an experimental Grisu floating-point formatting algorithm
  implementation (disabled by default). To enable it compile with the
  ``FMT_USE_GRISU`` macro defined to 1:

  .. code:: c++

     #define FMT_USE_GRISU 1
     #include <fmt/format.h>

     auto s = fmt::format("{}", 4.2); // formats 4.2 using Grisu

  With Grisu enabled, {fmt} is 13x faster than ``std::ostringstream`` (libc++)
  and 10x faster than ``sprintf`` on `dtoa-benchmark
  <https://github.com/fmtlib/dtoa-benchmark>`_ (`full results
  <https://fmt.dev/unknown_mac64_clang10.0.html>`_):

  .. image:: https://user-images.githubusercontent.com/576385/
             54883977-9fe8c000-4e28-11e9-8bde-272d122e7c52.jpg

* Separated formatting and parsing contexts for consistency with
  `C++20 std::format <http://eel.is/c++draft/format>`_, removing the
  undocumented ``basic_format_context::parse_context()`` function.

* Added `oss-fuzz <https://github.com/google/oss-fuzz>`_ support
  (`#1199 <https://github.com/fmtlib/fmt/pull/1199>`_).
  Thanks `@pauldreik (Paul Dreik) <https://github.com/pauldreik>`_.

* ``formatter`` specializations now always take precedence over ``operator<<``
  (`#952 <https://github.com/fmtlib/fmt/issues/952>`_):

  .. code:: c++

     #include <iostream>
     #include <fmt/ostream.h>

     struct S {};

     std::ostream& operator<<(std::ostream& os, S) {
       return os << 1;
     }

     template <>
     struct fmt::formatter<S> : fmt::formatter<int> {
       auto format(S, format_context& ctx) {
         return formatter<int>::format(2, ctx);
       }
     };

     int main() {
       std::cout << S() << "\n"; // prints 1 using operator<<
       fmt::print("{}\n", S());  // prints 2 using formatter
     }

* Introduced the experimental ``fmt::compile`` function that does format string
  compilation (`#618 <https://github.com/fmtlib/fmt/issues/618>`_,
  `#1169 <https://github.com/fmtlib/fmt/issues/1169>`_,
  `#1171 <https://github.com/fmtlib/fmt/pull/1171>`_):

  .. code:: c++

     #include <fmt/compile.h>

     auto f = fmt::compile<int>("{}");
     std::string s = fmt::format(f, 42); // can be called multiple times to
                                         // format different values
     // s == "42"

  It moves the cost of parsing a format string outside of the format function
  which can be beneficial when identically formatting many objects of the same
  types. Thanks `@stryku (Mateusz Janek) <https://github.com/stryku>`_.

* Added experimental ``%`` format specifier that formats floating-point values
  as percentages (`#1060 <https://github.com/fmtlib/fmt/pull/1060>`_,
  `#1069 <https://github.com/fmtlib/fmt/pull/1069>`_,
  `#1071 <https://github.com/fmtlib/fmt/pull/1071>`_):

  .. code:: c++

     auto s = fmt::format("{:.1%}", 0.42); // s == "42.0%"

  Thanks `@gawain-bolton (Gawain Bolton) <https://github.com/gawain-bolton>`_.

* Implemented precision for floating-point durations
  (`#1004 <https://github.com/fmtlib/fmt/issues/1004>`_,
  `#1012 <https://github.com/fmtlib/fmt/pull/1012>`_):

  .. code:: c++

     auto s = fmt::format("{:.1}", std::chrono::duration<double>(1.234));
     // s == 1.2s

  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.

* Implemented ``chrono`` format specifiers ``%Q`` and ``%q`` that give the value
  and the unit respectively (`#1019 <https://github.com/fmtlib/fmt/pull/1019>`_):

  .. code:: c++

     auto value = fmt::format("{:%Q}", 42s); // value == "42"
     auto unit  = fmt::format("{:%q}", 42s); // unit == "s"

  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.

* Fixed handling of dynamic width in chrono formatter:

  .. code:: c++

     auto s = fmt::format("{0:{1}%H:%M:%S}", std::chrono::seconds(12345), 12);
     //                        ^ width argument index                     ^ width
     // s == "03:25:45    "

  Thanks Howard Hinnant.

* Removed deprecated ``fmt/time.h``. Use ``fmt/chrono.h`` instead.

* Added ``fmt::format`` and ``fmt::vformat`` overloads that take ``text_style``
  (`#993 <https://github.com/fmtlib/fmt/issues/993>`_,
  `#994 <https://github.com/fmtlib/fmt/pull/994>`_):

  .. code:: c++

     #include <fmt/color.h>

     std::string message = fmt::format(fmt::emphasis::bold | fg(fmt::color::red),
                                       "The answer is {}.", 42);

  Thanks `@Naios (Denis Blank) <https://github.com/Naios>`_.

* Removed the deprecated color API (``print_colored``). Use the new API, namely
  ``print`` overloads that take ``text_style`` instead.

* Made ``std::unique_ptr`` and ``std::shared_ptr`` formattable as pointers via
  ``fmt::ptr`` (`#1121 <https://github.com/fmtlib/fmt/pull/1121>`_):

  .. code:: c++

     std::unique_ptr<int> p = ...;
     fmt::print("{}", fmt::ptr(p)); // prints p as a pointer

  Thanks `@sighingnow (Tao He) <https://github.com/sighingnow>`_.

* Made ``print`` and ``vprint`` report I/O errors
  (`#1098 <https://github.com/fmtlib/fmt/issues/1098>`_,
  `#1099 <https://github.com/fmtlib/fmt/pull/1099>`_).
  Thanks `@BillyDonahue (Billy Donahue) <https://github.com/BillyDonahue>`_.

* Marked deprecated APIs with the ``[[deprecated]]`` attribute and removed
  internal uses of deprecated APIs
  (`#1022 <https://github.com/fmtlib/fmt/pull/1022>`_).
  Thanks `@eliaskosunen (Elias Kosunen) <https://github.com/eliaskosunen>`_.

* Modernized the codebase using more C++11 features and removing workarounds.
  Most importantly, ``buffer_context`` is now an alias template, so
  use ``buffer_context<T>`` instead of ``buffer_context<T>::type``.
  These features require GCC 4.8 or later.

* ``formatter`` specializations now always take precedence over implicit
  conversions to ``int`` and the undocumented ``convert_to_int`` trait
  is now deprecated.

* Moved the undocumented ``basic_writer``, ``writer``, and ``wwriter`` types
  to the ``internal`` namespace.

* Removed deprecated ``basic_format_context::begin()``. Use ``out()`` instead.

* Disallowed passing the result of ``join`` as an lvalue to prevent misuse.

* Refactored the undocumented structs that represent parsed format specifiers
  to simplify the API and allow multibyte fill.

* Moved SFINAE to template parameters to reduce symbol sizes.

* Switched to ``fputws`` for writing wide strings so that it's no longer
  required to call ``_setmode`` on Windows
  (`#1229 <https://github.com/fmtlib/fmt/issues/1229>`_,
  `#1243 <https://github.com/fmtlib/fmt/pull/1243>`_).
  Thanks `@jackoalan (Jack Andersen) <https://github.com/jackoalan>`_.

* Improved literal-based API
  (`#1254 <https://github.com/fmtlib/fmt/pull/1254>`_).
  Thanks `@sylveon (Charles Milette) <https://github.com/sylveon>`_.

* Added support for exotic platforms without ``uintptr_t`` such as IBM i
  (AS/400) which has 128-bit pointers and only 64-bit integers
  (`#1059 <https://github.com/fmtlib/fmt/issues/1059>`_).

* Added `Sublime Text syntax highlighting config
  <https://github.com/fmtlib/fmt/blob/master/support/C%2B%2B.sublime-syntax>`_
  (`#1037 <https://github.com/fmtlib/fmt/issues/1037>`_).
  Thanks `@Kronuz (Germán Méndez Bravo) <https://github.com/Kronuz>`_.

* Added the ``FMT_ENFORCE_COMPILE_STRING`` macro to enforce the use of
  compile-time format strings
  (`#1231 <https://github.com/fmtlib/fmt/pull/1231>`_).
  Thanks `@jackoalan (Jack Andersen) <https://github.com/jackoalan>`_.

* Stopped setting ``CMAKE_BUILD_TYPE`` if {fmt} is a subproject
  (`#1081 <https://github.com/fmtlib/fmt/issues/1081>`_).

* Various build improvements
  (`#1039 <https://github.com/fmtlib/fmt/pull/1039>`_,
  `#1078 <https://github.com/fmtlib/fmt/pull/1078>`_,
  `#1091 <https://github.com/fmtlib/fmt/pull/1091>`_,
  `#1103 <https://github.com/fmtlib/fmt/pull/1103>`_,
  `#1177 <https://github.com/fmtlib/fmt/pull/1177>`_).
  Thanks `@luncliff (Park DongHa) <https://github.com/luncliff>`_,
  `@jasonszang (Jason Shuo Zang) <https://github.com/jasonszang>`_,
  `@olafhering (Olaf Hering) <https://github.com/olafhering>`_,
  `@Lecetem <https://github.com/Lectem>`_,
  `@pauldreik (Paul Dreik) <https://github.com/pauldreik>`_.

* Improved documentation
  (`#1049 <https://github.com/fmtlib/fmt/issues/1049>`_,
  `#1051 <https://github.com/fmtlib/fmt/pull/1051>`_,
  `#1083 <https://github.com/fmtlib/fmt/pull/1083>`_,
  `#1113 <https://github.com/fmtlib/fmt/pull/1113>`_,
  `#1114 <https://github.com/fmtlib/fmt/pull/1114>`_,
  `#1146 <https://github.com/fmtlib/fmt/issues/1146>`_,
  `#1180 <https://github.com/fmtlib/fmt/issues/1180>`_,
  `#1250 <https://github.com/fmtlib/fmt/pull/1250>`_,
  `#1252 <https://github.com/fmtlib/fmt/pull/1252>`_,
  `#1265 <https://github.com/fmtlib/fmt/pull/1265>`_).
  Thanks `@mikelui (Michael Lui) <https://github.com/mikelui>`_,
  `@foonathan (Jonathan Müller) <https://github.com/foonathan>`_,
  `@BillyDonahue (Billy Donahue) <https://github.com/BillyDonahue>`_,
  `@jwakely (Jonathan Wakely) <https://github.com/jwakely>`_,
  `@kaisbe (Kais Ben Salah) <https://github.com/kaisbe>`_,
  `@sdebionne (Samuel Debionne) <https://github.com/sdebionne>`_.

* Fixed ambiguous formatter specialization in ``fmt/ranges.h``
  (`#1123 <https://github.com/fmtlib/fmt/issues/1123>`_).

* Fixed formatting of a non-empty ``std::filesystem::path`` which is an
  infinitely deep range of its components
  (`#1268 <https://github.com/fmtlib/fmt/issues/1268>`_).

* Fixed handling of general output iterators when formatting characters
  (`#1056 <https://github.com/fmtlib/fmt/issues/1056>`_,
  `#1058 <https://github.com/fmtlib/fmt/pull/1058>`_).
  Thanks `@abolz (Alexander Bolz) <https://github.com/abolz>`_.

* Fixed handling of output iterators in ``formatter`` specialization for
  ranges (`#1064 <https://github.com/fmtlib/fmt/issues/1064>`_).

* Fixed handling of exotic character types
  (`#1188 <https://github.com/fmtlib/fmt/issues/1188>`_).

* Made chrono formatting work with exceptions disabled
  (`#1062 <https://github.com/fmtlib/fmt/issues/1062>`_).

* Fixed DLL visibility issues
  (`#1134 <https://github.com/fmtlib/fmt/pull/1134>`_,
  `#1147 <https://github.com/fmtlib/fmt/pull/1147>`_).
  Thanks `@denchat <https://github.com/denchat>`_.

* Disabled the use of UDL template extension on GCC 9
  (`#1148 <https://github.com/fmtlib/fmt/issues/1148>`_).

* Removed misplaced ``format`` compile-time checks from ``printf``
  (`#1173 <https://github.com/fmtlib/fmt/issues/1173>`_).

* Fixed issues in the experimental floating-point formatter
  (`#1072 <https://github.com/fmtlib/fmt/issues/1072>`_,
  `#1129 <https://github.com/fmtlib/fmt/issues/1129>`_,
  `#1153 <https://github.com/fmtlib/fmt/issues/1153>`_,
  `#1155 <https://github.com/fmtlib/fmt/pull/1155>`_,
  `#1210 <https://github.com/fmtlib/fmt/issues/1210>`_,
  `#1222 <https://github.com/fmtlib/fmt/issues/1222>`_).
  Thanks `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_.

* Fixed bugs discovered by fuzzing or during fuzzing integration
  (`#1124 <https://github.com/fmtlib/fmt/issues/1124>`_,
  `#1127 <https://github.com/fmtlib/fmt/issues/1127>`_,
  `#1132 <https://github.com/fmtlib/fmt/issues/1132>`_,
  `#1135 <https://github.com/fmtlib/fmt/pull/1135>`_,
  `#1136 <https://github.com/fmtlib/fmt/issues/1136>`_,
  `#1141 <https://github.com/fmtlib/fmt/issues/1141>`_,
  `#1142 <https://github.com/fmtlib/fmt/issues/1142>`_,
  `#1178 <https://github.com/fmtlib/fmt/issues/1178>`_,
  `#1179 <https://github.com/fmtlib/fmt/issues/1179>`_,
  `#1194 <https://github.com/fmtlib/fmt/issues/1194>`_).
  Thanks `@pauldreik (Paul Dreik) <https://github.com/pauldreik>`_.

* Fixed building tests on FreeBSD and Hurd
  (`#1043 <https://github.com/fmtlib/fmt/issues/1043>`_).
  Thanks `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.

* Fixed various warnings and compilation issues
  (`#998 <https://github.com/fmtlib/fmt/pull/998>`_,
  `#1006 <https://github.com/fmtlib/fmt/pull/1006>`_,
  `#1008 <https://github.com/fmtlib/fmt/issues/1008>`_,
  `#1011 <https://github.com/fmtlib/fmt/issues/1011>`_,
  `#1025 <https://github.com/fmtlib/fmt/issues/1025>`_,
  `#1027 <https://github.com/fmtlib/fmt/pull/1027>`_,
  `#1028 <https://github.com/fmtlib/fmt/pull/1028>`_,
  `#1029 <https://github.com/fmtlib/fmt/pull/1029>`_,
  `#1030 <https://github.com/fmtlib/fmt/pull/1030>`_,
  `#1031 <https://github.com/fmtlib/fmt/pull/1031>`_,
  `#1054 <https://github.com/fmtlib/fmt/pull/1054>`_,
  `#1063 <https://github.com/fmtlib/fmt/issues/1063>`_,
  `#1068 <https://github.com/fmtlib/fmt/pull/1068>`_,
  `#1074 <https://github.com/fmtlib/fmt/pull/1074>`_,
  `#1075 <https://github.com/fmtlib/fmt/pull/1075>`_,
  `#1079 <https://github.com/fmtlib/fmt/pull/1079>`_,
  `#1086 <https://github.com/fmtlib/fmt/pull/1086>`_,
  `#1088 <https://github.com/fmtlib/fmt/issues/1088>`_,
  `#1089 <https://github.com/fmtlib/fmt/pull/1089>`_,
  `#1094 <https://github.com/fmtlib/fmt/pull/1094>`_,
  `#1101 <https://github.com/fmtlib/fmt/issues/1101>`_,
  `#1102 <https://github.com/fmtlib/fmt/pull/1102>`_,
  `#1105 <https://github.com/fmtlib/fmt/issues/1105>`_,
  `#1107 <https://github.com/fmtlib/fmt/pull/1107>`_,
  `#1115 <https://github.com/fmtlib/fmt/issues/1115>`_,
  `#1117 <https://github.com/fmtlib/fmt/issues/1117>`_,
  `#1118 <https://github.com/fmtlib/fmt/issues/1118>`_,
  `#1120 <https://github.com/fmtlib/fmt/issues/1120>`_,
  `#1123 <https://github.com/fmtlib/fmt/issues/1123>`_,
  `#1139 <https://github.com/fmtlib/fmt/pull/1139>`_,
  `#1140 <https://github.com/fmtlib/fmt/issues/1140>`_,
  `#1143 <https://github.com/fmtlib/fmt/issues/1143>`_,
  `#1144 <https://github.com/fmtlib/fmt/pull/1144>`_,
  `#1150 <https://github.com/fmtlib/fmt/pull/1150>`_,
  `#1151 <https://github.com/fmtlib/fmt/pull/1151>`_,
  `#1152 <https://github.com/fmtlib/fmt/issues/1152>`_,
  `#1154 <https://github.com/fmtlib/fmt/issues/1154>`_,
  `#1156 <https://github.com/fmtlib/fmt/issues/1156>`_,
  `#1159 <https://github.com/fmtlib/fmt/pull/1159>`_,
  `#1175 <https://github.com/fmtlib/fmt/issues/1175>`_,
  `#1181 <https://github.com/fmtlib/fmt/issues/1181>`_,
  `#1186 <https://github.com/fmtlib/fmt/issues/1186>`_,
  `#1187 <https://github.com/fmtlib/fmt/pull/1187>`_,
  `#1191 <https://github.com/fmtlib/fmt/pull/1191>`_,
  `#1197 <https://github.com/fmtlib/fmt/issues/1197>`_,
  `#1200 <https://github.com/fmtlib/fmt/issues/1200>`_,
  `#1203 <https://github.com/fmtlib/fmt/issues/1203>`_,
  `#1205 <https://github.com/fmtlib/fmt/issues/1205>`_,
  `#1206 <https://github.com/fmtlib/fmt/pull/1206>`_,
  `#1213 <https://github.com/fmtlib/fmt/issues/1213>`_,
  `#1214 <https://github.com/fmtlib/fmt/issues/1214>`_,
  `#1217 <https://github.com/fmtlib/fmt/pull/1217>`_,
  `#1228 <https://github.com/fmtlib/fmt/issues/1228>`_,
  `#1230 <https://github.com/fmtlib/fmt/pull/1230>`_,
  `#1232 <https://github.com/fmtlib/fmt/issues/1232>`_,
  `#1235 <https://github.com/fmtlib/fmt/pull/1235>`_,
  `#1236 <https://github.com/fmtlib/fmt/pull/1236>`_,
  `#1240 <https://github.com/fmtlib/fmt/issues/1240>`_).
  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_,
  `@mwinterb <https://github.com/mwinterb>`_,
  `@eliaskosunen (Elias Kosunen) <https://github.com/eliaskosunen>`_,
  `@morinmorin <https://github.com/morinmorin>`_,
  `@ricco19 (Brian Ricciardelli) <https://github.com/ricco19>`_,
  `@waywardmonkeys (Bruce Mitchener) <https://github.com/waywardmonkeys>`_,
  `@chronoxor (Ivan Shynkarenka) <https://github.com/chronoxor>`_,
  `@remyabel <https://github.com/remyabel>`_,
  `@pauldreik (Paul Dreik) <https://github.com/pauldreik>`_,
  `@gsjaardema (Greg Sjaardema) <https://github.com/gsjaardema>`_,
  `@rcane (Ronny Krüger) <https://github.com/rcane>`_,
  `@mocabe <https://github.com/mocabe>`_,
  `@denchat <https://github.com/denchat>`_,
  `@cjdb (Christopher Di Bella) <https://github.com/cjdb>`_,
  `@HazardyKnusperkeks (Björn Schäpers) <https://github.com/HazardyKnusperkeks>`_,
  `@vedranmiletic (Vedran Miletić) <https://github.com/vedranmiletic>`_,
  `@jackoalan (Jack Andersen) <https://github.com/jackoalan>`_,
  `@DaanDeMeyer (Daan De Meyer) <https://github.com/DaanDeMeyer>`_,
  `@starkmapper (Mark Stapper) <https://github.com/starkmapper>`_.

5.3.0 - 2018-12-28
------------------

* Introduced experimental chrono formatting support:

  .. code:: c++

     #include <fmt/chrono.h>

     int main() {
       using namespace std::literals::chrono_literals;
       fmt::print("Default format: {} {}\n", 42s, 100ms);
       fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s);
     }

  prints::

     Default format: 42s 100ms
     strftime-like format: 03:15:30

* Added experimental support for emphasis (bold, italic, underline,
  strikethrough), colored output to a file stream, and improved colored
  formatting API
  (`#961 <https://github.com/fmtlib/fmt/pull/961>`_,
  `#967 <https://github.com/fmtlib/fmt/pull/967>`_,
  `#973 <https://github.com/fmtlib/fmt/pull/973>`_):

  .. code:: c++

     #include <fmt/color.h>

     int main() {
       print(fg(fmt::color::crimson) | fmt::emphasis::bold,
             "Hello, {}!\n", "world");
       print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) |
             fmt::emphasis::underline, "Hello, {}!\n", "мир");
       print(fg(fmt::color::steel_blue) | fmt::emphasis::italic,
             "Hello, {}!\n", "世界");
     }

  prints the following on modern terminals with RGB color support:

  .. image:: https://user-images.githubusercontent.com/576385/
             50405788-b66e7500-076e-11e9-9592-7324d1f951d8.png

  Thanks `@Rakete1111 (Nicolas) <https://github.com/Rakete1111>`_.

* Added support for 4-bit terminal colors
  (`#968 <https://github.com/fmtlib/fmt/issues/968>`_,
  `#974 <https://github.com/fmtlib/fmt/pull/974>`_)

  .. code:: c++

     #include <fmt/color.h>

     int main() {
       print(fg(fmt::terminal_color::red), "stop\n");
     }

  Note that these colors vary by terminal:

  .. image:: https://user-images.githubusercontent.com/576385/
             50405925-dbfc7e00-0770-11e9-9b85-333fab0af9ac.png

  Thanks `@Rakete1111 (Nicolas) <https://github.com/Rakete1111>`_.

* Parameterized formatting functions on the type of the format string
  (`#880 <https://github.com/fmtlib/fmt/issues/880>`_,
  `#881 <https://github.com/fmtlib/fmt/pull/881>`_,
  `#883 <https://github.com/fmtlib/fmt/pull/883>`_,
  `#885 <https://github.com/fmtlib/fmt/pull/885>`_,
  `#897 <https://github.com/fmtlib/fmt/pull/897>`_,
  `#920 <https://github.com/fmtlib/fmt/issues/920>`_).
  Any object of type ``S`` that has an overloaded ``to_string_view(const S&)``
  returning ``fmt::string_view`` can be used as a format string:

  .. code:: c++

     namespace my_ns {
     inline string_view to_string_view(const my_string& s) {
       return {s.data(), s.length()};
     }
     }

     std::string message = fmt::format(my_string("The answer is {}."), 42);

  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.

* Made ``std::string_view`` work as a format string
  (`#898 <https://github.com/fmtlib/fmt/pull/898>`_):

  .. code:: c++

     auto message = fmt::format(std::string_view("The answer is {}."), 42);

  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.

* Added wide string support to compile-time format string checks
  (`#924 <https://github.com/fmtlib/fmt/pull/924>`_):

  .. code:: c++

     print(fmt(L"{:f}"), 42); // compile-time error: invalid type specifier

  Thanks `@XZiar <https://github.com/XZiar>`_.

* Made colored print functions work with wide strings
  (`#867 <https://github.com/fmtlib/fmt/pull/867>`_):

  .. code:: c++

     #include <fmt/color.h>

     int main() {
       print(fg(fmt::color::red), L"{}\n", 42);
     }

  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.

* Introduced experimental Unicode support
  (`#628 <https://github.com/fmtlib/fmt/issues/628>`_,
  `#891 <https://github.com/fmtlib/fmt/pull/891>`_):

  .. code:: c++

     using namespace fmt::literals;
     auto s = fmt::format("{:*^5}"_u, "🤡"_u); // s == "**🤡**"_u

* Improved locale support:

  .. code:: c++

     #include <fmt/locale.h>

     struct numpunct : std::numpunct<char> {
      protected:
       char do_thousands_sep() const override { return '~'; }
     };

     std::locale loc;
     auto s = fmt::format(std::locale(loc, new numpunct()), "{:n}", 1234567);
     // s == "1~234~567"

* Constrained formatting functions on proper iterator types
  (`#921 <https://github.com/fmtlib/fmt/pull/921>`_).
  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.

* Added ``make_printf_args`` and ``make_wprintf_args`` functions
  (`#934 <https://github.com/fmtlib/fmt/pull/934>`_).
  Thanks `@tnovotny <https://github.com/tnovotny>`_.

* Deprecated ``fmt::visit``, ``parse_context``, and ``wparse_context``.
  Use ``fmt::visit_format_arg``, ``format_parse_context``, and
  ``wformat_parse_context`` instead.

* Removed undocumented ``basic_fixed_buffer`` which has been superseded by the
  iterator-based API
  (`#873 <https://github.com/fmtlib/fmt/issues/873>`_,
  `#902 <https://github.com/fmtlib/fmt/pull/902>`_).
  Thanks `@superfunc (hollywood programmer) <https://github.com/superfunc>`_.

* Disallowed repeated leading zeros in an argument ID:

  .. code:: c++

     fmt::print("{000}", 42); // error

* Reintroduced support for gcc 4.4.

* Fixed compilation on platforms with exotic ``double``
  (`#878 <https://github.com/fmtlib/fmt/issues/878>`_).

* Improved documentation
  (`#164 <https://github.com/fmtlib/fmt/issues/164>`_,
  `#877 <https://github.com/fmtlib/fmt/issues/877>`_,
  `#901 <https://github.com/fmtlib/fmt/pull/901>`_,
  `#906 <https://github.com/fmtlib/fmt/pull/906>`_,
  `#979 <https://github.com/fmtlib/fmt/pull/979>`_).
  Thanks `@kookjr (Mathew Cucuzella) <https://github.com/kookjr>`_,
  `@DarkDimius (Dmitry Petrashko) <https://github.com/DarkDimius>`_,
  `@HecticSerenity <https://github.com/HecticSerenity>`_.

* Added pkgconfig support which makes it easier to consume the library from
  meson and other build systems
  (`#916 <https://github.com/fmtlib/fmt/pull/916>`_).
  Thanks `@colemickens (Cole Mickens) <https://github.com/colemickens>`_.

* Various build improvements
  (`#909 <https://github.com/fmtlib/fmt/pull/909>`_,
  `#926 <https://github.com/fmtlib/fmt/pull/926>`_,
  `#937 <https://github.com/fmtlib/fmt/pull/937>`_,
  `#953 <https://github.com/fmtlib/fmt/pull/953>`_,
  `#959 <https://github.com/fmtlib/fmt/pull/959>`_).
  Thanks `@tchaikov (Kefu Chai) <https://github.com/tchaikov>`_,
  `@luncliff (Park DongHa) <https://github.com/luncliff>`_,
  `@AndreasSchoenle (Andreas Schönle) <https://github.com/AndreasSchoenle>`_,
  `@hotwatermorning <https://github.com/hotwatermorning>`_,
  `@Zefz (JohanJansen) <https://github.com/Zefz>`_.

* Improved ``string_view`` construction performance
  (`#914 <https://github.com/fmtlib/fmt/pull/914>`_).
  Thanks `@gabime (Gabi Melman) <https://github.com/gabime>`_.

* Fixed non-matching char types
  (`#895 <https://github.com/fmtlib/fmt/pull/895>`_).
  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.

* Fixed ``format_to_n`` with ``std::back_insert_iterator``
  (`#913 <https://github.com/fmtlib/fmt/pull/913>`_).
  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.

* Fixed locale-dependent formatting
  (`#905 <https://github.com/fmtlib/fmt/issues/905>`_).

* Fixed various compiler warnings and errors
  (`#882 <https://github.com/fmtlib/fmt/pull/882>`_,
  `#886 <https://github.com/fmtlib/fmt/pull/886>`_,
  `#933 <https://github.com/fmtlib/fmt/pull/933>`_,
  `#941 <https://github.com/fmtlib/fmt/pull/941>`_,
  `#931 <https://github.com/fmtlib/fmt/issues/931>`_,
  `#943 <https://github.com/fmtlib/fmt/pull/943>`_,
  `#954 <https://github.com/fmtlib/fmt/pull/954>`_,
  `#956 <https://github.com/fmtlib/fmt/pull/956>`_,
  `#962 <https://github.com/fmtlib/fmt/pull/962>`_,
  `#965 <https://github.com/fmtlib/fmt/issues/965>`_,
  `#977 <https://github.com/fmtlib/fmt/issues/977>`_,
  `#983 <https://github.com/fmtlib/fmt/pull/983>`_,
  `#989 <https://github.com/fmtlib/fmt/pull/989>`_).
  Thanks `@Luthaf (Guillaume Fraux) <https://github.com/Luthaf>`_,
  `@stevenhoving (Steven Hoving) <https://github.com/stevenhoving>`_,
  `@christinaa (Kristina Brooks) <https://github.com/christinaa>`_,
  `@lgritz (Larry Gritz) <https://github.com/lgritz>`_,
  `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_,
  `@0x8000-0000 (Sign Bit) <https://github.com/0x8000-0000>`_,
  `@liuping1997 <https://github.com/liuping1997>`_.

5.2.1 - 2018-09-21
------------------

* Fixed ``visit`` lookup issues on gcc 7 & 8
  (`#870 <https://github.com/fmtlib/fmt/pull/870>`_).
  Thanks `@medithe <https://github.com/medithe>`_.

* Fixed linkage errors on older gcc.

* Prevented ``fmt/range.h`` from specializing ``fmt::basic_string_view``
  (`#865 <https://github.com/fmtlib/fmt/issues/865>`_,
  `#868 <https://github.com/fmtlib/fmt/pull/868>`_).
  Thanks `@hhggit (dual) <https://github.com/hhggit>`_.

* Improved error message when formatting unknown types
  (`#872 <https://github.com/fmtlib/fmt/pull/872>`_).
  Thanks `@foonathan (Jonathan Müller) <https://github.com/foonathan>`_,

* Disabled templated user-defined literals when compiled under nvcc
  (`#875 <https://github.com/fmtlib/fmt/pull/875>`_).
  Thanks `@CandyGumdrop (Candy Gumdrop) <https://github.com/CandyGumdrop>`_,

* Fixed ``format_to`` formatting to ``wmemory_buffer``
  (`#874 <https://github.com/fmtlib/fmt/issues/874>`_).

5.2.0 - 2018-09-13
------------------

* Optimized format string parsing and argument processing which resulted in up
  to 5x speed up on long format strings and significant performance boost on
  various benchmarks. For example, version 5.2 is 2.22x faster than 5.1 on
  decimal integer formatting with ``format_to`` (macOS, clang-902.0.39.2):

  ==================  =======  =======
  Method              Time, s  Speedup
  ==================  =======  =======
  fmt::format 5.1      0.58
  fmt::format 5.2      0.35     1.66x
  fmt::format_to 5.1   0.51
  fmt::format_to 5.2   0.23     2.22x
  sprintf              0.71
  std::to_string       1.01
  std::stringstream    1.73
  ==================  =======  =======

* Changed the ``fmt`` macro from opt-out to opt-in to prevent name collisions.
  To enable it define the ``FMT_STRING_ALIAS`` macro to 1 before including
  ``fmt/format.h``:

  .. code:: c++

     #define FMT_STRING_ALIAS 1
     #include <fmt/format.h>
     std::string answer = format(fmt("{}"), 42);

* Added compile-time format string checks to ``format_to`` overload that takes
  ``fmt::memory_buffer`` (`#783 <https://github.com/fmtlib/fmt/issues/783>`_):

  .. code:: c++

     fmt::memory_buffer buf;
     // Compile-time error: invalid type specifier.
     fmt::format_to(buf, fmt("{:d}"), "foo");

* Moved experimental color support to ``fmt/color.h`` and enabled the
  new API by default. The old API can be enabled by defining the
  ``FMT_DEPRECATED_COLORS`` macro.

* Added formatting support for types explicitly convertible to
  ``fmt::string_view``:

  .. code:: c++

     struct foo {
       explicit operator fmt::string_view() const { return "foo"; }
     };
     auto s = format("{}", foo());

  In particular, this makes formatting function work with
  ``folly::StringPiece``.

* Implemented preliminary support for ``char*_t`` by replacing the ``format``
  function overloads with a single function template parameterized on the string
  type.

* Added support for dynamic argument lists
  (`#814 <https://github.com/fmtlib/fmt/issues/814>`_,
  `#819 <https://github.com/fmtlib/fmt/pull/819>`_).
  Thanks `@MikePopoloski (Michael Popoloski)
  <https://github.com/MikePopoloski>`_.

* Reduced executable size overhead for embedded targets using newlib nano by
  making locale dependency optional
  (`#839 <https://github.com/fmtlib/fmt/pull/839>`_).
  Thanks `@teajay-fr (Thomas Benard) <https://github.com/teajay-fr>`_.

* Keep ``noexcept`` specifier when exceptions are disabled
  (`#801 <https://github.com/fmtlib/fmt/issues/801>`_,
  `#810 <https://github.com/fmtlib/fmt/pull/810>`_).
  Thanks `@qis (Alexej Harm) <https://github.com/qis>`_.

* Fixed formatting of user-defined types providing ``operator<<`` with
  ``format_to_n``
  (`#806 <https://github.com/fmtlib/fmt/pull/806>`_).
  Thanks `@mkurdej (Marek Kurdej) <https://github.com/mkurdej>`_.

* Fixed dynamic linkage of new symbols
  (`#808 <https://github.com/fmtlib/fmt/issues/808>`_).

* Fixed global initialization issue
  (`#807 <https://github.com/fmtlib/fmt/issues/807>`_):

  .. code:: c++

     // This works on compilers with constexpr support.
     static const std::string answer = fmt::format("{}", 42);

* Fixed various compiler warnings and errors
  (`#804 <https://github.com/fmtlib/fmt/pull/804>`_,
  `#809 <https://github.com/fmtlib/fmt/issues/809>`_,
  `#811 <https://github.com/fmtlib/fmt/pull/811>`_,
  `#822 <https://github.com/fmtlib/fmt/issues/822>`_,
  `#827 <https://github.com/fmtlib/fmt/pull/827>`_,
  `#830 <https://github.com/fmtlib/fmt/issues/830>`_,
  `#838 <https://github.com/fmtlib/fmt/pull/838>`_,
  `#843 <https://github.com/fmtlib/fmt/issues/843>`_,
  `#844 <https://github.com/fmtlib/fmt/pull/844>`_,
  `#851 <https://github.com/fmtlib/fmt/issues/851>`_,
  `#852 <https://github.com/fmtlib/fmt/pull/852>`_,
  `#854 <https://github.com/fmtlib/fmt/pull/854>`_).
  Thanks `@henryiii (Henry Schreiner) <https://github.com/henryiii>`_,
  `@medithe <https://github.com/medithe>`_, and
  `@eliasdaler (Elias Daler) <https://github.com/eliasdaler>`_.

5.1.0 - 2018-07-05
------------------

* Added experimental support for RGB color output enabled with
  the ``FMT_EXTENDED_COLORS`` macro:

  .. code:: c++

     #define FMT_EXTENDED_COLORS
     #define FMT_HEADER_ONLY // or compile fmt with FMT_EXTENDED_COLORS defined
     #include <fmt/format.h>

     fmt::print(fmt::color::steel_blue, "Some beautiful text");

  The old API (the ``print_colored`` and ``vprint_colored`` functions and the
  ``color`` enum) is now deprecated.
  (`#762 <https://github.com/fmtlib/fmt/issues/762>`_
  `#767 <https://github.com/fmtlib/fmt/pull/767>`_).
  thanks `@Remotion (Remo) <https://github.com/Remotion>`_.

* Added quotes to strings in ranges and tuples
  (`#766 <https://github.com/fmtlib/fmt/pull/766>`_).
  Thanks `@Remotion (Remo) <https://github.com/Remotion>`_.

* Made ``format_to`` work with ``basic_memory_buffer``
  (`#776 <https://github.com/fmtlib/fmt/issues/776>`_).

* Added ``vformat_to_n`` and ``wchar_t`` overload of ``format_to_n``
  (`#764 <https://github.com/fmtlib/fmt/issues/764>`_,
  `#769 <https://github.com/fmtlib/fmt/issues/769>`_).

* Made ``is_range`` and ``is_tuple_like`` part of public (experimental) API
  to allow specialization for user-defined types
  (`#751 <https://github.com/fmtlib/fmt/issues/751>`_,
  `#759 <https://github.com/fmtlib/fmt/pull/759>`_).
  Thanks `@drrlvn (Dror Levin) <https://github.com/drrlvn>`_.

* Added more compilers to continuous integration and increased ``FMT_PEDANTIC``
  warning levels
  (`#736 <https://github.com/fmtlib/fmt/pull/736>`_).
  Thanks `@eliaskosunen (Elias Kosunen) <https://github.com/eliaskosunen>`_.

* Fixed compilation with MSVC 2013.

* Fixed handling of user-defined types in ``format_to``
  (`#793 <https://github.com/fmtlib/fmt/issues/793>`_).

* Forced linking of inline ``vformat`` functions into the library
  (`#795 <https://github.com/fmtlib/fmt/issues/795>`_).

* Fixed incorrect call to on_align in ``'{:}='``
  (`#750 <https://github.com/fmtlib/fmt/issues/750>`_).

* Fixed floating-point formatting to a non-back_insert_iterator with sign &
  numeric alignment specified
  (`#756 <https://github.com/fmtlib/fmt/issues/756>`_).

* Fixed formatting to an array with ``format_to_n``
  (`#778 <https://github.com/fmtlib/fmt/issues/778>`_).

* Fixed formatting of more than 15 named arguments
  (`#754 <https://github.com/fmtlib/fmt/issues/754>`_).

* Fixed handling of compile-time strings when including ``fmt/ostream.h``.
  (`#768 <https://github.com/fmtlib/fmt/issues/768>`_).

* Fixed various compiler warnings and errors
  (`#742 <https://github.com/fmtlib/fmt/issues/742>`_,
  `#748 <https://github.com/fmtlib/fmt/issues/748>`_,
  `#752 <https://github.com/fmtlib/fmt/issues/752>`_,
  `#770 <https://github.com/fmtlib/fmt/issues/770>`_,
  `#775 <https://github.com/fmtlib/fmt/pull/775>`_,
  `#779 <https://github.com/fmtlib/fmt/issues/779>`_,
  `#780 <https://github.com/fmtlib/fmt/pull/780>`_,
  `#790 <https://github.com/fmtlib/fmt/pull/790>`_,
  `#792 <https://github.com/fmtlib/fmt/pull/792>`_,
  `#800 <https://github.com/fmtlib/fmt/pull/800>`_).
  Thanks `@Remotion (Remo) <https://github.com/Remotion>`_,
  `@gabime (Gabi Melman) <https://github.com/gabime>`_,
  `@foonathan (Jonathan Müller) <https://github.com/foonathan>`_,
  `@Dark-Passenger (Dhruv Paranjape) <https://github.com/Dark-Passenger>`_, and
  `@0x8000-0000 (Sign Bit) <https://github.com/0x8000-0000>`_.

5.0.0 - 2018-05-21
------------------

* Added a requirement for partial C++11 support, most importantly variadic
  templates and type traits, and dropped ``FMT_VARIADIC_*`` emulation macros.
  Variadic templates are available since GCC 4.4, Clang 2.9 and MSVC 18.0 (2013).
  For older compilers use {fmt} `version 4.x
  <https://github.com/fmtlib/fmt/releases/tag/4.1.0>`_ which continues to be
  maintained and works with C++98 compilers.

* Renamed symbols to follow standard C++ naming conventions and proposed a subset
  of the library for standardization in `P0645R2 Text Formatting
  <https://wg21.link/P0645>`_.

* Implemented ``constexpr`` parsing of format strings and `compile-time format
  string checks
  <https://fmt.dev/latest/api.html#compile-time-format-string-checks>`_. For
  example

  .. code:: c++

     #include <fmt/format.h>

     std::string s = format(fmt("{:d}"), "foo");

  gives a compile-time error because ``d`` is an invalid specifier for strings
  (`godbolt <https://godbolt.org/g/rnCy9Q>`__)::

     ...
     <source>:4:19: note: in instantiation of function template specialization 'fmt::v5::format<S, char [4]>' requested here
       std::string s = format(fmt("{:d}"), "foo");
                       ^
     format.h:1337:13: note: non-constexpr function 'on_error' cannot be used in a constant expression
         handler.on_error("invalid type specifier");

  Compile-time checks require relaxed ``constexpr`` (C++14 feature) support. If
  the latter is not available, checks will be performed at runtime.

* Separated format string parsing and formatting in the extension API to enable
  compile-time format string processing. For example

  .. code:: c++

     struct Answer {};

     namespace fmt {
     template <>
     struct formatter<Answer> {
       constexpr auto parse(parse_context& ctx) {
         auto it = ctx.begin();
         spec = *it;
         if (spec != 'd' && spec != 's')
           throw format_error("invalid specifier");
         return ++it;
       }

       template <typename FormatContext>
       auto format(Answer, FormatContext& ctx) {
         return spec == 's' ?
           format_to(ctx.begin(), "{}", "fourty-two") :
           format_to(ctx.begin(), "{}", 42);
       }

       char spec = 0;
     };
     }

     std::string s = format(fmt("{:x}"), Answer());

  gives a compile-time error due to invalid format specifier (`godbolt
  <https://godbolt.org/g/2jQ1Dv>`__)::

     ...
     <source>:12:45: error: expression '<throw-expression>' is not a constant expression
            throw format_error("invalid specifier");

* Added `iterator support
  <https://fmt.dev/latest/api.html#output-iterator-support>`_:

  .. code:: c++

     #include <vector>
     #include <fmt/format.h>

     std::vector<char> out;
     fmt::format_to(std::back_inserter(out), "{}", 42);

* Added the `format_to_n
  <https://fmt.dev/latest/api.html#_CPPv2N3fmt11format_to_nE8OutputItNSt6size_tE11string_viewDpRK4Args>`_
  function that restricts the output to the specified number of characters
  (`#298 <https://github.com/fmtlib/fmt/issues/298>`_):

  .. code:: c++

     char out[4];
     fmt::format_to_n(out, sizeof(out), "{}", 12345);
     // out == "1234" (without terminating '\0')

* Added the `formatted_size
  <https://fmt.dev/latest/api.html#_CPPv2N3fmt14formatted_sizeE11string_viewDpRK4Args>`_
  function for computing the output size:

  .. code:: c++

     #include <fmt/format.h>

     auto size = fmt::formatted_size("{}", 12345); // size == 5

* Improved compile times by reducing dependencies on standard headers and
  providing a lightweight `core API <https://fmt.dev/latest/api.html#core-api>`_:

  .. code:: c++

     #include <fmt/core.h>

     fmt::print("The answer is {}.", 42);

  See `Compile time and code bloat
  <https://github.com/fmtlib/fmt#compile-time-and-code-bloat>`_.

* Added the `make_format_args
  <https://fmt.dev/latest/api.html#_CPPv2N3fmt16make_format_argsEDpRK4Args>`_
  function for capturing formatting arguments:

  .. code:: c++
  
     // Prints formatted error message.
     void vreport_error(const char *format, fmt::format_args args) {
       fmt::print("Error: ");
       fmt::vprint(format, args);
     }
     template <typename... Args>
     void report_error(const char *format, const Args & ... args) {
       vreport_error(format, fmt::make_format_args(args...));
     }

* Added the ``make_printf_args`` function for capturing ``printf`` arguments
  (`#687 <https://github.com/fmtlib/fmt/issues/687>`_,
  `#694 <https://github.com/fmtlib/fmt/pull/694>`_).
  Thanks `@Kronuz (Germán Méndez Bravo) <https://github.com/Kronuz>`_.

* Added prefix ``v`` to non-variadic functions taking ``format_args`` to
  distinguish them from variadic ones:

  .. code:: c++

     std::string vformat(string_view format_str, format_args args);
     
     template <typename... Args>
     std::string format(string_view format_str, const Args & ... args);

* Added experimental support for formatting ranges, containers and tuple-like
  types in ``fmt/ranges.h`` (`#735 <https://github.com/fmtlib/fmt/pull/735>`_):

  .. code:: c++

     #include <fmt/ranges.h>

     std::vector<int> v = {1, 2, 3};
     fmt::print("{}", v); // prints {1, 2, 3}

  Thanks `@Remotion (Remo) <https://github.com/Remotion>`_.

* Implemented ``wchar_t`` date and time formatting
  (`#712 <https://github.com/fmtlib/fmt/pull/712>`_):

  .. code:: c++

     #include <fmt/time.h>

     std::time_t t = std::time(nullptr);
     auto s = fmt::format(L"The date is {:%Y-%m-%d}.", *std::localtime(&t));

  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.

* Provided more wide string overloads
  (`#724 <https://github.com/fmtlib/fmt/pull/724>`_).
  Thanks `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_.

* Switched from a custom null-terminated string view class to ``string_view``
  in the format API and provided ``fmt::string_view`` which implements a subset
  of ``std::string_view`` API for pre-C++17 systems.

* Added support for ``std::experimental::string_view``
  (`#607 <https://github.com/fmtlib/fmt/pull/607>`_):

  .. code:: c++

     #include <fmt/core.h>
     #include <experimental/string_view>

     fmt::print("{}", std::experimental::string_view("foo"));

  Thanks `@virgiliofornazin (Virgilio Alexandre Fornazin)
  <https://github.com/virgiliofornazin>`__.

* Allowed mixing named and automatic arguments:

  .. code:: c++

     fmt::format("{} {two}", 1, fmt::arg("two", 2));

* Removed the write API in favor of the `format API
  <https://fmt.dev/latest/api.html#format-api>`_ with compile-time handling of
  format strings.

* Disallowed formatting of multibyte strings into a wide character target
  (`#606 <https://github.com/fmtlib/fmt/pull/606>`_).

* Improved documentation
  (`#515 <https://github.com/fmtlib/fmt/pull/515>`_,
  `#614 <https://github.com/fmtlib/fmt/issues/614>`_,
  `#617 <https://github.com/fmtlib/fmt/pull/617>`_,
  `#661 <https://github.com/fmtlib/fmt/pull/661>`_,
  `#680 <https://github.com/fmtlib/fmt/pull/680>`_).
  Thanks `@ibell (Ian Bell) <https://github.com/ibell>`_,
  `@mihaitodor (Mihai Todor) <https://github.com/mihaitodor>`_, and
  `@johnthagen <https://github.com/johnthagen>`_.

* Implemented more efficient handling of large number of format arguments.

* Introduced an inline namespace for symbol versioning.

* Added debug postfix ``d`` to the ``fmt`` library name
  (`#636 <https://github.com/fmtlib/fmt/issues/636>`_).

* Removed unnecessary ``fmt/`` prefix in includes
  (`#397 <https://github.com/fmtlib/fmt/pull/397>`_).
  Thanks `@chronoxor (Ivan Shynkarenka) <https://github.com/chronoxor>`_.

* Moved ``fmt/*.h`` to ``include/fmt/*.h`` to prevent irrelevant files and
  directories appearing on the include search paths when fmt is used as a
  subproject and moved source files to the ``src`` directory.

* Added qmake project file ``support/fmt.pro``
  (`#641 <https://github.com/fmtlib/fmt/pull/641>`_).
  Thanks `@cowo78 (Giuseppe Corbelli) <https://github.com/cowo78>`_.

* Added Gradle build file ``support/build.gradle``
  (`#649 <https://github.com/fmtlib/fmt/pull/649>`_).
  Thanks `@luncliff (Park DongHa) <https://github.com/luncliff>`_.

* Removed ``FMT_CPPFORMAT`` CMake option.

* Fixed a name conflict with the macro ``CHAR_WIDTH`` in glibc
  (`#616 <https://github.com/fmtlib/fmt/pull/616>`_).
  Thanks `@aroig (Abdó Roig-Maranges) <https://github.com/aroig>`_.

* Fixed handling of nested braces in ``fmt::join``
  (`#638 <https://github.com/fmtlib/fmt/issues/638>`_).

* Added ``SOURCELINK_SUFFIX`` for compatibility with Sphinx 1.5
  (`#497 <https://github.com/fmtlib/fmt/pull/497>`_).
  Thanks `@ginggs (Graham Inggs) <https://github.com/ginggs>`_.

* Added a missing ``inline`` in the header-only mode
  (`#626 <https://github.com/fmtlib/fmt/pull/626>`_).
  Thanks `@aroig (Abdó Roig-Maranges) <https://github.com/aroig>`_.

* Fixed various compiler warnings
  (`#640 <https://github.com/fmtlib/fmt/pull/640>`_,
  `#656 <https://github.com/fmtlib/fmt/pull/656>`_,
  `#679 <https://github.com/fmtlib/fmt/pull/679>`_,
  `#681 <https://github.com/fmtlib/fmt/pull/681>`_,
  `#705 <https://github.com/fmtlib/fmt/pull/705>`__,
  `#715 <https://github.com/fmtlib/fmt/issues/715>`_,
  `#717 <https://github.com/fmtlib/fmt/pull/717>`_,
  `#720 <https://github.com/fmtlib/fmt/pull/720>`_,
  `#723 <https://github.com/fmtlib/fmt/pull/723>`_,
  `#726 <https://github.com/fmtlib/fmt/pull/726>`_,
  `#730 <https://github.com/fmtlib/fmt/pull/730>`_,
  `#739 <https://github.com/fmtlib/fmt/pull/739>`_).
  Thanks `@peterbell10 <https://github.com/peterbell10>`_,
  `@LarsGullik <https://github.com/LarsGullik>`_,
  `@foonathan (Jonathan Müller) <https://github.com/foonathan>`_,
  `@eliaskosunen (Elias Kosunen) <https://github.com/eliaskosunen>`_,
  `@christianparpart (Christian Parpart) <https://github.com/christianparpart>`_,
  `@DanielaE (Daniela Engert) <https://github.com/DanielaE>`_,
  and `@mwinterb <https://github.com/mwinterb>`_.

* Worked around an MSVC bug and fixed several warnings
  (`#653 <https://github.com/fmtlib/fmt/pull/653>`_).
  Thanks `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_.

* Worked around GCC bug 67371
  (`#682 <https://github.com/fmtlib/fmt/issues/682>`_).

* Fixed compilation with ``-fno-exceptions``
  (`#655 <https://github.com/fmtlib/fmt/pull/655>`_).
  Thanks `@chenxiaolong (Andrew Gunnerson) <https://github.com/chenxiaolong>`_.

* Made ``constexpr remove_prefix`` gcc version check tighter
  (`#648 <https://github.com/fmtlib/fmt/issues/648>`_).

* Renamed internal type enum constants to prevent collision with poorly written
  C libraries (`#644 <https://github.com/fmtlib/fmt/issues/644>`_).

* Added detection of ``wostream operator<<``
  (`#650 <https://github.com/fmtlib/fmt/issues/650>`_).

* Fixed compilation on OpenBSD
  (`#660 <https://github.com/fmtlib/fmt/pull/660>`_).
  Thanks `@hubslave <https://github.com/hubslave>`_.

* Fixed compilation on FreeBSD 12
  (`#732 <https://github.com/fmtlib/fmt/pull/732>`_).
  Thanks `@dankm <https://github.com/dankm>`_.

* Fixed compilation when there is a mismatch between ``-std`` options between
  the library and user code
  (`#664 <https://github.com/fmtlib/fmt/issues/664>`_).

* Fixed compilation with GCC 7 and ``-std=c++11``
  (`#734 <https://github.com/fmtlib/fmt/issues/734>`_).

* Improved generated binary code on GCC 7 and older
  (`#668 <https://github.com/fmtlib/fmt/issues/668>`_).

* Fixed handling of numeric alignment with no width 
  (`#675 <https://github.com/fmtlib/fmt/issues/675>`_).

* Fixed handling of empty strings in UTF8/16 converters
  (`#676 <https://github.com/fmtlib/fmt/pull/676>`_).
  Thanks `@vgalka-sl (Vasili Galka) <https://github.com/vgalka-sl>`_.

* Fixed formatting of an empty ``string_view``
  (`#689 <https://github.com/fmtlib/fmt/issues/689>`_).

* Fixed detection of ``string_view`` on libc++ 
  (`#686 <https://github.com/fmtlib/fmt/issues/686>`_).

* Fixed DLL issues (`#696 <https://github.com/fmtlib/fmt/pull/696>`_).
  Thanks `@sebkoenig <https://github.com/sebkoenig>`_.

* Fixed compile checks for mixing narrow and wide strings
  (`#690 <https://github.com/fmtlib/fmt/issues/690>`_).

* Disabled unsafe implicit conversion to ``std::string``
  (`#729 <https://github.com/fmtlib/fmt/issues/729>`_).

* Fixed handling of reused format specs (as in ``fmt::join``) for pointers
  (`#725 <https://github.com/fmtlib/fmt/pull/725>`_).
  Thanks `@mwinterb <https://github.com/mwinterb>`_.

* Fixed installation of ``fmt/ranges.h``
  (`#738 <https://github.com/fmtlib/fmt/pull/738>`_).
  Thanks `@sv1990 <https://github.com/sv1990>`_.

4.1.0 - 2017-12-20
------------------

* Added ``fmt::to_wstring()`` in addition to ``fmt::to_string()``
  (`#559 <https://github.com/fmtlib/fmt/pull/559>`_).
  Thanks `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_.

* Added support for C++17 ``std::string_view``
  (`#571 <https://github.com/fmtlib/fmt/pull/571>`_ and
  `#578 <https://github.com/fmtlib/fmt/pull/578>`_).
  Thanks `@thelostt (Mário Feroldi) <https://github.com/thelostt>`_ and
  `@mwinterb <https://github.com/mwinterb>`_.

* Enabled stream exceptions to catch errors
  (`#581 <https://github.com/fmtlib/fmt/issues/581>`_).
  Thanks `@crusader-mike <https://github.com/crusader-mike>`_.

* Allowed formatting of class hierarchies with ``fmt::format_arg()``
  (`#547 <https://github.com/fmtlib/fmt/pull/547>`_).
  Thanks `@rollbear (Björn Fahller) <https://github.com/rollbear>`_.

* Removed limitations on character types
  (`#563 <https://github.com/fmtlib/fmt/pull/563>`_).
  Thanks `@Yelnats321 (Elnar Dakeshov) <https://github.com/Yelnats321>`_.

* Conditionally enabled use of ``std::allocator_traits``
  (`#583 <https://github.com/fmtlib/fmt/pull/583>`_).
  Thanks `@mwinterb <https://github.com/mwinterb>`_.

* Added support for ``const`` variadic member function emulation with
  ``FMT_VARIADIC_CONST`` (`#591 <https://github.com/fmtlib/fmt/pull/591>`_).
  Thanks `@ludekvodicka (Ludek Vodicka) <https://github.com/ludekvodicka>`_.

* Various bugfixes: bad overflow check, unsupported implicit type conversion
  when determining formatting function, test segfaults
  (`#551 <https://github.com/fmtlib/fmt/issues/551>`_), ill-formed macros
  (`#542 <https://github.com/fmtlib/fmt/pull/542>`_) and ambiguous overloads
  (`#580 <https://github.com/fmtlib/fmt/issues/580>`_).
  Thanks `@xylosper (Byoung-young Lee) <https://github.com/xylosper>`_.

* Prevented warnings on MSVC (`#605 <https://github.com/fmtlib/fmt/pull/605>`_,
  `#602 <https://github.com/fmtlib/fmt/pull/602>`_, and
  `#545 <https://github.com/fmtlib/fmt/pull/545>`_),
  clang (`#582 <https://github.com/fmtlib/fmt/pull/582>`_),
  GCC (`#573 <https://github.com/fmtlib/fmt/issues/573>`_),
  various conversion warnings (`#609 <https://github.com/fmtlib/fmt/pull/609>`_,
  `#567 <https://github.com/fmtlib/fmt/pull/567>`_,
  `#553 <https://github.com/fmtlib/fmt/pull/553>`_ and
  `#553 <https://github.com/fmtlib/fmt/pull/553>`_), and added ``override`` and
  ``[[noreturn]]`` (`#549 <https://github.com/fmtlib/fmt/pull/549>`_ and
  `#555 <https://github.com/fmtlib/fmt/issues/555>`_).
  Thanks `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_,
  `@virgiliofornazin (Virgilio Alexandre Fornazin)
  <https://gihtub.com/virgiliofornazin>`_,
  `@alexanderbock (Alexander Bock) <https://github.com/alexanderbock>`_,
  `@yumetodo <https://github.com/yumetodo>`_,
  `@VaderY (Császár Mátyás) <https://github.com/VaderY>`_,
  `@jpcima (JP Cimalando) <https://github.com/jpcima>`_,
  `@thelostt (Mário Feroldi) <https://github.com/thelostt>`_, and
  `@Manu343726 (Manu Sánchez) <https://github.com/Manu343726>`_.

* Improved CMake: Used ``GNUInstallDirs`` to set installation location
  (`#610 <https://github.com/fmtlib/fmt/pull/610>`_) and fixed warnings
  (`#536 <https://github.com/fmtlib/fmt/pull/536>`_ and
  `#556 <https://github.com/fmtlib/fmt/pull/556>`_).
  Thanks `@mikecrowe (Mike Crowe) <https://github.com/mikecrowe>`_,
  `@evgen231 <https://github.com/evgen231>`_ and
  `@henryiii (Henry Schreiner) <https://github.com/henryiii>`_.

4.0.0 - 2017-06-27
------------------

* Removed old compatibility headers ``cppformat/*.h`` and CMake options
  (`#527 <https://github.com/fmtlib/fmt/pull/527>`_).
  Thanks `@maddinat0r (Alex Martin) <https://github.com/maddinat0r>`_.

* 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>`_):

  .. code:: c++

    #include "fmt/string.h"
  
    std::string answer = fmt::to_string(42);

  Thanks to `@glebov-andrey (Andrey Glebov)
  <https://github.com/glebov-andrey>`_.

* 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>`_):

  .. code:: c++

    #include "fmt/printf.h"
 
    // %s format specifier can be used with any argument type.
    fmt::printf("%s", 42);

  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>`_.

* 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>`_.

* 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>`_):

  .. code:: c++

    #include "fmt/format.h"
 
    std::vector<double> v = {1.2, 3.4, 5.6};
    // Prints "(+01.20, +03.40, +05.60)".
    fmt::print("({:+06.2f})", fmt::join(v.begin(), v.end(), ", "));

  Thanks `@olivier80 <https://github.com/olivier80>`_.

* 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>`_.

* 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>`_.

* 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>`_.

* 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>`_.

* 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>`_.

* Fixed handling of wide strings in ``fmt::StringWriter``.

* Improved compiler error messages
  (`#357 <https://github.com/fmtlib/fmt/issues/357>`_).

* 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>`_,
  `#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>`_ .

* 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>`_,
  `@niosHD (Mario Werner) <https://github.com/niosHD>`_,
  `@LogicalKnight (Sean LK) <https://github.com/LogicalKnight>`_ and
  `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_.

* Improved documentation. Thanks to
  `@pwm1234 (Phil) <https://github.com/pwm1234>`_ for
  `#393 <https://github.com/fmtlib/fmt/pull/393>`_.

3.0.2 - 2017-06-14
------------------

* Added ``FMT_VERSION`` macro
  (`#411 <https://github.com/fmtlib/fmt/issues/411>`_).

* Used ``FMT_NULL`` instead of literal ``0``
  (`#409 <https://github.com/fmtlib/fmt/pull/409>`_).
  Thanks `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_.

* Added extern templates for ``format_float``
  (`#413 <https://github.com/fmtlib/fmt/issues/413>`_).

* Fixed implicit conversion issue
  (`#507 <https://github.com/fmtlib/fmt/issues/507>`_).

* Fixed signbit detection (`#423 <https://github.com/fmtlib/fmt/issues/423>`_).

* Fixed naming collision (`#425 <https://github.com/fmtlib/fmt/issues/425>`_).

* Fixed missing intrinsic for C++/CLI
  (`#457 <https://github.com/fmtlib/fmt/pull/457>`_).
  Thanks `@calumr (Calum Robinson) <https://github.com/calumr>`_

* Fixed Android detection (`#458 <https://github.com/fmtlib/fmt/pull/458>`_).
  Thanks `@Gachapen (Magnus Bjerke Vik) <https://github.com/Gachapen>`_.

* 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>`_.

* Fixed issue with CMake exporting C++11 flag
  (`#445 <https://github.com/fmtlib/fmt/pull/455>`_).
  Thanks `@EricWF (Eric) <https://github.com/EricWF>`_.

* Fixed issue with nvcc and MSVC compiler bug and MinGW
  (`#505 <https://github.com/fmtlib/fmt/issues/505>`_).

* 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>`_.

* Fixed test compilation under FreeBSD
  (`#433 <https://github.com/fmtlib/fmt/issues/433>`_).

* 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>`_.

* Worked around a broken ``__builtin_clz`` in clang with MS codegen
  (`#519 <https://github.com/fmtlib/fmt/issues/519>`_).

* Removed redundant include
  (`#479 <https://github.com/fmtlib/fmt/issues/479>`_).

* Fixed documentation issues.

3.0.1 - 2016-11-01
------------------
* Fixed handling of thousands separator
  (`#353 <https://github.com/fmtlib/fmt/issues/353>`_).

* Fixed handling of ``unsigned char`` strings
  (`#373 <https://github.com/fmtlib/fmt/issues/373>`_).

* Corrected buffer growth when formatting time
  (`#367 <https://github.com/fmtlib/fmt/issues/367>`_).

* 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>`_.

* 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>`_.

* 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>`_.

3.0.0 - 2016-05-07
------------------

* The project has been renamed from C++ Format (cppformat) to fmt for
  consistency with the used namespace and macro prefix
  (`#307 <https://github.com/fmtlib/fmt/issues/307>`_).
  Library headers are now located in the ``fmt`` directory:

  .. code:: c++

    #include "fmt/format.h"

  Including ``format.h`` from the ``cppformat`` directory is deprecated
  but works via a proxy header which will be removed in the next major version.
  
  The documentation is now available at https://fmt.dev.

* Added support for `strftime <http://en.cppreference.com/w/cpp/chrono/c/strftime>`_-like
  `date and time formatting <https://fmt.dev/3.0.0/api.html#date-and-time-formatting>`_
  (`#283 <https://github.com/fmtlib/fmt/issues/283>`_):

  .. code:: c++

    #include "fmt/time.h"

    std::time_t t = std::time(nullptr);
    // Prints "The date is 2016-04-29." (with the current date)
    fmt::print("The date is {:%Y-%m-%d}.", *std::localtime(&t));

* ``std::ostream`` support including formatting of user-defined types that provide
  overloaded ``operator<<`` has been moved to ``fmt/ostream.h``:

  .. code:: c++

    #include "fmt/ostream.h"

    class Date {
      int year_, month_, day_;
    public:
      Date(int year, int month, int day) : year_(year), month_(month), day_(day) {}

      friend std::ostream &operator<<(std::ostream &os, const Date &d) {
        return os << d.year_ << '-' << d.month_ << '-' << d.day_;
      }
    };

    std::string s = fmt::format("The date is {}", Date(2012, 12, 9));
    // s == "The date is 2012-12-9"

* Added support for `custom argument formatters
  <https://fmt.dev/3.0.0/api.html#argument-formatters>`_
  (`#235 <https://github.com/fmtlib/fmt/issues/235>`_).

* Added support for locale-specific integer formatting with the ``n`` specifier
  (`#305 <https://github.com/fmtlib/fmt/issues/305>`_):

  .. code:: c++

    std::setlocale(LC_ALL, "en_US.utf8");
    fmt::print("cppformat: {:n}\n", 1234567); // prints 1,234,567

* Sign is now preserved when formatting an integer with an incorrect ``printf``
  format specifier (`#265 <https://github.com/fmtlib/fmt/issues/265>`_):

  .. code:: c++

    fmt::printf("%lld", -42); // prints -42

  Note that it would be an undefined behavior in ``std::printf``.

* Length modifiers such as ``ll`` are now optional in printf formatting
  functions and the correct type is determined automatically
  (`#255 <https://github.com/fmtlib/fmt/issues/255>`_):

  .. code:: c++

    fmt::printf("%d", std::numeric_limits<long long>::max());

  Note that it would be an undefined behavior in ``std::printf``.

* Added initial support for custom formatters
  (`#231 <https://github.com/fmtlib/fmt/issues/231>`_).

* Fixed detection of user-defined literal support on Intel C++ compiler
  (`#311 <https://github.com/fmtlib/fmt/issues/311>`_,
  `#312 <https://github.com/fmtlib/fmt/pull/312>`_).
  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_ and
  `@speth (Ray Speth) <https://github.com/speth>`_.

* Reduced compile time
  (`#243 <https://github.com/fmtlib/fmt/pull/243>`_,
  `#249 <https://github.com/fmtlib/fmt/pull/249>`_,
  `#317 <https://github.com/fmtlib/fmt/issues/317>`_):

  .. image:: https://cloud.githubusercontent.com/assets/4831417/11614060/
             b9e826d2-9c36-11e5-8666-d4131bf503ef.png

  .. image:: https://cloud.githubusercontent.com/assets/4831417/11614080/
             6ac903cc-9c37-11e5-8165-26df6efae364.png

  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.

* Compile test fixes (`#313 <https://github.com/fmtlib/fmt/pull/313>`_).
  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.

* Documentation fixes (`#239 <https://github.com/fmtlib/fmt/pull/239>`_,
  `#248 <https://github.com/fmtlib/fmt/issues/248>`_,
  `#252 <https://github.com/fmtlib/fmt/issues/252>`_,
  `#258 <https://github.com/fmtlib/fmt/pull/258>`_,
  `#260 <https://github.com/fmtlib/fmt/issues/260>`_,
  `#301 <https://github.com/fmtlib/fmt/issues/301>`_,
  `#309 <https://github.com/fmtlib/fmt/pull/309>`_).
  Thanks to `@ReadmeCritic <https://github.com/ReadmeCritic>`_
  `@Gachapen (Magnus Bjerke Vik) <https://github.com/Gachapen>`_ and
  `@jwilk (Jakub Wilk) <https://github.com/jwilk>`_.

* Fixed compiler and sanitizer warnings
  (`#244 <https://github.com/fmtlib/fmt/issues/244>`_,
  `#256 <https://github.com/fmtlib/fmt/pull/256>`_,
  `#259 <https://github.com/fmtlib/fmt/pull/259>`_,
  `#263 <https://github.com/fmtlib/fmt/issues/263>`_,
  `#274 <https://github.com/fmtlib/fmt/issues/274>`_,
  `#277 <https://github.com/fmtlib/fmt/pull/277>`_,
  `#286 <https://github.com/fmtlib/fmt/pull/286>`_,
  `#291 <https://github.com/fmtlib/fmt/issues/291>`_,
  `#296 <https://github.com/fmtlib/fmt/issues/296>`_,
  `#308 <https://github.com/fmtlib/fmt/issues/308>`_)
  Thanks to `@mwinterb <https://github.com/mwinterb>`_,
  `@pweiskircher (Patrik Weiskircher) <https://github.com/pweiskircher>`_,
  `@Naios <https://github.com/Naios>`_.

* Improved compatibility with Windows Store apps
  (`#280 <https://github.com/fmtlib/fmt/issues/280>`_,
  `#285 <https://github.com/fmtlib/fmt/pull/285>`_)
  Thanks to `@mwinterb <https://github.com/mwinterb>`_.

* Added tests of compatibility with older C++ standards
  (`#273 <https://github.com/fmtlib/fmt/pull/273>`_).
  Thanks to `@niosHD <https://github.com/niosHD>`_.

* Fixed Android build (`#271 <https://github.com/fmtlib/fmt/pull/271>`_).
  Thanks to `@newnon <https://github.com/newnon>`_.

* Changed ``ArgMap`` to be backed by a vector instead of a map.
  (`#261 <https://github.com/fmtlib/fmt/issues/261>`_,
  `#262 <https://github.com/fmtlib/fmt/pull/262>`_).
  Thanks to `@mwinterb <https://github.com/mwinterb>`_.

* Added ``fprintf`` overload that writes to a ``std::ostream``
  (`#251 <https://github.com/fmtlib/fmt/pull/251>`_).
  Thanks to `nickhutchinson (Nicholas Hutchinson) <https://github.com/nickhutchinson>`_.

* Export symbols when building a Windows DLL
  (`#245 <https://github.com/fmtlib/fmt/pull/245>`_).
  Thanks to `macdems (Maciek Dems) <https://github.com/macdems>`_.

* Fixed compilation on Cygwin (`#304 <https://github.com/fmtlib/fmt/issues/304>`_).

* Implemented a workaround for a bug in Apple LLVM version 4.2 of clang
  (`#276 <https://github.com/fmtlib/fmt/issues/276>`_).

* Implemented a workaround for Google Test bug
  `#705 <https://github.com/google/googletest/issues/705>`_ on gcc 6
  (`#268 <https://github.com/fmtlib/fmt/issues/268>`_).
  Thanks to `octoploid <https://github.com/octoploid>`_.

* Removed Biicode support because the latter has been discontinued.

2.1.1 - 2016-04-11
------------------

* The install location for generated CMake files is now configurable via
  the ``FMT_CMAKE_DIR`` CMake variable
  (`#299 <https://github.com/fmtlib/fmt/pull/299>`_).
  Thanks to `@niosHD <https://github.com/niosHD>`_.

* Documentation fixes (`#252 <https://github.com/fmtlib/fmt/issues/252>`_).

2.1.0 - 2016-03-21
------------------

* Project layout and build system improvements
  (`#267 <https://github.com/fmtlib/fmt/pull/267>`_):

  * The code have been moved to the ``cppformat`` directory.
    Including ``format.h`` from the top-level directory is deprecated
    but works via a proxy header which will be removed in the next
    major version.

  * C++ Format CMake targets now have proper interface definitions.

  * Installed version of the library now supports the header-only
    configuration.

  * Targets ``doc``, ``install``, and ``test`` are now disabled if C++ Format
    is included as a CMake subproject. They can be enabled by setting
    ``FMT_DOC``, ``FMT_INSTALL``, and ``FMT_TEST`` in the parent project.

  Thanks to `@niosHD <https://github.com/niosHD>`_.

2.0.1 - 2016-03-13
------------------

* Improved CMake find and package support
  (`#264 <https://github.com/fmtlib/fmt/issues/264>`_).
  Thanks to `@niosHD <https://github.com/niosHD>`_.

* Fix compile error with Android NDK and mingw32
  (`#241 <https://github.com/fmtlib/fmt/issues/241>`_).
  Thanks to `@Gachapen (Magnus Bjerke Vik) <https://github.com/Gachapen>`_.

* Documentation fixes
  (`#248 <https://github.com/fmtlib/fmt/issues/248>`_,
  `#260 <https://github.com/fmtlib/fmt/issues/260>`_).

2.0.0 - 2015-12-01
------------------

General
~~~~~~~

* [Breaking] Named arguments
  (`#169 <https://github.com/fmtlib/fmt/pull/169>`_,
  `#173 <https://github.com/fmtlib/fmt/pull/173>`_,
  `#174 <https://github.com/fmtlib/fmt/pull/174>`_):

  .. code:: c++

    fmt::print("The answer is {answer}.", fmt::arg("answer", 42));

  Thanks to `@jamboree <https://github.com/jamboree>`_.

* [Experimental] User-defined literals for format and named arguments
  (`#204 <https://github.com/fmtlib/fmt/pull/204>`_,
  `#206 <https://github.com/fmtlib/fmt/pull/206>`_,
  `#207 <https://github.com/fmtlib/fmt/pull/207>`_):

  .. code:: c++

    using namespace fmt::literals;
    fmt::print("The answer is {answer}.", "answer"_a=42);

  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.

* [Breaking] Formatting of more than 16 arguments is now supported when using
  variadic templates
  (`#141 <https://github.com/fmtlib/fmt/issues/141>`_).
  Thanks to `@Shauren <https://github.com/Shauren>`_.

* Runtime width specification
  (`#168 <https://github.com/fmtlib/fmt/pull/168>`_):

  .. code:: c++

    fmt::format("{0:{1}}", 42, 5); // gives "   42"

  Thanks to `@jamboree <https://github.com/jamboree>`_.

* [Breaking] Enums are now formatted with an overloaded ``std::ostream`` insertion
  operator (``operator<<``) if available
  (`#232 <https://github.com/fmtlib/fmt/issues/232>`_).

* [Breaking] Changed default ``bool`` format to textual, "true" or "false"
  (`#170 <https://github.com/fmtlib/fmt/issues/170>`_):

  .. code:: c++
  
    fmt::print("{}", true); // prints "true"

  To print ``bool`` as a number use numeric format specifier such as ``d``:

  .. code:: c++

    fmt::print("{:d}", true); // prints "1"

* ``fmt::printf`` and ``fmt::sprintf`` now support formatting of ``bool`` with the
  ``%s`` specifier giving textual output, "true" or "false"
  (`#223 <https://github.com/fmtlib/fmt/pull/223>`_):

  .. code:: c++

    fmt::printf("%s", true); // prints "true"

  Thanks to `@LarsGullik <https://github.com/LarsGullik>`_.

* [Breaking] ``signed char`` and ``unsigned char`` are now formatted as integers by default
  (`#217 <https://github.com/fmtlib/fmt/pull/217>`_).

* [Breaking] Pointers to C strings can now be formatted with the ``p`` specifier
  (`#223 <https://github.com/fmtlib/fmt/pull/223>`_):

  .. code:: c++

    fmt::print("{:p}", "test"); // prints pointer value

  Thanks to `@LarsGullik <https://github.com/LarsGullik>`_.

* [Breaking] ``fmt::printf`` and ``fmt::sprintf`` now print null pointers as ``(nil)``
  and null strings as ``(null)`` for consistency with glibc
  (`#226 <https://github.com/fmtlib/fmt/pull/226>`_).
  Thanks to `@LarsGullik <https://github.com/LarsGullik>`_.

* [Breaking] ``fmt::(s)printf`` now supports formatting of objects of user-defined types
  that provide an overloaded ``std::ostream`` insertion operator (``operator<<``)
  (`#201 <https://github.com/fmtlib/fmt/issues/201>`_):

  .. code:: c++

    fmt::printf("The date is %s", Date(2012, 12, 9));

* [Breaking] The ``Buffer`` template is now part of the public API and can be used
  to implement custom memory buffers
  (`#140 <https://github.com/fmtlib/fmt/issues/140>`_).
  Thanks to `@polyvertex (Jean-Charles Lefebvre) <https://github.com/polyvertex>`_.

* [Breaking] Improved compatibility between ``BasicStringRef`` and
  `std::experimental::basic_string_view
  <http://en.cppreference.com/w/cpp/experimental/basic_string_view>`_
  (`#100 <https://github.com/fmtlib/fmt/issues/100>`_,
  `#159 <https://github.com/fmtlib/fmt/issues/159>`_,
  `#183 <https://github.com/fmtlib/fmt/issues/183>`_):

  - Comparison operators now compare string content, not pointers
  - ``BasicStringRef::c_str`` replaced by ``BasicStringRef::data``
  - ``BasicStringRef`` is no longer assumed to be null-terminated

  References to null-terminated strings are now represented by a new class,
  ``BasicCStringRef``.

* Dependency on pthreads introduced by Google Test is now optional
  (`#185 <https://github.com/fmtlib/fmt/issues/185>`_).

* New CMake options ``FMT_DOC``, ``FMT_INSTALL`` and ``FMT_TEST`` to control
  generation of ``doc``, ``install`` and ``test`` targets respectively, on by default
  (`#197 <https://github.com/fmtlib/fmt/issues/197>`_,
  `#198 <https://github.com/fmtlib/fmt/issues/198>`_,
  `#200 <https://github.com/fmtlib/fmt/issues/200>`_).
  Thanks to `@maddinat0r (Alex Martin) <https://github.com/maddinat0r>`_.

* ``noexcept`` is now used when compiling with MSVC2015
  (`#215 <https://github.com/fmtlib/fmt/pull/215>`_).
  Thanks to `@dmkrepo (Dmitriy) <https://github.com/dmkrepo>`_.

* Added an option to disable use of ``windows.h`` when ``FMT_USE_WINDOWS_H``
  is defined as 0 before including ``format.h``
  (`#171 <https://github.com/fmtlib/fmt/issues/171>`_).
  Thanks to `@alfps (Alf P. Steinbach) <https://github.com/alfps>`_.

* [Breaking] ``windows.h`` is now included with ``NOMINMAX`` unless
  ``FMT_WIN_MINMAX`` is defined. This is done to prevent breaking code using
  ``std::min`` and ``std::max`` and only affects the header-only configuration
  (`#152 <https://github.com/fmtlib/fmt/issues/152>`_,
  `#153 <https://github.com/fmtlib/fmt/pull/153>`_,
  `#154 <https://github.com/fmtlib/fmt/pull/154>`_).
  Thanks to `@DevO2012 <https://github.com/DevO2012>`_.

* Improved support for custom character types
  (`#171 <https://github.com/fmtlib/fmt/issues/171>`_).
  Thanks to `@alfps (Alf P. Steinbach) <https://github.com/alfps>`_.

* Added an option to disable use of IOStreams when ``FMT_USE_IOSTREAMS``
  is defined as 0 before including ``format.h``
  (`#205 <https://github.com/fmtlib/fmt/issues/205>`_,
  `#208 <https://github.com/fmtlib/fmt/pull/208>`_).
  Thanks to `@JodiTheTigger <https://github.com/JodiTheTigger>`_.

* Improved detection of ``isnan``, ``isinf`` and ``signbit``.

Optimization
~~~~~~~~~~~~

* Made formatting of user-defined types more efficient with a custom stream buffer
  (`#92 <https://github.com/fmtlib/fmt/issues/92>`_,
  `#230 <https://github.com/fmtlib/fmt/pull/230>`_).
  Thanks to `@NotImplemented <https://github.com/NotImplemented>`_.

* Further improved performance of ``fmt::Writer`` on integer formatting
  and fixed a minor regression. Now it is ~7% faster than ``karma::generate``
  on Karma's benchmark
  (`#186 <https://github.com/fmtlib/fmt/issues/186>`_).

* [Breaking] Reduced `compiled code size
  <https://github.com/fmtlib/fmt#compile-time-and-code-bloat>`_
  (`#143 <https://github.com/fmtlib/fmt/issues/143>`_,
  `#149 <https://github.com/fmtlib/fmt/pull/149>`_).

Distribution
~~~~~~~~~~~~

* [Breaking] Headers are now installed in
  ``${CMAKE_INSTALL_PREFIX}/include/cppformat``
  (`#178 <https://github.com/fmtlib/fmt/issues/178>`_).
  Thanks to `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.

* [Breaking] Changed the library name from ``format`` to ``cppformat``
  for consistency with the project name and to avoid potential conflicts
  (`#178 <https://github.com/fmtlib/fmt/issues/178>`_).
  Thanks to `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.

* C++ Format is now available in `Debian <https://www.debian.org/>`_ GNU/Linux
  (`stretch <https://packages.debian.org/source/stretch/cppformat>`_,
  `sid <https://packages.debian.org/source/sid/cppformat>`_) and 
  derived distributions such as
  `Ubuntu <https://launchpad.net/ubuntu/+source/cppformat>`_ 15.10 and later
  (`#155 <https://github.com/fmtlib/fmt/issues/155>`_)::

    $ sudo apt-get install libcppformat1-dev

  Thanks to `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.

* `Packages for Fedora and RHEL <https://admin.fedoraproject.org/pkgdb/package/cppformat/>`_
  are now available. Thanks to Dave Johansen.
  
* C++ Format can now be installed via `Homebrew <http://brew.sh/>`_ on OS X
  (`#157 <https://github.com/fmtlib/fmt/issues/157>`_)::

    $ brew install cppformat

  Thanks to `@ortho <https://github.com/ortho>`_, Anatoliy Bulukin.

Documentation
~~~~~~~~~~~~~

* Migrated from ReadTheDocs to GitHub Pages for better responsiveness
  and reliability
  (`#128 <https://github.com/fmtlib/fmt/issues/128>`_).
  New documentation address is http://cppformat.github.io/.


* Added `Building the documentation
  <https://fmt.dev/2.0.0/usage.html#building-the-documentation>`_
  section to the documentation.

* Documentation build script is now compatible with Python 3 and newer pip versions.
  (`#189 <https://github.com/fmtlib/fmt/pull/189>`_,
  `#209 <https://github.com/fmtlib/fmt/issues/209>`_).
  Thanks to `@JodiTheTigger <https://github.com/JodiTheTigger>`_ and
  `@xentec <https://github.com/xentec>`_.
  
* Documentation fixes and improvements
  (`#36 <https://github.com/fmtlib/fmt/issues/36>`_,
  `#75 <https://github.com/fmtlib/fmt/issues/75>`_,
  `#125 <https://github.com/fmtlib/fmt/issues/125>`_,
  `#160 <https://github.com/fmtlib/fmt/pull/160>`_,
  `#161 <https://github.com/fmtlib/fmt/pull/161>`_,
  `#162 <https://github.com/fmtlib/fmt/issues/162>`_,
  `#165 <https://github.com/fmtlib/fmt/issues/165>`_,
  `#210 <https://github.com/fmtlib/fmt/issues/210>`_).
  Thanks to `@syohex (Syohei YOSHIDA) <https://github.com/syohex>`_ and
  bug reporters.

* Fixed out-of-tree documentation build
  (`#177 <https://github.com/fmtlib/fmt/issues/177>`_).
  Thanks to `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.

Fixes
~~~~~

* Fixed ``initializer_list`` detection
  (`#136 <https://github.com/fmtlib/fmt/issues/136>`_).
  Thanks to `@Gachapen (Magnus Bjerke Vik) <https://github.com/Gachapen>`_.

* [Breaking] Fixed formatting of enums with numeric format specifiers in
  ``fmt::(s)printf`` 
  (`#131 <https://github.com/fmtlib/fmt/issues/131>`_,
  `#139 <https://github.com/fmtlib/fmt/issues/139>`_):

  .. code:: c++

    enum { ANSWER = 42 };
    fmt::printf("%d", ANSWER);

  Thanks to `@Naios <https://github.com/Naios>`_.

* Improved compatibility with old versions of MinGW
  (`#129 <https://github.com/fmtlib/fmt/issues/129>`_,
  `#130 <https://github.com/fmtlib/fmt/pull/130>`_,
  `#132 <https://github.com/fmtlib/fmt/issues/132>`_).
  Thanks to `@cstamford (Christopher Stamford) <https://github.com/cstamford>`_.

* Fixed a compile error on MSVC with disabled exceptions
  (`#144 <https://github.com/fmtlib/fmt/issues/144>`_).

* Added a workaround for broken implementation of variadic templates in MSVC2012
  (`#148 <https://github.com/fmtlib/fmt/issues/148>`_).

* Placed the anonymous namespace within ``fmt`` namespace for the header-only
  configuration
  (`#171 <https://github.com/fmtlib/fmt/issues/171>`_).
  Thanks to `@alfps (Alf P. Steinbach) <https://github.com/alfps>`_.

* Fixed issues reported by Coverity Scan
  (`#187 <https://github.com/fmtlib/fmt/issues/187>`_,
  `#192 <https://github.com/fmtlib/fmt/issues/192>`_).

* Implemented a workaround for a name lookup bug in MSVC2010
  (`#188 <https://github.com/fmtlib/fmt/issues/188>`_).

* Fixed compiler warnings
  (`#95 <https://github.com/fmtlib/fmt/issues/95>`_,
  `#96 <https://github.com/fmtlib/fmt/issues/96>`_,
  `#114 <https://github.com/fmtlib/fmt/pull/114>`_,
  `#135 <https://github.com/fmtlib/fmt/issues/135>`_,
  `#142 <https://github.com/fmtlib/fmt/issues/142>`_,
  `#145 <https://github.com/fmtlib/fmt/issues/145>`_,
  `#146 <https://github.com/fmtlib/fmt/issues/146>`_,
  `#158 <https://github.com/fmtlib/fmt/issues/158>`_,
  `#163 <https://github.com/fmtlib/fmt/issues/163>`_,
  `#175 <https://github.com/fmtlib/fmt/issues/175>`_,
  `#190 <https://github.com/fmtlib/fmt/issues/190>`_,
  `#191 <https://github.com/fmtlib/fmt/pull/191>`_,
  `#194 <https://github.com/fmtlib/fmt/issues/194>`_,
  `#196 <https://github.com/fmtlib/fmt/pull/196>`_,
  `#216 <https://github.com/fmtlib/fmt/issues/216>`_,
  `#218 <https://github.com/fmtlib/fmt/pull/218>`_,
  `#220 <https://github.com/fmtlib/fmt/pull/220>`_,
  `#229 <https://github.com/fmtlib/fmt/pull/229>`_,
  `#233 <https://github.com/fmtlib/fmt/issues/233>`_,
  `#234 <https://github.com/fmtlib/fmt/issues/234>`_,
  `#236 <https://github.com/fmtlib/fmt/pull/236>`_,
  `#281 <https://github.com/fmtlib/fmt/issues/281>`_,
  `#289 <https://github.com/fmtlib/fmt/issues/289>`_).
  Thanks to `@seanmiddleditch (Sean Middleditch) <https://github.com/seanmiddleditch>`_,
  `@dixlorenz (Dix Lorenz) <https://github.com/dixlorenz>`_,
  `@CarterLi (李通洲) <https://github.com/CarterLi>`_,
  `@Naios <https://github.com/Naios>`_,
  `@fmatthew5876 (Matthew Fioravante) <https://github.com/fmatthew5876>`_,
  `@LevskiWeng (Levski Weng) <https://github.com/LevskiWeng>`_,
  `@rpopescu <https://github.com/rpopescu>`_,
  `@gabime (Gabi Melman) <https://github.com/gabime>`_,
  `@cubicool (Jeremy Moles) <https://github.com/cubicool>`_,
  `@jkflying (Julian Kent) <https://github.com/jkflying>`_,
  `@LogicalKnight (Sean L) <https://github.com/LogicalKnight>`_,
  `@inguin (Ingo van Lil) <https://github.com/inguin>`_ and
  `@Jopie64 (Johan) <https://github.com/Jopie64>`_.

* Fixed portability issues (mostly causing test failures) on ARM, ppc64, ppc64le,
  s390x and SunOS 5.11 i386
  (`#138 <https://github.com/fmtlib/fmt/issues/138>`_,
  `#179 <https://github.com/fmtlib/fmt/issues/179>`_,
  `#180 <https://github.com/fmtlib/fmt/issues/180>`_,
  `#202 <https://github.com/fmtlib/fmt/issues/202>`_,
  `#225 <https://github.com/fmtlib/fmt/issues/225>`_,
  `Red Hat Bugzilla Bug 1260297 <https://bugzilla.redhat.com/show_bug.cgi?id=1260297>`_).
  Thanks to `@Naios <https://github.com/Naios>`_,
  `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_ and Dave Johansen.

* Fixed a name conflict with macro ``free`` defined in
  ``crtdbg.h`` when ``_CRTDBG_MAP_ALLOC`` is set
  (`#211 <https://github.com/fmtlib/fmt/issues/211>`_).

* Fixed shared library build on OS X
  (`#212 <https://github.com/fmtlib/fmt/pull/212>`_).
  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.

* Fixed an overload conflict on MSVC when ``/Zc:wchar_t-`` option is specified
  (`#214 <https://github.com/fmtlib/fmt/pull/214>`_).
  Thanks to `@slavanap (Vyacheslav Napadovsky) <https://github.com/slavanap>`_.

* Improved compatibility with MSVC 2008
  (`#236 <https://github.com/fmtlib/fmt/pull/236>`_).
  Thanks to `@Jopie64 (Johan) <https://github.com/Jopie64>`_.

* Improved compatibility with bcc32
  (`#227 <https://github.com/fmtlib/fmt/issues/227>`_).

* Fixed ``static_assert`` detection on Clang
  (`#228 <https://github.com/fmtlib/fmt/pull/228>`_).
  Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.

1.1.0 - 2015-03-06
------------------

* Added ``BasicArrayWriter``, a class template that provides operations for
  formatting and writing data into a fixed-size array
  (`#105 <https://github.com/fmtlib/fmt/issues/105>`_ and
  `#122 <https://github.com/fmtlib/fmt/issues/122>`_):

  .. code:: c++
  
    char buffer[100];
    fmt::ArrayWriter w(buffer);
    w.write("The answer is {}", 42);

* Added `0 A.D. <http://play0ad.com/>`_ and `PenUltima Online (POL)
  <http://www.polserver.com/>`_ to the list of notable projects using C++ Format.

* C++ Format now uses MSVC intrinsics for better formatting performance
  (`#115 <https://github.com/fmtlib/fmt/pull/115>`_,
  `#116 <https://github.com/fmtlib/fmt/pull/116>`_,
  `#118 <https://github.com/fmtlib/fmt/pull/118>`_ and
  `#121 <https://github.com/fmtlib/fmt/pull/121>`_).
  Previously these optimizations where only used on GCC and Clang.
  Thanks to `@CarterLi <https://github.com/CarterLi>`_ and
  `@objectx <https://github.com/objectx>`_.

* CMake install target (`#119 <https://github.com/fmtlib/fmt/pull/119>`_).
  Thanks to `@TrentHouliston <https://github.com/TrentHouliston>`_.

  You can now install C++ Format with ``make install`` command.

* Improved `Biicode <http://www.biicode.com/>`_ support
  (`#98 <https://github.com/fmtlib/fmt/pull/98>`_ and
  `#104 <https://github.com/fmtlib/fmt/pull/104>`_). Thanks to
  `@MariadeAnton <https://github.com/MariadeAnton>`_ and
  `@franramirez688 <https://github.com/franramirez688>`_.

* Improved support for building with `Android NDK
  <https://developer.android.com/tools/sdk/ndk/index.html>`_
  (`#107 <https://github.com/fmtlib/fmt/pull/107>`_).
  Thanks to `@newnon <https://github.com/newnon>`_.
  
  The `android-ndk-example <https://github.com/fmtlib/android-ndk-example>`_
  repository provides and example of using C++ Format with Android NDK:

  .. image:: https://raw.githubusercontent.com/fmtlib/android-ndk-example/
            master/screenshot.png

* Improved documentation of ``SystemError`` and ``WindowsError``
  (`#54 <https://github.com/fmtlib/fmt/issues/54>`_).

* Various code improvements
  (`#110 <https://github.com/fmtlib/fmt/pull/110>`_,
  `#111 <https://github.com/fmtlib/fmt/pull/111>`_
  `#112 <https://github.com/fmtlib/fmt/pull/112>`_).
  Thanks to `@CarterLi <https://github.com/CarterLi>`_.

* Improved compile-time errors when formatting wide into narrow strings
  (`#117 <https://github.com/fmtlib/fmt/issues/117>`_).

* Fixed ``BasicWriter::write`` without formatting arguments when C++11 support
  is disabled (`#109 <https://github.com/fmtlib/fmt/issues/109>`_).

* Fixed header-only build on OS X with GCC 4.9
  (`#124 <https://github.com/fmtlib/fmt/issues/124>`_).

* Fixed packaging issues (`#94 <https://github.com/fmtlib/fmt/issues/94>`_).

* Added `changelog <https://github.com/fmtlib/fmt/blob/master/ChangeLog.rst>`_
  (`#103 <https://github.com/fmtlib/fmt/issues/103>`_).

1.0.0 - 2015-02-05
------------------

* Add support for a header-only configuration when ``FMT_HEADER_ONLY`` is
  defined before including ``format.h``:

  .. code:: c++

    #define FMT_HEADER_ONLY
    #include "format.h"

* Compute string length in the constructor of ``BasicStringRef``
  instead of the ``size`` method
  (`#79 <https://github.com/fmtlib/fmt/issues/79>`_).
  This eliminates size computation for string literals on reasonable optimizing
  compilers.

* Fix formatting of types with overloaded ``operator <<`` for ``std::wostream``
  (`#86 <https://github.com/fmtlib/fmt/issues/86>`_):

  .. code:: c++

    fmt::format(L"The date is {0}", Date(2012, 12, 9));

* Fix linkage of tests on Arch Linux
  (`#89 <https://github.com/fmtlib/fmt/issues/89>`_).

* Allow precision specifier for non-float arguments
  (`#90 <https://github.com/fmtlib/fmt/issues/90>`_):

  .. code:: c++

    fmt::print("{:.3}\n", "Carpet"); // prints "Car"

* Fix build on Android NDK
  (`#93 <https://github.com/fmtlib/fmt/issues/93>`_)

* Improvements to documentation build procedure.

* Remove ``FMT_SHARED`` CMake variable in favor of standard `BUILD_SHARED_LIBS
  <http://www.cmake.org/cmake/help/v3.0/variable/BUILD_SHARED_LIBS.html>`_.

* Fix error handling in ``fmt::fprintf``.

* Fix a number of warnings.

0.12.0 - 2014-10-25
-------------------

* [Breaking] Improved separation between formatting and buffer management.
  ``Writer`` is now a base class that cannot be instantiated directly.
  The new ``MemoryWriter`` class implements the default buffer management
  with small allocations done on stack. So ``fmt::Writer`` should be replaced
  with ``fmt::MemoryWriter`` in variable declarations.

  Old code:

  .. code:: c++

    fmt::Writer w;

  New code: 

  .. code:: c++

    fmt::MemoryWriter w;

  If you pass ``fmt::Writer`` by reference, you can continue to do so:

  .. code:: c++

      void f(fmt::Writer &w);

  This doesn't affect the formatting API.

* Support for custom memory allocators
  (`#69 <https://github.com/fmtlib/fmt/issues/69>`_)

* Formatting functions now accept `signed char` and `unsigned char` strings as
  arguments (`#73 <https://github.com/fmtlib/fmt/issues/73>`_):

  .. code:: c++

    auto s = format("GLSL version: {}", glGetString(GL_VERSION));

* Reduced code bloat. According to the new `benchmark results
  <https://github.com/fmtlib/fmt#compile-time-and-code-bloat>`_,
  cppformat is close to ``printf`` and by the order of magnitude better than
  Boost Format in terms of compiled code size.

* Improved appearance of the documentation on mobile by using the `Sphinx
  Bootstrap theme <http://ryan-roemer.github.io/sphinx-bootstrap-theme/>`_:

  .. |old| image:: https://cloud.githubusercontent.com/assets/576385/4792130/
                   cd256436-5de3-11e4-9a62-c077d0c2b003.png

  .. |new| image:: https://cloud.githubusercontent.com/assets/576385/4792131/
                   cd29896c-5de3-11e4-8f59-cac952942bf0.png
  
  +-------+-------+
  |  Old  |  New  |
  +-------+-------+
  | |old| | |new| |
  +-------+-------+

0.11.0 - 2014-08-21
-------------------

* Safe printf implementation with a POSIX extension for positional arguments:

  .. code:: c++

    fmt::printf("Elapsed time: %.2f seconds", 1.23);
    fmt::printf("%1$s, %3$d %2$s", weekday, month, day);

* Arguments of ``char`` type can now be formatted as integers
  (Issue `#55 <https://github.com/fmtlib/fmt/issues/55>`_):

  .. code:: c++

    fmt::format("0x{0:02X}", 'a');

* Deprecated parts of the API removed.

* The library is now built and tested on MinGW with Appveyor in addition to
  existing test platforms Linux/GCC, OS X/Clang, Windows/MSVC.

0.10.0 - 2014-07-01
-------------------

**Improved API**

* All formatting methods are now implemented as variadic functions instead
  of using ``operator<<`` for feeding arbitrary arguments into a temporary
  formatter object. This works both with C++11 where variadic templates are
  used and with older standards where variadic functions are emulated by
  providing lightweight wrapper functions defined with the ``FMT_VARIADIC``
  macro. You can use this macro for defining your own portable variadic
  functions:

  .. code:: c++

    void report_error(const char *format, const fmt::ArgList &args) {
      fmt::print("Error: {}");
      fmt::print(format, args);
    }
    FMT_VARIADIC(void, report_error, const char *)

    report_error("file not found: {}", path);

  Apart from a more natural syntax, this also improves performance as there
  is no need to construct temporary formatter objects and control arguments'
  lifetimes. Because the wrapper functions are very lightweight, this doesn't
  cause code bloat even in pre-C++11 mode.

* Simplified common case of formatting an ``std::string``. Now it requires a
  single function call:

  .. code:: c++

    std::string s = format("The answer is {}.", 42);

  Previously it required 2 function calls:

  .. code:: c++

    std::string s = str(Format("The answer is {}.") << 42);

  Instead of unsafe ``c_str`` function, ``fmt::Writer`` should be used directly
  to bypass creation of ``std::string``:

  .. code:: c++

    fmt::Writer w;
    w.write("The answer is {}.", 42);
    w.c_str();  // returns a C string

  This doesn't do dynamic memory allocation for small strings and is less error
  prone as the lifetime of the string is the same as for ``std::string::c_str``
  which is well understood (hopefully).

* Improved consistency in naming functions that are a part of the public API.
  Now all public functions are lowercase following the standard library
  conventions. Previously it was a combination of lowercase and
  CapitalizedWords.
  Issue `#50 <https://github.com/fmtlib/fmt/issues/50>`_.

* Old functions are marked as deprecated and will be removed in the next
  release.

**Other Changes**

* Experimental support for printf format specifications (work in progress):

  .. code:: c++

    fmt::printf("The answer is %d.", 42);
    std::string s = fmt::sprintf("Look, a %s!", "string");

* Support for hexadecimal floating point format specifiers ``a`` and ``A``:

  .. code:: c++

    print("{:a}", -42.0); // Prints -0x1.5p+5
    print("{:A}", -42.0); // Prints -0X1.5P+5

* CMake option ``FMT_SHARED`` that specifies whether to build format as a
  shared library (off by default).

0.9.0 - 2014-05-13
------------------

* More efficient implementation of variadic formatting functions.

* ``Writer::Format`` now has a variadic overload:

  .. code:: c++

    Writer out;
    out.Format("Look, I'm {}!", "variadic");

* For efficiency and consistency with other overloads, variadic overload of
  the ``Format`` function now returns ``Writer`` instead of ``std::string``.
  Use the ``str`` function to convert it to ``std::string``:

  .. code:: c++

    std::string s = str(Format("Look, I'm {}!", "variadic"));

* Replaced formatter actions with output sinks: ``NoAction`` -> ``NullSink``,
  ``Write`` -> ``FileSink``, ``ColorWriter`` -> ``ANSITerminalSink``.
  This improves naming consistency and shouldn't affect client code unless
  these classes are used directly which should be rarely needed.

* Added ``ThrowSystemError`` function that formats a message and throws
  ``SystemError`` containing the formatted message and system-specific error
  description. For example, the following code

  .. code:: c++

    FILE *f = fopen(filename, "r");
    if (!f)
      ThrowSystemError(errno, "Failed to open file '{}'") << filename;

  will throw ``SystemError`` exception with description
  "Failed to open file '<filename>': No such file or directory" if file
  doesn't exist.

* Support for AppVeyor continuous integration platform.

* ``Format`` now throws ``SystemError`` in case of I/O errors.

* Improve test infrastructure. Print functions are now tested by redirecting
  the output to a pipe.

0.8.0 - 2014-04-14
------------------

* Initial release
