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.
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.
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 pedantic mode error in the CMake config (#4327). Thanks @rlalik.
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.
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:
Clang:
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
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.
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.
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).
Fixed version number in the inline namespace (#4047).
Fixed disabling Unicode support via CMake (#4051).
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.
Added fmt/base.h
which provides a subset of the API with minimal include dependencies and enough functionality to replace all uses of the printf
family of functions. This brings the compile time of code using {fmt} much closer to the equivalent printf
code as shown on the following benchmark that compiles 100 source files:
This gives almost 4x improvement in build speed compared to version 10. Note that the benchmark is purely formatting code and includes. In real projects the difference from printf
will be smaller partly because common standard headers will be included in almost any translation unit (TU) anyway. In particular, in every case except printf
above ~1s is spent in total on including <type_traits>
in all TUs.
Optimized includes in other headers such as fmt/format.h
which is now roughly equivalent to the old fmt/core.h
in terms of build speed.
Migrated the documentation at https://fmt.dev/ from Sphinx to MkDocs.
Improved C++20 module support (#3990, #3991, #3993, #3994, #3997, #3998, #4004, #4005, #4006, #4013, #4027, #4029). In particular, native CMake support for modules is now used if available. Thanks @yujincheng08 and @matt77hias.
Added an option to replace standard includes with import std
enabled via the FMT_IMPORT_STD
macro (#3921, #3928). Thanks @matt77hias.
Exported fmt::range_format
, fmt::range_format_kind
and fmt::compiled_string
from the fmt
module (#3970, #3999). Thanks @matt77hias and @yujincheng08.
Improved integration with stdio in fmt::print
, enabling direct writes into a C stream buffer in common cases. This may give significant performance improvements ranging from tens of percent to 2x and eliminates dynamic memory allocations on the buffer level. It is currently enabled for built-in and string types with wider availability coming up in future releases.
For example, it gives ~24% improvement on a simple benchmark compiled with Apple clang version 15.0.0 (clang-1500.1.0.2.5) and run on macOS 14.2.1:
-------------------------------------------------------
Benchmark Time CPU Iterations
-------------------------------------------------------
printf 81.8 ns 81.5 ns 8496899
fmt::print (10.x) 63.8 ns 61.9 ns 11524151
fmt::print (11.0) 51.3 ns 51.0 ns 13846580
Improved safety of fmt::format_to
when writing to an array (#3805). For example (godbolt):
auto volkswagen = char[4]; auto result = fmt::format_to(volkswagen, "elephant");
no longer results in a buffer overflow. Instead the output will be truncated and you can get the end iterator and whether truncation occurred from the result
object. Thanks @ThePhD.
Enabled Unicode support by default in MSVC, bringing it on par with other compilers and making it unnecessary for users to enable it explicitly. Most of {fmt} is encoding-agnostic but this prevents mojibake in places where encoding matters such as path formatting and terminal output. You can control the Unicode support via the CMake FMT_UNICODE
option. Note that some {fmt} packages such as the one in vcpkg have already been compiled with Unicode enabled.
Added a formatter for std::expected
(#3834). Thanks @dominicpoeschko.
Added a formatter for std::complex
(#1467, #3886, #3892, #3900). Thanks @phprus.
Added a formatter for std::type_info
(#3978). Thanks @matt77hias.
Specialized formatter
for std::basic_string
types with custom traits and allocators (#3938, #3943). Thanks @dieram3.
Added formatters for std::chrono::day
, std::chrono::month
, std::chrono::year
and std::chrono::year_month_day
(#3758, #3772, #3906, #3913). For example:
#include <fmt/chrono.h> #include <fmt/color.h> int main() { fmt::print(fg(fmt::color::green), "{}\n", std::chrono::day(7)); }
prints a green day:
Thanks @zivshek.
Fixed handling of precision in %S
(#3794, #3814). Thanks @js324.
Added support for the -
specifier (glibc strftime
extension) to day of the month (%d
) and week of the year (%W
, %U
, %V
) specifiers (#3976). Thanks @ZaheenJ.
Fixed the scope of the -
extension in chrono formatting so that it doesn't apply to subsequent specifiers (#3811, #3812). Thanks @phprus.
Improved handling of time_point::min()
(#3282).
Added support for character range formatting (#3857, #3863). Thanks @js324.
Added string
and debug_string
range formatters (#3973, #4024). Thanks @matt77hias.
Enabled ADL for begin
and end
in fmt::join
(#3813, #3824). Thanks @bbolli.
Made contiguous iterator optimizations apply to std::basic_string
iterators (#3798). Thanks @phprus.
Added support for ranges with mutable begin
and end
(#3752, #3800, #3955). Thanks @tcbrindle and @Arghnews.
Added support for move-only iterators to fmt::join
(#3802, #3946). Thanks @Arghnews.
Moved range and iterator overloads of fmt::join
to fmt/ranges.h
, next to other overloads.
Fixed handling of types with begin
returning void
such as Eigen matrices (#3839, #3964). Thanks @Arghnews.
Added an fmt::formattable
concept (#3974). Thanks @matt77hias.
Added support for __float128
(#3494).
Fixed rounding issues when formatting long double
with fixed precision (#3539).
Made fmt::isnan
not trigger floating-point exception for NaN values (#3948, #3951). Thanks @alexdewar.
Removed dependency on <memory>
for std::allocator_traits
when possible (#3804). Thanks @phprus.
Enabled compile-time checks in formatting functions that take text colors and styles.
Deprecated wide stream overloads of fmt::print
that take text styles.
Made format string compilation work with clang 12 and later despite only partial non-type template parameter support (#4000, #4001). Thanks @yujincheng08.
Made fmt::iterator_buffer
's move constructor noexcept
(#3808). Thanks @waywardmonkeys.
Started enforcing that formatter::format
is const for compatibility with std::format
(#3447).
Added fmt::basic_format_arg::visit
and deprecated fmt::visit_format_arg
.
Made fmt::basic_string_view
not constructible from nullptr
for consistency with std::string_view
in C++23 (#3846). Thanks @dalle.
Fixed fmt::group_digits
for negative integers (#3891, #3901). Thanks @phprus.
Fixed handling of negative ids in fmt::basic_format_args::get
(#3945). Thanks @marlenecota.
Improved named argument validation (#3817).
Disabled copy construction/assignment for fmt::format_arg_store
and fixed moved construction (#3833). Thanks @ivafanas.
Worked around a locale issue in RHEL/devtoolset (#3858, #3859). Thanks @g199209.
Added RTTI detection for MSVC (#3821, #3963). Thanks @edo9300.
Migrated the documentation from Sphinx to MkDocs.
Improved documentation and README (https://...
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4