Skip to content

Releases: fmtlib/fmt

6.2.1

09 May 16:54

Choose a tag to compare

  • Fixed ostream support in sprintf (#1631).

  • Fixed type detection when using implicit conversion to string_view and ostream operator<< inconsistently (#1662).

6.2.0

06 Apr 13:13

Choose a tag to compare

6.1.2

11 Dec 16:25

Choose a tag to compare

6.1.1

05 Dec 15:15

Choose a tag to compare

6.1.0

02 Dec 14:15

Choose a tag to compare

6.0.0

26 Aug 13:59

Choose a tag to compare

Read more

5.3.0

28 Dec 20:36

Choose a tag to compare

  • Introduced experimental chrono formatting support:

    #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, #967, #973):

    #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:

    Thanks @Rakete1111 (Nicolas).

  • Added support for 4-bit terminal colors (#968, #974)

    #include <fmt/color.h>
    
    int main() {
      print(fg(fmt::terminal_color::red), "stop\n");
    }

    Note that these colors vary by terminal:Thanks @Rakete1111 (Nicolas).

  • Parameterized formatting functions on the type of the format string (#880, #881, #883, #885, #897, #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:

    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).

  • Made std::string_view work as a format string (#898):

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

    Thanks @DanielaE (Daniela Engert).

  • Added wide string support to compile-time format string checks (#924):

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

    Thanks @XZiar.

  • Made colored print functions work with wide strings (#867):

    #include <fmt/color.h>
    
    int main() {
      print(fg(fmt::color::red), L"{}\n", 42);
    }

    Thanks @DanielaE (Daniela Engert).

  • Introduced experimental Unicode support (#628, #891):

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

    #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). Thanks @DanielaE (Daniela Engert).

  • Added make_printf_args and make_wprintf_args functions (#934). Thanks @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, #902). Thanks @superfunc (hollywood programmer).

  • Disallowed repeated leading zeros in an argument ID:

    fmt::print("{000}", 42); // error
  • Reintroduced support for gcc 4.4.

  • Fixed compilation on platforms with exotic double (#878).

  • Improved documentation (#164, #877, #901, #906, #979). Thanks @kookjr (Mathew Cucuzella), @DarkDimius (Dmitry Petrashko), @HecticSerenity.

  • Added pkgconfig support which makes it easier to consume the library from meson and other build systems (#916). Thanks @colemickens (Cole Mickens).

  • Various build improvements (#909, #926, #937, #953, #959). Thanks @tchaikov (Kefu Chai), @luncliff (Park DongHa), @AndreasSchoenle (Andreas Schönle), @hotwatermorning, @Zefz (JohanJansen).

  • Improved string_view construction performance (#914). Thanks @gabime (Gabi Melman).

  • Fixed non-matching char types (#895). Thanks @DanielaE (Daniela Engert).

  • Fixed format_to_n with std::back_insert_iterator (#913). Thanks @DanielaE (Daniela Engert).

  • Fixed locale-dependent formatting (#905).

  • Fixed various compiler warnings and errors (#882, #886, #933, #941, #931, #943, #954, #956, #962, #965, #977, #983, #989). Thanks @Luthaf (Guillaume Fraux), @stevenhoving (Steven Hoving), @christinaa (Kristina Brooks), @lgritz (Larry Gritz), @DanielaE (Daniela Engert), @0x8000-0000 (Sign Bit), @liuping1997.

5.2.1

21 Sep 20:48

Choose a tag to compare

5.2.0

13 Sep 14:35

Choose a tag to compare

  • 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:

    #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):

    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:

    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, #819). Thanks @MikePopoloski (Michael Popoloski).

  • Reduced executable size overhead for embedded targets using newlib nano by making locale dependency optional (#839). Thanks @teajay-fr (Thomas Benard).

  • Keep noexcept specifier when exceptions are disabled (#801, #810). Thanks @qis (Alexej Harm).

  • Fixed formatting of user-defined types providing operator<< with format_to_n (#806). Thanks @mkurdej (Marek Kurdej).

  • Fixed dynamic linkage of new symbols (#808).

  • Fixed global initialization issue (#807):

    // This works on compilers with constexpr support.
    static const std::string answer = fmt::format("{}", 42);
  • Fixed various compiler warnings and errors (#804, #809, #811, #822, #827, #830, #838, #843, #844, #851, #852, #854). Thanks @henryiii (Henry Schreiner), @medithe, and @eliasdaler (Elias Daler).

5.1.0

05 Jul 13:25

Choose a tag to compare

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

    #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 #767). Thanks @Remotion (Remo).

  • Added quotes to strings in ranges and tuples (#766). Thanks @Remotion (Remo).

  • Made format_to work with basic_memory_buffer (#776).

  • Added vformat_to_n and wchar_t overload of format_to_n (#764, #769).

  • Made is_range and is_tuple_like part of public (experimental) API to allow specialization for user-defined types (#751, #759). Thanks @drrlvn (Dror Levin).

  • Added more compilers to continuous integration and increased FMT_PEDANTIC warning levels (#736). Thanks @eliaskosunen (Elias Kosunen).

  • Fixed compilation with MSVC 2013.

  • Fixed handling of user-defined types in format_to (#793).

  • Forced linking of inline vformat functions into the library (#795).

  • Fixed incorrect call to on_align in '{:}=' (#750).

  • Fixed floating-point formatting to a non-back_insert_iterator with sign & numeric alignment specified (#756).

  • Fixed formatting to an array with format_to_n (#778).

  • Fixed formatting of more than 15 named arguments (#754).

  • Fixed handling of compile-time strings when including fmt/ostream.h. (#768).

  • Fixed various compiler warnings and errors (#742, #748, #752, #770, #775, #779, #780, #790, #792, #800). Thanks @Remotion (Remo), @gabime (Gabi Melman), @foonathan (Jonathan Müller), @Dark-Passenger (Dhruv Paranjape), and @0x8000-0000 (Sign Bit).