diff options
Diffstat (limited to 'ChangeLog.rst')
-rw-r--r-- | ChangeLog.rst | 3665 |
1 files changed, 0 insertions, 3665 deletions
diff --git a/ChangeLog.rst b/ChangeLog.rst deleted file mode 100644 index 9c171af0..00000000 --- a/ChangeLog.rst +++ /dev/null @@ -1,3665 +0,0 @@ -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 |