Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Releases: fmtlib/fmt

12.1.0

29 Oct 14:58

Choose a tag to compare

12.0.0

17 Sep 16:49

Choose a tag to compare

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

11.2.0

03 May 16:40

Choose a tag to compare

  • Added the s specifier for std::error_code. It allows formatting an error message as a string. For example:

    #include <fmt/std.h>
    
    int main() {
      auto ec = std::make_error_code(std::errc::no_such_file_or_directory);
      fmt::print("{:s}\n", ec);
    }

    prints

    No such file or directory
    

    (The actual message is platform-specific.)

  • Fixed formatting of std::chrono::local_time and tm (#3815, #4350). For example (godbolt):

    #include <fmt/chrono.h>
    
    int main() {
      std::chrono::zoned_time zt(
        std::chrono::current_zone(),
        std::chrono::system_clock::now());
      fmt::print("{}", zt.get_local_time());
    }

    is now formatted consistenly across platforms.

  • Added diagnostics for cases when timezone information is not available. For example:

    fmt::print("{:Z}", std::chrono::local_seconds());

    now gives a compile-time error.

  • Deprecated fmt::localtime in favor of std::localtime.

  • Fixed compilation with GCC 15 and C++20 modules enabled (#4347). Thanks @tkhyn.

  • Fixed handling of named arguments in format specs (#4360, #4361). Thanks @dinomight.

  • Added error reporting for duplicate named arguments (#4367). Thanks @dinomight.

  • Fixed formatting of long with FMT_BUILTIN_TYPES=0 (#4375, #4394).

  • Optimized text_style using bit packing (#4363). Thanks @localspook.

  • Added support for incomplete types (#3180, #4383). Thanks @localspook.

  • Fixed a flush issue in fmt::print when using libstdc++ (#4398).

  • Fixed fmt::println usage with FMT_ENFORCE_COMPILE_STRING and legacy compile-time checks (#4407). Thanks @madmaxoft.

  • Removed legacy header fmt/core.h from docs (#4421, #4422). Thanks @krzysztofkortas.

  • Worked around limitations of __builtin_strlen during constant evaluation (#4423, #4429). Thanks @brevzin.

  • Worked around a bug in MSVC v141 (#4412, #4413). Thanks @hirohira9119.

  • Removed the fmt_detail namespace (#4324).

  • Removed specializations of std::is_floating_point in tests (#4417).

  • Fixed a CMake error when setting CMAKE_MODULE_PATH in the pedantic mode (#4426). Thanks @rlalik.

  • Updated the Bazel config (#4400). Thanks @Vertexwahn.

11.1.4

26 Feb 18:33

Choose a tag to compare

  • Fixed ABI compatibility with earlier 11.x versions on Windows (#4359).

  • Improved the logic of switching between fixed and exponential format for float (#3649).

  • Moved is_compiled_string to the public API (#4342). Thanks @SwooshyCueb.

  • Simplified implementation of operator""_cf (#4349). Thanks @localspook.

  • Fixed __builtin_strlen detection (#4329). Thanks @localspook.

  • Fixed handling of BMI paths with the Ninja generator (#4344). Thanks @tkhyn.

  • Fixed gcc 8.3 compile errors (#4331, #4336). Thanks @sergiud.

  • Fixed a bogus MSVC warning (#4356). Thanks @dinomight.

11.1.3

26 Jan 14:46

Choose a tag to compare

  • Fixed compilation on GCC 9.4 (#4313).

  • Worked around an internal compiler error when using C++20 modules with GCC 14.2 and earlier (#4295).

  • Worked around a bug in GCC 6 (#4318).

  • Fixed an issue caused by instantiating formatter<const T> (#4303, #4325). Thanks @timsong-cpp.

  • Fixed formatting into std::ostreambuf_iterator when using format string compilation (#4309, #4312). Thanks @phprus.

  • Restored a constraint on the map formatter so that it correctly reports as unformattable when the element is (#4326). Thanks @timsong-cpp.

  • Reduced the size of format specs (#4298).

  • Readded args() to fmt::format_context (#4307, #4310). Thanks @Erroneous1.

  • Fixed a bogus MSVC warning (#4314, #4322). Thanks @ZehMatt.

  • Fixed a pedantic mode error in the CMake config (#4327). Thanks @rlalik.

11.1.2

12 Jan 16:28

Choose a tag to compare

11.1.1

27 Dec 16:53

Choose a tag to compare

  • Fixed ABI compatibility with earlier 11.x versions (#4278).

  • Defined CMake components (core and doc) to allow docs to be installed separately (#4276). Thanks @carlsmedstad.

11.1.0

25 Dec 17:03

Choose a tag to compare

  • Improved C++20 module support (#4081, #4083, #4084, #4152, #4153, #4169, #4190, #4234, #4239). Thanks @kamrann and @Arghnews.

  • Reduced debug (unoptimized) binary code size and the number of template instantiations when passing formatting arguments. For example, unoptimized binary code size for fmt::print("{}", 42) was reduced by ~40% on GCC and ~60% on clang (x86-64).

    GCC:

    • Before: 161 instructions of which 105 are in reusable functions (godbolt).
    • After: 116 instructions of which 60 are in reusable functions (godbolt).

    Clang:

    • Before: 310 instructions of which 251 are in reusable functions (godbolt).
    • After: 194 instructions of which 135 are in reusable functions (godbolt).
  • Added an experimental fmt::writer API that can be used for writing to different destinations such as files or strings (#2354). For example (godbolt):

    #include <fmt/os.h>
    
    void write_text(fmt::writer w) {
      w.print("The answer is {}.", 42);
    }
    
    int main() {
      // Write to FILE.
      write_text(stdout);
    
      // Write to fmt::ostream.
      auto f = fmt::output_file("myfile");
      write_text(f);
    
      // Write to std::string.
      auto sb = fmt::string_buffer();
      write_text(sb);
      std::string s = sb.str();
    }
  • Added width and alignment support to the formatter of std::error_code.

  • Made std::expected<void, E> formattable (#4145, #4148). For example (godbolt):

    fmt::print("{}", std::expected<void, int>());

    prints

    expected()
    

    Thanks @phprus.

  • Made fmt::is_formattable<void> SFINAE-friendly (#4147).

  • Added support for _BitInt formatting when using clang (#4007, #4072, #4140, #4173, #4176). For example (godbolt):

    using int42 = _BitInt(42);
    fmt::print("{}", int42(100));

    Thanks @Arghnews.

  • Added the n specifier for tuples and pairs (#4107). Thanks @someonewithpc.

  • Added support for tuple-like types to fmt::join (#4226, #4230). Thanks @phprus.

  • Made more types formattable at compile time (#4127). Thanks @AnthonyVH.

  • Implemented a more efficient compile-time fmt::formatted_size (#4102, #4103). Thanks @phprus.

  • Fixed compile-time formatting of some string types (#4065). Thanks @torshepherd.

  • Made compiled version of fmt::format_to work with std::back_insert_iterator<std::vector<char>> (#4206, #4211). Thanks @phprus.

  • Added a formatter for std::reference_wrapper (#4163, #4164). Thanks @yfeldblum and @phprus.

  • Added experimental padding support (glibc strftime extension) to %m, %j and %Y (#4161). Thanks @KKhanhH.

  • Made microseconds formatted as us instead of Β΅s if the Unicode support is disabled (#4088).

  • Fixed an unreleased regression in transcoding of surrogate pairs (#4094, #4095). Thanks @phprus.

  • Made fmt::appender satisfy std::output_iterator concept (#4092, #4093). Thanks @phprus.

  • Made std::iterator_traits<fmt::appender> standard-conforming (#4185). Thanks @CaseyCarter.

  • Made it easier to reuse fmt::formatter<std::string_view> for types with an implicit conversion to std::string_view (#4036, #4055). Thanks @Arghnews.

  • Made it possible to disable <filesystem> use via FMT_CPP_LIB_FILESYSTEM for compatibility with some video game console SDKs, e.g. Nintendo Switch SDK (#4257, #4258, #4259). Thanks @W4RH4WK and @phprus.

  • Fixed compatibility with platforms that use 80-bit long double (#4245, #4246). Thanks @jsirpoma.

  • Added support for UTF-32 code units greater than 0xFFFF in fill (#4201).

  • Fixed handling of legacy encodings on Windows with GCC (#4162).

  • Made fmt::to_string take fmt::basic_memory_buffer by const reference (#4261, #4262). Thanks @sascha-devel.

  • Added fmt::dynamic_format_arg_store::size (#4270). Thanks @hannes-harnisch.

  • Removed the ability to control locale usage via an undocumented FMT_STATIC_THOUSANDS_SEPARATOR in favor of FMT_USE_LOCALE.

  • Renamed FMT_EXCEPTIONS to FMT_USE_EXCEPTIONS for consistency with other similar macros.

  • Improved include directory ordering to reduce the chance of including incorrect headers when using multiple versions of {fmt} (#4116). Thanks @cdzhan.

  • Made it possible to compile a subset of {fmt} without the C++ runtime.

  • Improved documentation and README (#4066, #4117, #4203, #4235). Thanks @zyctree and @nikola-sh.

  • Improved the documentation generator (#4110, #4115). Thanks @rturrado.

  • Improved CI (#4155, #4151). Thanks @phprus.

  • Fixed various warnings and compilation issues (#2708, #4091, #4109, #4113, #4125, #4129, #4130, #4131, #4132, #4133, #4144, #4150, #4158, #4159, #4160, #4170, #4177, #4187, #4188, #4194, #4200, #4205, #4207, #4208, #4210, #4220, #4231, #4232, #4233, #4236, #4267, #4271). Thanks @torsten48, @Arghnews, @tinfoilboy, @aminya, @Ottani, @zeroomega, @c4v4, @kongy, @vinayyadav3016, @sergio-nsk, @phprus and @YexuanXiao.

11.0.2

20 Jul 14:32

Choose a tag to compare

  • Fixed compatibility with non-POSIX systems (#4054, #4060).

  • Fixed performance regressions when using std::back_insert_iterator with fmt::format_to (#4070).

  • Fixed handling of std::generator and move-only iterators (#4053, #4057). Thanks @Arghnews.

  • Made formatter<std::string_view>::parse work with types convertible to std::string_view (#4036, #4055). Thanks @Arghnews.

  • Made volatile void* formattable (#4049, #4056). Thanks @Arghnews.

  • Made Glib::ustring not be confused with std::string (#4052).

  • Made fmt::context iterator compatible with STL algorithms that rely on iterator category (#4079).

11.0.1

05 Jul 16:12

Choose a tag to compare

  • Fixed version number in the inline namespace (#4047).

  • Fixed disabling Unicode support via CMake (#4051).

  • Fixed deprecated visit_format_arg (#4043). Thanks @nebkat.

  • Fixed handling of a sign and improved the std::complex formater (#4034, #4050). Thanks @tesch1 and @phprus.

  • Fixed ADL issues in fmt::printf when using C++20 (#4042). Thanks @toge.

  • Removed a redundant check in the formatter for std::expected (#4040). Thanks @phprus.