github fmtlib/fmt 12.0.0

9 hours ago
  • Optimized the default floating point formatting (#3675, #4516). In particular, formatting a double with format string compilation into a stack allocated buffer is more than 60% faster in version 12.0 compared to 11.2 according to dtoa-benchmark:

    Function  Time (ns)  Speedup
    fmt11        34.471    1.00x
    fmt12        21.000    1.64x
    
  • Added constexpr support to fmt::format. For example:

    #include <fmt/compile.h>
    
    using namespace fmt::literals;
    std::string s = fmt::format(""_cf, 42);

    now works at compile time provided that std::string supports constexpr (#3403, #4456). Thanks @msvetkin.

  • Added FMT_STATIC_FORMAT that allows formatting into a string of the exact required size at compile time.

    For example:

    #include <fmt/compile.h>
    
    constexpr auto s = FMT_STATIC_FORMAT("{}", 42);

    compiles to just

    __ZL1s:
          .asciiz "42"

    It can be accessed as a C string with s.c_str() or as a string view with s.str().

  • Improved C++20 module support (#4451, #4459, #4476, #4488, #4491, #4495). Thanks @arBmind, @tkhyn, @Mishura4, @anonymouspc and @autoantwort.

  • Switched to using estimated display width in precision. For example:

    fmt::print("|{:.4}|\n|1234|\n", "🐱🐱🐱");

    prints

    because 🐱 has an estimated width of 2 (#4272, #4443, #4475). Thanks @nikhilreddydev and @localspook.

  • Fix interaction between debug presentation, precision, and width for strings (#4478). Thanks @localspook.

  • Implemented allocator propagation on basic_memory_buffer move (#4487, #4490). Thanks @toprakmurat.

  • Fixed an ambiguity between std::reference_wrapper<T> and format_as formatters (#4424, #4434). Thanks @jeremy-rifkin.

  • Removed the following deprecated APIs:

    • has_formatter: use is_formattable instead, - basic_format_args::parse_context_type, basic_format_args::formatter_type and similar aliases in context types, - wide stream overload of fmt::printf, - wide stream overloads of fmt::print that take text styles, - is_*char traits, - fmt::localtime.
  • Deprecated wide overloads of fmt::fprintf and fmt::sprintf.

  • Improved diagnostics for the incorrect usage of fmt::ptr (#4453). Thanks @TobiSchluter.

  • Made handling of ANSI escape sequences more efficient (#4511, #4528). Thanks @localspook and @Anas-Hamdane.

  • Fixed a buffer overflow on all emphasis flags set (#4498). Thanks @dominicpoeschko.

  • Fixed an integer overflow for precision close to the max int value.

  • Fixed compatibility with WASI (#4496, #4497). Thanks @whitequark.

  • Fixed back_insert_iterator detection, preventing a fallback on slower path that handles arbitrary iterators (#4454).

  • Fixed handling of invalid glibc FILE buffers (#4469).

  • Added wchar_t support to the std::byte formatter (#4479, #4480). Thanks @phprus.

  • Changed component prefix from fmt- to fmt_ for compatibility with NSIS/CPack on Windows, e.g. fmt-doc changed to fmt_doc (#4441, #4442). Thanks @n-stein.

  • Added the FMT_CUSTOM_ASSERT_FAIL macro to simplify providing a custom fmt::assert_fail implementation (#4505). Thanks @HazardyKnusperkeks.

  • Switched to FMT_THROW on reporting format errors so that it can be overriden by users when exceptions are disabled (#4521). Thanks @HazardyKnusperkeks.

  • Improved master project detection and disabled install targets when using {fmt} as a subproject by default (#4536). Thanks @crueter.

  • Made various code improvements (#4445, #4448, #4473, #4522). Thanks @localspook, @tchaikov and @way4sahil.

  • Added Conan instructions to the docs (#4537). Thanks @uilianries.

  • Removed Bazel files to avoid issues with downstream packaging (#4530). Thanks @mering.

  • Added more entries for generated files to .gitignore (#4355, #4512). Thanks @dinomight and @localspook.

  • Fixed various warnings and compilation issues (#4447, #4470, #4474, #4477, #4471, #4483, #4515, #4533, #4534). Thanks @dodomorandi, @localspook, @remyjette, @Tomek-Stolarczyk, @Mishura4, @mattiasljungstrom and @FatihBAKIR.

Don't miss a new fmt release

NewReleases is sending notifications on new releases.