All Versions
41
Latest Version
Avg Release Cycle
66 days
Latest Release
601 days ago

Changelog History
Page 2

  • v7.0.3 Changes

    August 06, 2020
    • 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>).

  • v7.0.2 Changes

    July 29, 2020
    • 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>_).

  • v7.0.1 Changes

    July 07, 2020
    • ⚑️ 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.

  • v7.0.0 Changes

    July 05, 2020
    • ⬇️ 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.

    • 0️⃣ 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>.

  • v6.2.1 Changes

    May 09, 2020
    • πŸ›  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>_).

  • v6.2.0 Changes

    April 05, 2020
    • πŸ‘Œ 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>_.

  • v6.1.2 Changes

    December 11, 2019
    • πŸ›  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>.

  • v6.1.1 Changes

    December 04, 2019
    • πŸ›  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.

  • v6.1.0 Changes

    December 01, 2019
    • βœ… {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.

    • 0️⃣ 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>_.

  • v6.0.0 Changes

    August 26, 2019
    • 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.

    • 0️⃣ 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>_.