diff --git a/ChangeLog.md b/ChangeLog.md index cab21356..c064b752 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5528 +1,5528 @@ # 10.2.0 - 2024-01-01 -- Added support for the `%j` specifier (the number of days) for - `std::chrono::duration` (https://github.com/fmtlib/fmt/issues/3643, - https://github.com/fmtlib/fmt/pull/3732). Thanks @intelfx. +- Added support for the `%j` specifier (the number of days) for + `std::chrono::duration` (https://github.com/fmtlib/fmt/issues/3643, + https://github.com/fmtlib/fmt/pull/3732). Thanks @intelfx. -- Added support for the chrono suffix for days and changed - the suffix for minutes from "m" to the correct "min" - (https://github.com/fmtlib/fmt/issues/3662, - https://github.com/fmtlib/fmt/pull/3664). - For example ([godbolt](https://godbolt.org/z/9KhMnq9ba)): +- Added support for the chrono suffix for days and changed + the suffix for minutes from "m" to the correct "min" + (https://github.com/fmtlib/fmt/issues/3662, + https://github.com/fmtlib/fmt/pull/3664). + For example ([godbolt](https://godbolt.org/z/9KhMnq9ba)): - ```c++ - #include + ```c++ + #include - int main() { - fmt::print("{}\n", std::chrono::days(42)); // prints "42d" + int main() { + fmt::print("{}\n", std::chrono::days(42)); // prints "42d" + } + ``` + + Thanks @Richardk2n. + +- Fixed an overflow in `std::chrono::time_point` formatting with large dates + (https://github.com/fmtlib/fmt/issues/3725, + https://github.com/fmtlib/fmt/pull/3727). Thanks @cschreib. + +- Added a formatter for `std::source_location` + (https://github.com/fmtlib/fmt/pull/3730). + For example ([godbolt](https://godbolt.org/z/YajfKjhhr)): + + ```c++ + #include + #include + + int main() { + fmt::print("{}\n", std::source_location::current()); + } + ``` + + prints + + ``` + /app/example.cpp:5:51: int main() + ``` + + Thanks @felix642. + +- Added a formatter for `std::bitset` + (https://github.com/fmtlib/fmt/pull/3660). + For example ([godbolt](https://godbolt.org/z/bdEaGeYxe)): + + ```c++ + #include + #include + + int main() { + fmt::print("{}\n", std::bitset<6>(42)); // prints "101010" + } + ``` + + Thanks @muggenhor. + +- Added an experimental `nested_formatter` that provides an easy way of + applying a formatter to one or more subobjects while automatically handling + width, fill and alignment. For example: + + ```c++ + #include + + struct point { + double x, y; + }; + + template <> + struct fmt::formatter : nested_formatter { + auto format(point p, format_context& ctx) const { + return write_padded(ctx, [=](auto out) { + return format_to(out, "({}, {})", nested(p.x), nested(p.y)); + }); } - ``` + }; - Thanks @Richardk2n. + int main() { + fmt::print("[{:>20.2f}]", point{1, 2}); + } + ``` -- Fixed an overflow in `std::chrono::time_point` formatting with large dates - (https://github.com/fmtlib/fmt/issues/3725, - https://github.com/fmtlib/fmt/pull/3727). Thanks @cschreib. + prints -- Added a formatter for `std::source_location` - (https://github.com/fmtlib/fmt/pull/3730). - For example ([godbolt](https://godbolt.org/z/YajfKjhhr)): + ``` + [ (1.00, 2.00)] + ``` - ```c++ - #include - #include +- Added the generic representation (`g`) to `std::filesystem::path` + (https://github.com/fmtlib/fmt/issues/3715, + https://github.com/fmtlib/fmt/pull/3729). For example: - int main() { - fmt::print("{}\n", std::source_location::current()); - } - ``` + ```c++ + #include + #include - prints + int main() { + fmt::print("{:g}\n", std::filesystem::path("C:\\foo")); + } + ``` - ``` - /app/example.cpp:5:51: int main() - ``` + prints `"C:/foo"` on Windows. - Thanks @felix642. + Thanks @js324. -- Added a formatter for `std::bitset` - (https://github.com/fmtlib/fmt/pull/3660). - For example ([godbolt](https://godbolt.org/z/bdEaGeYxe)): +- Made `format_as` work with references + (https://github.com/fmtlib/fmt/pull/3739). Thanks @tchaikov. - ```c++ - #include - #include +- Fixed formatting of invalid UTF-8 with precision + (https://github.com/fmtlib/fmt/issues/3284). - int main() { - fmt::print("{}\n", std::bitset<6>(42)); // prints "101010" - } - ``` +- Fixed an inconsistency between `fmt::to_string` and `fmt::format` + (https://github.com/fmtlib/fmt/issues/3684). - Thanks @muggenhor. +- Disallowed unsafe uses of `fmt::styled` + (https://github.com/fmtlib/fmt/issues/3625): -- Added an experimental `nested_formatter` that provides an easy way of - applying a formatter to one or more subobjects while automatically handling - width, fill and alignment. For example: + ```c++ + auto s = fmt::styled(std::string("dangle"), fmt::emphasis::bold); + fmt::print("{}\n", s); // compile error + ``` - ```c++ - #include + Pass `fmt::styled(...)` as a parameter instead. - struct point { - double x, y; - }; +- Added a null check when formatting a C string with the `s` specifier + (https://github.com/fmtlib/fmt/issues/3706). - template <> - struct fmt::formatter : nested_formatter { - auto format(point p, format_context& ctx) const { - return write_padded(ctx, [=](auto out) { - return format_to(out, "({}, {})", nested(p.x), nested(p.y)); - }); - } - }; +- Disallowed the `c` specifier for `bool` + (https://github.com/fmtlib/fmt/issues/3726, + https://github.com/fmtlib/fmt/pull/3734). Thanks @js324. - int main() { - fmt::print("[{:>20.2f}]", point{1, 2}); - } - ``` +- Made the default formatting unlocalized in `fmt::ostream_formatter` for + consistency with the rest of the library + (https://github.com/fmtlib/fmt/issues/3460). - prints +- Fixed localized formatting in bases other than decimal + (https://github.com/fmtlib/fmt/issues/3693, + https://github.com/fmtlib/fmt/pull/3750). Thanks @js324. - ``` - [ (1.00, 2.00)] - ``` +- Fixed a performance regression in experimental `fmt::ostream::print` + (https://github.com/fmtlib/fmt/issues/3674). -- Added the generic representation (`g`) to `std::filesystem::path` - (https://github.com/fmtlib/fmt/issues/3715, - https://github.com/fmtlib/fmt/pull/3729). For example: +- Added synchronization with the underlying output stream when writing to + the Windows console + (https://github.com/fmtlib/fmt/pull/3668, + https://github.com/fmtlib/fmt/issues/3688, + https://github.com/fmtlib/fmt/pull/3689). + Thanks @Roman-Koshelev and @dimztimz. - ```c++ - #include - #include +- Changed to only export `format_error` when {fmt} is built as a shared + library (https://github.com/fmtlib/fmt/issues/3626, + https://github.com/fmtlib/fmt/pull/3627). Thanks @phprus. - int main() { - fmt::print("{:g}\n", std::filesystem::path("C:\\foo")); - } - ``` +- Made `fmt::streamed` `constexpr`. + (https://github.com/fmtlib/fmt/pull/3650). Thanks @muggenhor. - prints `"C:/foo"` on Windows. +- Enabled `consteval` on older versions of MSVC + (https://github.com/fmtlib/fmt/pull/3757). Thanks @phprus. - Thanks @js324. +- Added an option to build without `wchar_t` support on Windows + (https://github.com/fmtlib/fmt/issues/3631, + https://github.com/fmtlib/fmt/pull/3636). Thanks @glebm. -- Made `format_as` work with references - (https://github.com/fmtlib/fmt/pull/3739). Thanks @tchaikov. +- Improved build and CI configuration + (https://github.com/fmtlib/fmt/pull/3679, + https://github.com/fmtlib/fmt/issues/3701, + https://github.com/fmtlib/fmt/pull/3702, + https://github.com/fmtlib/fmt/pull/3749). + Thanks @jcar87, @pklima and @tchaikov. -- Fixed formatting of invalid UTF-8 with precision - (https://github.com/fmtlib/fmt/issues/3284). +- Fixed various warnings, compilation and test issues + (https://github.com/fmtlib/fmt/issues/3607, + https://github.com/fmtlib/fmt/pull/3610, + https://github.com/fmtlib/fmt/pull/3624, + https://github.com/fmtlib/fmt/pull/3630, + https://github.com/fmtlib/fmt/pull/3634, + https://github.com/fmtlib/fmt/pull/3638, + https://github.com/fmtlib/fmt/issues/3645, + https://github.com/fmtlib/fmt/issues/3646, + https://github.com/fmtlib/fmt/pull/3647, + https://github.com/fmtlib/fmt/pull/3652, + https://github.com/fmtlib/fmt/issues/3654, + https://github.com/fmtlib/fmt/pull/3663, + https://github.com/fmtlib/fmt/issues/3670, + https://github.com/fmtlib/fmt/pull/3680, + https://github.com/fmtlib/fmt/issues/3694, + https://github.com/fmtlib/fmt/pull/3695, + https://github.com/fmtlib/fmt/pull/3699, + https://github.com/fmtlib/fmt/issues/3705, + https://github.com/fmtlib/fmt/issues/3710, + https://github.com/fmtlib/fmt/issues/3712, + https://github.com/fmtlib/fmt/pull/3713, + https://github.com/fmtlib/fmt/issues/3714, + https://github.com/fmtlib/fmt/pull/3716, + https://github.com/fmtlib/fmt/pull/3723, + https://github.com/fmtlib/fmt/issues/3738, + https://github.com/fmtlib/fmt/issues/3740, + https://github.com/fmtlib/fmt/pull/3741, + https://github.com/fmtlib/fmt/pull/3743, + https://github.com/fmtlib/fmt/issues/3745, + https://github.com/fmtlib/fmt/pull/3747, + https://github.com/fmtlib/fmt/pull/3748, + https://github.com/fmtlib/fmt/pull/3751, + https://github.com/fmtlib/fmt/pull/3754, + https://github.com/fmtlib/fmt/pull/3755, + https://github.com/fmtlib/fmt/issues/3760, + https://github.com/fmtlib/fmt/pull/3762, + https://github.com/fmtlib/fmt/issues/3763, + https://github.com/fmtlib/fmt/pull/3764, + https://github.com/fmtlib/fmt/issues/3774, + https://github.com/fmtlib/fmt/pull/3779). + Thanks @danakj, @vinayyadav3016, @cyyever, @phprus, @qimiko, @saschasc, + @gsjaardema, @lazka, @Zhaojun-Liu, @carlsmedstad, @hotwatermorning, + @cptFracassa, @kuguma, @PeterJohnson, @H1X4Dev, @asantoni, @eltociear, + @msimberg, @tchaikov, @waywardmonkeys. -- Fixed an inconsistency between `fmt::to_string` and `fmt::format` - (https://github.com/fmtlib/fmt/issues/3684). +- Improved documentation and README + (https://github.com/fmtlib/fmt/issues/2086, + https://github.com/fmtlib/fmt/issues/3637, + https://github.com/fmtlib/fmt/pull/3642, + https://github.com/fmtlib/fmt/pull/3653, + https://github.com/fmtlib/fmt/pull/3655, + https://github.com/fmtlib/fmt/pull/3661, + https://github.com/fmtlib/fmt/issues/3673, + https://github.com/fmtlib/fmt/pull/3677, + https://github.com/fmtlib/fmt/pull/3737, + https://github.com/fmtlib/fmt/issues/3742, + https://github.com/fmtlib/fmt/pull/3744). + Thanks @idzm, @perlun, @joycebrum, @fennewald, @reinhardt1053, @GeorgeLS. -- Disallowed unsafe uses of `fmt::styled` - (https://github.com/fmtlib/fmt/issues/3625): - - ```c++ - auto s = fmt::styled(std::string("dangle"), fmt::emphasis::bold); - fmt::print("{}\n", s); // compile error - ``` - - Pass `fmt::styled(...)` as a parameter instead. - -- Added a null check when formatting a C string with the `s` specifier - (https://github.com/fmtlib/fmt/issues/3706). - -- Disallowed the `c` specifier for `bool` - (https://github.com/fmtlib/fmt/issues/3726, - https://github.com/fmtlib/fmt/pull/3734). Thanks @js324. - -- Made the default formatting unlocalized in `fmt::ostream_formatter` for - consistency with the rest of the library - (https://github.com/fmtlib/fmt/issues/3460). - -- Fixed localized formatting in bases other than decimal - (https://github.com/fmtlib/fmt/issues/3693, - https://github.com/fmtlib/fmt/pull/3750). Thanks @js324. - -- Fixed a performance regression in experimental `fmt::ostream::print` - (https://github.com/fmtlib/fmt/issues/3674). - -- Added synchronization with the underlying output stream when writing to - the Windows console - (https://github.com/fmtlib/fmt/pull/3668, - https://github.com/fmtlib/fmt/issues/3688, - https://github.com/fmtlib/fmt/pull/3689). - Thanks @Roman-Koshelev and @dimztimz. - -- Changed to only export `format_error` when {fmt} is built as a shared - library (https://github.com/fmtlib/fmt/issues/3626, - https://github.com/fmtlib/fmt/pull/3627). Thanks @phprus. - -- Made `fmt::streamed` `constexpr`. - (https://github.com/fmtlib/fmt/pull/3650). Thanks @muggenhor. - -- Enabled `consteval` on older versions of MSVC - (https://github.com/fmtlib/fmt/pull/3757). Thanks @phprus. - -- Added an option to build without `wchar_t` support on Windows - (https://github.com/fmtlib/fmt/issues/3631, - https://github.com/fmtlib/fmt/pull/3636). Thanks @glebm. - -- Improved build and CI configuration - (https://github.com/fmtlib/fmt/pull/3679, - https://github.com/fmtlib/fmt/issues/3701, - https://github.com/fmtlib/fmt/pull/3702, - https://github.com/fmtlib/fmt/pull/3749). - Thanks @jcar87, @pklima and @tchaikov. - -- Fixed various warnings, compilation and test issues - (https://github.com/fmtlib/fmt/issues/3607, - https://github.com/fmtlib/fmt/pull/3610, - https://github.com/fmtlib/fmt/pull/3624, - https://github.com/fmtlib/fmt/pull/3630, - https://github.com/fmtlib/fmt/pull/3634, - https://github.com/fmtlib/fmt/pull/3638, - https://github.com/fmtlib/fmt/issues/3645, - https://github.com/fmtlib/fmt/issues/3646, - https://github.com/fmtlib/fmt/pull/3647, - https://github.com/fmtlib/fmt/pull/3652, - https://github.com/fmtlib/fmt/issues/3654, - https://github.com/fmtlib/fmt/pull/3663, - https://github.com/fmtlib/fmt/issues/3670, - https://github.com/fmtlib/fmt/pull/3680, - https://github.com/fmtlib/fmt/issues/3694, - https://github.com/fmtlib/fmt/pull/3695, - https://github.com/fmtlib/fmt/pull/3699, - https://github.com/fmtlib/fmt/issues/3705, - https://github.com/fmtlib/fmt/issues/3710, - https://github.com/fmtlib/fmt/issues/3712, - https://github.com/fmtlib/fmt/pull/3713, - https://github.com/fmtlib/fmt/issues/3714, - https://github.com/fmtlib/fmt/pull/3716, - https://github.com/fmtlib/fmt/pull/3723, - https://github.com/fmtlib/fmt/issues/3738, - https://github.com/fmtlib/fmt/issues/3740, - https://github.com/fmtlib/fmt/pull/3741, - https://github.com/fmtlib/fmt/pull/3743, - https://github.com/fmtlib/fmt/issues/3745, - https://github.com/fmtlib/fmt/pull/3747, - https://github.com/fmtlib/fmt/pull/3748, - https://github.com/fmtlib/fmt/pull/3751, - https://github.com/fmtlib/fmt/pull/3754, - https://github.com/fmtlib/fmt/pull/3755, - https://github.com/fmtlib/fmt/issues/3760, - https://github.com/fmtlib/fmt/pull/3762, - https://github.com/fmtlib/fmt/issues/3763, - https://github.com/fmtlib/fmt/pull/3764, - https://github.com/fmtlib/fmt/issues/3774, - https://github.com/fmtlib/fmt/pull/3779). - Thanks @danakj, @vinayyadav3016, @cyyever, @phprus, @qimiko, @saschasc, - @gsjaardema, @lazka, @Zhaojun-Liu, @carlsmedstad, @hotwatermorning, - @cptFracassa, @kuguma, @PeterJohnson, @H1X4Dev, @asantoni, @eltociear, - @msimberg, @tchaikov, @waywardmonkeys. - -- Improved documentation and README - (https://github.com/fmtlib/fmt/issues/2086, - https://github.com/fmtlib/fmt/issues/3637, - https://github.com/fmtlib/fmt/pull/3642, - https://github.com/fmtlib/fmt/pull/3653, - https://github.com/fmtlib/fmt/pull/3655, - https://github.com/fmtlib/fmt/pull/3661, - https://github.com/fmtlib/fmt/issues/3673, - https://github.com/fmtlib/fmt/pull/3677, - https://github.com/fmtlib/fmt/pull/3737, - https://github.com/fmtlib/fmt/issues/3742, - https://github.com/fmtlib/fmt/pull/3744). - Thanks @idzm, @perlun, @joycebrum, @fennewald, @reinhardt1053, @GeorgeLS. - -- Updated CI dependencies - (https://github.com/fmtlib/fmt/pull/3615, - https://github.com/fmtlib/fmt/pull/3622, - https://github.com/fmtlib/fmt/pull/3623, - https://github.com/fmtlib/fmt/pull/3666, - https://github.com/fmtlib/fmt/pull/3696, - https://github.com/fmtlib/fmt/pull/3697, - https://github.com/fmtlib/fmt/pull/3759, - https://github.com/fmtlib/fmt/pull/3782). +- Updated CI dependencies + (https://github.com/fmtlib/fmt/pull/3615, + https://github.com/fmtlib/fmt/pull/3622, + https://github.com/fmtlib/fmt/pull/3623, + https://github.com/fmtlib/fmt/pull/3666, + https://github.com/fmtlib/fmt/pull/3696, + https://github.com/fmtlib/fmt/pull/3697, + https://github.com/fmtlib/fmt/pull/3759, + https://github.com/fmtlib/fmt/pull/3782). # 10.1.1 - 2023-08-28 -- Added formatters for `std::atomic` and `atomic_flag` - (https://github.com/fmtlib/fmt/pull/3574, - https://github.com/fmtlib/fmt/pull/3594). - Thanks @wangzw and @AlexGuteniev. -- Fixed an error about partial specialization of `formatter` - after instantiation when compiled with gcc and C++20 - (https://github.com/fmtlib/fmt/issues/3584). -- Fixed compilation as a C++20 module with gcc and clang - (https://github.com/fmtlib/fmt/issues/3587, - https://github.com/fmtlib/fmt/pull/3597, - https://github.com/fmtlib/fmt/pull/3605). - Thanks @MathewBensonCode. -- Made `fmt::to_string` work with types that have `format_as` - overloads (https://github.com/fmtlib/fmt/pull/3575). Thanks @phprus. -- Made `formatted_size` work with integral format specifiers at - compile time (https://github.com/fmtlib/fmt/pull/3591). - Thanks @elbeno. -- Fixed a warning about the `no_unique_address` attribute on clang-cl - (https://github.com/fmtlib/fmt/pull/3599). Thanks @lukester1975. -- Improved compatibility with the legacy GBK encoding - (https://github.com/fmtlib/fmt/issues/3598, - https://github.com/fmtlib/fmt/pull/3599). Thanks @YuHuanTin. -- Added OpenSSF Scorecard analysis - (https://github.com/fmtlib/fmt/issues/3530, - https://github.com/fmtlib/fmt/pull/3571). Thanks @joycebrum. -- Updated CI dependencies - (https://github.com/fmtlib/fmt/pull/3591, - https://github.com/fmtlib/fmt/pull/3592, - https://github.com/fmtlib/fmt/pull/3593, - https://github.com/fmtlib/fmt/pull/3602). +- Added formatters for `std::atomic` and `atomic_flag` + (https://github.com/fmtlib/fmt/pull/3574, + https://github.com/fmtlib/fmt/pull/3594). + Thanks @wangzw and @AlexGuteniev. +- Fixed an error about partial specialization of `formatter` + after instantiation when compiled with gcc and C++20 + (https://github.com/fmtlib/fmt/issues/3584). +- Fixed compilation as a C++20 module with gcc and clang + (https://github.com/fmtlib/fmt/issues/3587, + https://github.com/fmtlib/fmt/pull/3597, + https://github.com/fmtlib/fmt/pull/3605). + Thanks @MathewBensonCode. +- Made `fmt::to_string` work with types that have `format_as` + overloads (https://github.com/fmtlib/fmt/pull/3575). Thanks @phprus. +- Made `formatted_size` work with integral format specifiers at + compile time (https://github.com/fmtlib/fmt/pull/3591). + Thanks @elbeno. +- Fixed a warning about the `no_unique_address` attribute on clang-cl + (https://github.com/fmtlib/fmt/pull/3599). Thanks @lukester1975. +- Improved compatibility with the legacy GBK encoding + (https://github.com/fmtlib/fmt/issues/3598, + https://github.com/fmtlib/fmt/pull/3599). Thanks @YuHuanTin. +- Added OpenSSF Scorecard analysis + (https://github.com/fmtlib/fmt/issues/3530, + https://github.com/fmtlib/fmt/pull/3571). Thanks @joycebrum. +- Updated CI dependencies + (https://github.com/fmtlib/fmt/pull/3591, + https://github.com/fmtlib/fmt/pull/3592, + https://github.com/fmtlib/fmt/pull/3593, + https://github.com/fmtlib/fmt/pull/3602). # 10.1.0 - 2023-08-12 -- Optimized format string compilation resulting in up to 40% speed up - in compiled `format_to` and \~4x speed up in compiled `format_to_n` - on a concatenation benchmark - (https://github.com/fmtlib/fmt/issues/3133, - https://github.com/fmtlib/fmt/issues/3484). +- Optimized format string compilation resulting in up to 40% speed up + in compiled `format_to` and \~4x speed up in compiled `format_to_n` + on a concatenation benchmark + (https://github.com/fmtlib/fmt/issues/3133, + https://github.com/fmtlib/fmt/issues/3484). - {fmt} 10.0: + {fmt} 10.0: - --------------------------------------------------------- - Benchmark Time CPU Iterations - --------------------------------------------------------- - BM_format_to 78.9 ns 78.9 ns 8881746 - BM_format_to_n 568 ns 568 ns 1232089 + --------------------------------------------------------- + Benchmark Time CPU Iterations + --------------------------------------------------------- + BM_format_to 78.9 ns 78.9 ns 8881746 + BM_format_to_n 568 ns 568 ns 1232089 - {fmt} 10.1: + {fmt} 10.1: - --------------------------------------------------------- - Benchmark Time CPU Iterations - --------------------------------------------------------- - BM_format_to 54.9 ns 54.9 ns 12727944 - BM_format_to_n 133 ns 133 ns 5257795 + --------------------------------------------------------- + Benchmark Time CPU Iterations + --------------------------------------------------------- + BM_format_to 54.9 ns 54.9 ns 12727944 + BM_format_to_n 133 ns 133 ns 5257795 -- Optimized storage of an empty allocator in `basic_memory_buffer` - (https://github.com/fmtlib/fmt/pull/3485). Thanks @Minty-Meeo. +- Optimized storage of an empty allocator in `basic_memory_buffer` + (https://github.com/fmtlib/fmt/pull/3485). Thanks @Minty-Meeo. -- Added formatters for proxy references to elements of - `std::vector` and `std::bitset` - (https://github.com/fmtlib/fmt/issues/3567, - https://github.com/fmtlib/fmt/pull/3570). For example - ([godbolt](https://godbolt.org/z/zYb79Pvn8)): +- Added formatters for proxy references to elements of + `std::vector` and `std::bitset` + (https://github.com/fmtlib/fmt/issues/3567, + https://github.com/fmtlib/fmt/pull/3570). For example + ([godbolt](https://godbolt.org/z/zYb79Pvn8)): - ```c++ - #include - #include + ```c++ + #include + #include - int main() { - auto v = std::vector{true}; - fmt::print("{}", v[0]); - } - ``` + int main() { + auto v = std::vector{true}; + fmt::print("{}", v[0]); + } + ``` - Thanks @phprus and @felix642. + Thanks @phprus and @felix642. -- Fixed an ambiguous formatter specialization for containers that look - like container adaptors such as `boost::flat_set` - (https://github.com/fmtlib/fmt/issues/3556, - https://github.com/fmtlib/fmt/pull/3561). Thanks @5chmidti. +- Fixed an ambiguous formatter specialization for containers that look + like container adaptors such as `boost::flat_set` + (https://github.com/fmtlib/fmt/issues/3556, + https://github.com/fmtlib/fmt/pull/3561). Thanks @5chmidti. -- Fixed compilation when formatting durations not convertible from - `std::chrono::seconds` - (https://github.com/fmtlib/fmt/pull/3430). Thanks @patlkli. +- Fixed compilation when formatting durations not convertible from + `std::chrono::seconds` + (https://github.com/fmtlib/fmt/pull/3430). Thanks @patlkli. -- Made the `formatter` specialization for `char*` const-correct - (https://github.com/fmtlib/fmt/pull/3432). Thanks @timsong-cpp. +- Made the `formatter` specialization for `char*` const-correct + (https://github.com/fmtlib/fmt/pull/3432). Thanks @timsong-cpp. -- Made `{}` and `{:}` handled consistently during compile-time checks - (https://github.com/fmtlib/fmt/issues/3526). +- Made `{}` and `{:}` handled consistently during compile-time checks + (https://github.com/fmtlib/fmt/issues/3526). -- Disallowed passing temporaries to `make_format_args` to improve API - safety by preventing dangling references. +- Disallowed passing temporaries to `make_format_args` to improve API + safety by preventing dangling references. -- Improved the compile-time error for unformattable types - (https://github.com/fmtlib/fmt/pull/3478). Thanks @BRevzin. +- Improved the compile-time error for unformattable types + (https://github.com/fmtlib/fmt/pull/3478). Thanks @BRevzin. -- Improved the floating-point formatter - (https://github.com/fmtlib/fmt/pull/3448, - https://github.com/fmtlib/fmt/pull/3450). - Thanks @florimond-collette. +- Improved the floating-point formatter + (https://github.com/fmtlib/fmt/pull/3448, + https://github.com/fmtlib/fmt/pull/3450). + Thanks @florimond-collette. -- Fixed handling of precision for `long double` larger than 64 bits. - (https://github.com/fmtlib/fmt/issues/3539, - https://github.com/fmtlib/fmt/issues/3564). +- Fixed handling of precision for `long double` larger than 64 bits. + (https://github.com/fmtlib/fmt/issues/3539, + https://github.com/fmtlib/fmt/issues/3564). -- Made floating-point and chrono tests less platform-dependent - (https://github.com/fmtlib/fmt/issues/3337, - https://github.com/fmtlib/fmt/issues/3433, - https://github.com/fmtlib/fmt/pull/3434). Thanks @phprus. +- Made floating-point and chrono tests less platform-dependent + (https://github.com/fmtlib/fmt/issues/3337, + https://github.com/fmtlib/fmt/issues/3433, + https://github.com/fmtlib/fmt/pull/3434). Thanks @phprus. -- Removed the remnants of the Grisu floating-point formatter that has - been replaced by Dragonbox in earlier versions. +- Removed the remnants of the Grisu floating-point formatter that has + been replaced by Dragonbox in earlier versions. -- Added `throw_format_error` to the public API - (https://github.com/fmtlib/fmt/pull/3551). Thanks @mjerabek. +- Added `throw_format_error` to the public API + (https://github.com/fmtlib/fmt/pull/3551). Thanks @mjerabek. -- Made `FMT_THROW` assert even if assertions are disabled when - compiling with exceptions disabled - (https://github.com/fmtlib/fmt/issues/3418, - https://github.com/fmtlib/fmt/pull/3439). Thanks @BRevzin. +- Made `FMT_THROW` assert even if assertions are disabled when + compiling with exceptions disabled + (https://github.com/fmtlib/fmt/issues/3418, + https://github.com/fmtlib/fmt/pull/3439). Thanks @BRevzin. -- Made `format_as` and `std::filesystem::path` formatter work with - exotic code unit types. - (https://github.com/fmtlib/fmt/pull/3457, - https://github.com/fmtlib/fmt/pull/3476). Thanks @gix and @hmbj. +- Made `format_as` and `std::filesystem::path` formatter work with + exotic code unit types. + (https://github.com/fmtlib/fmt/pull/3457, + https://github.com/fmtlib/fmt/pull/3476). Thanks @gix and @hmbj. -- Added support for the `?` format specifier to - `std::filesystem::path` and made the default unescaped for - consistency with strings. +- Added support for the `?` format specifier to + `std::filesystem::path` and made the default unescaped for + consistency with strings. -- Deprecated the wide stream overload of `printf`. +- Deprecated the wide stream overload of `printf`. -- Removed unused `basic_printf_parse_context`. +- Removed unused `basic_printf_parse_context`. -- Improved RTTI detection used when formatting exceptions - (https://github.com/fmtlib/fmt/pull/3468). Thanks @danakj. +- Improved RTTI detection used when formatting exceptions + (https://github.com/fmtlib/fmt/pull/3468). Thanks @danakj. -- Improved compatibility with VxWorks7 - (https://github.com/fmtlib/fmt/pull/3467). Thanks @wenshan1. +- Improved compatibility with VxWorks7 + (https://github.com/fmtlib/fmt/pull/3467). Thanks @wenshan1. -- Improved documentation - (https://github.com/fmtlib/fmt/issues/3174, - https://github.com/fmtlib/fmt/issues/3423, - https://github.com/fmtlib/fmt/pull/3454, - https://github.com/fmtlib/fmt/issues/3458, - https://github.com/fmtlib/fmt/pull/3461, - https://github.com/fmtlib/fmt/issues/3487, - https://github.com/fmtlib/fmt/pull/3515). - Thanks @zencatalyst, @rlalik and @mikecrowe. +- Improved documentation + (https://github.com/fmtlib/fmt/issues/3174, + https://github.com/fmtlib/fmt/issues/3423, + https://github.com/fmtlib/fmt/pull/3454, + https://github.com/fmtlib/fmt/issues/3458, + https://github.com/fmtlib/fmt/pull/3461, + https://github.com/fmtlib/fmt/issues/3487, + https://github.com/fmtlib/fmt/pull/3515). + Thanks @zencatalyst, @rlalik and @mikecrowe. -- Improved build and CI configurations - (https://github.com/fmtlib/fmt/issues/3449, - https://github.com/fmtlib/fmt/pull/3451, - https://github.com/fmtlib/fmt/pull/3452, - https://github.com/fmtlib/fmt/pull/3453, - https://github.com/fmtlib/fmt/pull/3459, - https://github.com/fmtlib/fmt/issues/3481, - https://github.com/fmtlib/fmt/pull/3486, - https://github.com/fmtlib/fmt/issues/3489, - https://github.com/fmtlib/fmt/pull/3496, - https://github.com/fmtlib/fmt/issues/3517, - https://github.com/fmtlib/fmt/pull/3523, - https://github.com/fmtlib/fmt/pull/3563). - Thanks @joycebrum, @glebm, @phprus, @petrmanek, @setoye and @abouvier. +- Improved build and CI configurations + (https://github.com/fmtlib/fmt/issues/3449, + https://github.com/fmtlib/fmt/pull/3451, + https://github.com/fmtlib/fmt/pull/3452, + https://github.com/fmtlib/fmt/pull/3453, + https://github.com/fmtlib/fmt/pull/3459, + https://github.com/fmtlib/fmt/issues/3481, + https://github.com/fmtlib/fmt/pull/3486, + https://github.com/fmtlib/fmt/issues/3489, + https://github.com/fmtlib/fmt/pull/3496, + https://github.com/fmtlib/fmt/issues/3517, + https://github.com/fmtlib/fmt/pull/3523, + https://github.com/fmtlib/fmt/pull/3563). + Thanks @joycebrum, @glebm, @phprus, @petrmanek, @setoye and @abouvier. -- Fixed various warnings and compilation issues - (https://github.com/fmtlib/fmt/issues/3408, - https://github.com/fmtlib/fmt/issues/3424, - https://github.com/fmtlib/fmt/issues/3444, - https://github.com/fmtlib/fmt/pull/3446, - https://github.com/fmtlib/fmt/pull/3475, - https://github.com/fmtlib/fmt/pull/3482, - https://github.com/fmtlib/fmt/issues/3492, - https://github.com/fmtlib/fmt/pull/3493, - https://github.com/fmtlib/fmt/pull/3508, - https://github.com/fmtlib/fmt/issues/3509, - https://github.com/fmtlib/fmt/issues/3533, - https://github.com/fmtlib/fmt/pull/3542, - https://github.com/fmtlib/fmt/issues/3543, - https://github.com/fmtlib/fmt/issues/3540, - https://github.com/fmtlib/fmt/pull/3544, - https://github.com/fmtlib/fmt/issues/3548, - https://github.com/fmtlib/fmt/pull/3549, - https://github.com/fmtlib/fmt/pull/3550, - https://github.com/fmtlib/fmt/pull/3552). - Thanks @adesitter, @hmbj, @Minty-Meeo, @phprus, @TobiSchluter, - @kieranclancy, @alexeedm, @jurihock, @Ozomahtli and @razaqq. +- Fixed various warnings and compilation issues + (https://github.com/fmtlib/fmt/issues/3408, + https://github.com/fmtlib/fmt/issues/3424, + https://github.com/fmtlib/fmt/issues/3444, + https://github.com/fmtlib/fmt/pull/3446, + https://github.com/fmtlib/fmt/pull/3475, + https://github.com/fmtlib/fmt/pull/3482, + https://github.com/fmtlib/fmt/issues/3492, + https://github.com/fmtlib/fmt/pull/3493, + https://github.com/fmtlib/fmt/pull/3508, + https://github.com/fmtlib/fmt/issues/3509, + https://github.com/fmtlib/fmt/issues/3533, + https://github.com/fmtlib/fmt/pull/3542, + https://github.com/fmtlib/fmt/issues/3543, + https://github.com/fmtlib/fmt/issues/3540, + https://github.com/fmtlib/fmt/pull/3544, + https://github.com/fmtlib/fmt/issues/3548, + https://github.com/fmtlib/fmt/pull/3549, + https://github.com/fmtlib/fmt/pull/3550, + https://github.com/fmtlib/fmt/pull/3552). + Thanks @adesitter, @hmbj, @Minty-Meeo, @phprus, @TobiSchluter, + @kieranclancy, @alexeedm, @jurihock, @Ozomahtli and @razaqq. # 10.0.0 - 2023-05-09 -- Replaced Grisu with a new floating-point formatting algorithm for - given precision (https://github.com/fmtlib/fmt/issues/3262, - https://github.com/fmtlib/fmt/issues/2750, - https://github.com/fmtlib/fmt/pull/3269, - https://github.com/fmtlib/fmt/pull/3276). The new algorithm - is based on Dragonbox already used for the shortest representation - and gives substantial performance improvement: +- Replaced Grisu with a new floating-point formatting algorithm for + given precision (https://github.com/fmtlib/fmt/issues/3262, + https://github.com/fmtlib/fmt/issues/2750, + https://github.com/fmtlib/fmt/pull/3269, + https://github.com/fmtlib/fmt/pull/3276). The new algorithm + is based on Dragonbox already used for the shortest representation + and gives substantial performance improvement: - ![](https://user-images.githubusercontent.com/33922675/211956670-84891a09-6867-47d9-82fc-3230da7abe0f.png) + ![](https://user-images.githubusercontent.com/33922675/211956670-84891a09-6867-47d9-82fc-3230da7abe0f.png) - - Red: new algorithm - - Green: new algorithm with `FMT_USE_FULL_CACHE_DRAGONBOX` defined - to 1 - - Blue: old algorithm + - Red: new algorithm + - Green: new algorithm with `FMT_USE_FULL_CACHE_DRAGONBOX` defined + to 1 + - Blue: old algorithm - Thanks @jk-jeon. + Thanks @jk-jeon. -- Replaced `snprintf`-based hex float formatter with an internal - implementation (https://github.com/fmtlib/fmt/pull/3179, - https://github.com/fmtlib/fmt/pull/3203). This removes the - last usage of `s(n)printf` in {fmt}. Thanks @phprus. +- Replaced `snprintf`-based hex float formatter with an internal + implementation (https://github.com/fmtlib/fmt/pull/3179, + https://github.com/fmtlib/fmt/pull/3203). This removes the + last usage of `s(n)printf` in {fmt}. Thanks @phprus. -- Fixed alignment of floating-point numbers with localization - (https://github.com/fmtlib/fmt/issues/3263, - https://github.com/fmtlib/fmt/pull/3272). Thanks @ShawnZhong. +- Fixed alignment of floating-point numbers with localization + (https://github.com/fmtlib/fmt/issues/3263, + https://github.com/fmtlib/fmt/pull/3272). Thanks @ShawnZhong. -- Made handling of `#` consistent with `std::format`. +- Made handling of `#` consistent with `std::format`. -- Improved C++20 module support - (https://github.com/fmtlib/fmt/pull/3134, - https://github.com/fmtlib/fmt/pull/3254, - https://github.com/fmtlib/fmt/pull/3386, - https://github.com/fmtlib/fmt/pull/3387, - https://github.com/fmtlib/fmt/pull/3388, - https://github.com/fmtlib/fmt/pull/3392, - https://github.com/fmtlib/fmt/pull/3397, - https://github.com/fmtlib/fmt/pull/3399, - https://github.com/fmtlib/fmt/pull/3400). - Thanks @laitingsheng, @Orvid and @DanielaE. - -- Switched to the [modules CMake library](https://github.com/vitaut/modules) - which allows building {fmt} as a C++20 module with clang: +- Improved C++20 module support + (https://github.com/fmtlib/fmt/pull/3134, + https://github.com/fmtlib/fmt/pull/3254, + https://github.com/fmtlib/fmt/pull/3386, + https://github.com/fmtlib/fmt/pull/3387, + https://github.com/fmtlib/fmt/pull/3388, + https://github.com/fmtlib/fmt/pull/3392, + https://github.com/fmtlib/fmt/pull/3397, + https://github.com/fmtlib/fmt/pull/3399, + https://github.com/fmtlib/fmt/pull/3400). + Thanks @laitingsheng, @Orvid and @DanielaE. + +- Switched to the [modules CMake library](https://github.com/vitaut/modules) + which allows building {fmt} as a C++20 module with clang: - CXX=clang++ cmake -DFMT_MODULE=ON . - make + CXX=clang++ cmake -DFMT_MODULE=ON . + make -- Made `format_as` work with any user-defined type and not just enums. - For example ([godbolt](https://godbolt.org/z/b7rqhq5Kh)): +- Made `format_as` work with any user-defined type and not just enums. + For example ([godbolt](https://godbolt.org/z/b7rqhq5Kh)): - ```c++ - #include + ```c++ + #include - struct floaty_mc_floatface { - double value; - }; + struct floaty_mc_floatface { + double value; + }; - auto format_as(floaty_mc_floatface f) { return f.value; } + auto format_as(floaty_mc_floatface f) { return f.value; } - int main() { - fmt::print("{:8}\n", floaty_mc_floatface{0.42}); // prints " 0.42" + int main() { + fmt::print("{:8}\n", floaty_mc_floatface{0.42}); // prints " 0.42" + } + ``` + +- Removed deprecated implicit conversions for enums and conversions to + primitive types for compatibility with `std::format` and to prevent + potential ODR violations. Use `format_as` instead. + +- Added support for fill, align and width to the time point formatter + (https://github.com/fmtlib/fmt/issues/3237, + https://github.com/fmtlib/fmt/pull/3260, + https://github.com/fmtlib/fmt/pull/3275). For example + ([godbolt](https://godbolt.org/z/rKP6MGz6c)): + + ```c++ + #include + + int main() { + // prints " 2023" + fmt::print("{:>8%Y}\n", std::chrono::system_clock::now()); + } + ``` + + Thanks @ShawnZhong. + +- Implemented formatting of subseconds + (https://github.com/fmtlib/fmt/issues/2207, + https://github.com/fmtlib/fmt/issues/3117, + https://github.com/fmtlib/fmt/pull/3115, + https://github.com/fmtlib/fmt/pull/3143, + https://github.com/fmtlib/fmt/pull/3144, + https://github.com/fmtlib/fmt/pull/3349). For example + ([godbolt](https://godbolt.org/z/45738oGEo)): + + ```c++ + #include + + int main() { + // prints 01.234567 + fmt::print("{:%S}\n", std::chrono::microseconds(1234567)); + } + ``` + + Thanks @patrickroocks @phprus and @BRevzin. + +- Added precision support to `%S` + (https://github.com/fmtlib/fmt/pull/3148). Thanks @SappyJoy + +- Added support for `std::utc_time` + (https://github.com/fmtlib/fmt/issues/3098, + https://github.com/fmtlib/fmt/pull/3110). Thanks @patrickroocks. + +- Switched formatting of `std::chrono::system_clock` from local time + to UTC for compatibility with the standard + (https://github.com/fmtlib/fmt/issues/3199, + https://github.com/fmtlib/fmt/pull/3230). Thanks @ned14. + +- Added support for `%Ez` and `%Oz` to chrono formatters. + (https://github.com/fmtlib/fmt/issues/3220, + https://github.com/fmtlib/fmt/pull/3222). Thanks @phprus. + +- Improved validation of format specifiers for `std::chrono::duration` + (https://github.com/fmtlib/fmt/issues/3219, + https://github.com/fmtlib/fmt/pull/3232). Thanks @ShawnZhong. + +- Fixed formatting of time points before the epoch + (https://github.com/fmtlib/fmt/issues/3117, + https://github.com/fmtlib/fmt/pull/3261). For example + ([godbolt](https://godbolt.org/z/f7bcznb3W)): + + ```c++ + #include + + int main() { + auto t = std::chrono::system_clock::from_time_t(0) - + std::chrono::milliseconds(250); + fmt::print("{:%S}\n", t); // prints 59.750000000 + } + ``` + + Thanks @ShawnZhong. + +- Experimental: implemented glibc extension for padding seconds, + minutes and hours + (https://github.com/fmtlib/fmt/issues/2959, + https://github.com/fmtlib/fmt/pull/3271). Thanks @ShawnZhong. + +- Added a formatter for `std::exception` + (https://github.com/fmtlib/fmt/issues/2977, + https://github.com/fmtlib/fmt/issues/3012, + https://github.com/fmtlib/fmt/pull/3062, + https://github.com/fmtlib/fmt/pull/3076, + https://github.com/fmtlib/fmt/pull/3119). For example + ([godbolt](https://godbolt.org/z/8xoWGs9e4)): + + ```c++ + #include + #include + + int main() { + try { + std::vector().at(0); + } catch(const std::exception& e) { + fmt::print("{}", e); } - ``` + } + ``` -- Removed deprecated implicit conversions for enums and conversions to - primitive types for compatibility with `std::format` and to prevent - potential ODR violations. Use `format_as` instead. + prints: -- Added support for fill, align and width to the time point formatter - (https://github.com/fmtlib/fmt/issues/3237, - https://github.com/fmtlib/fmt/pull/3260, - https://github.com/fmtlib/fmt/pull/3275). For example - ([godbolt](https://godbolt.org/z/rKP6MGz6c)): + vector::_M_range_check: __n (which is 0) >= this->size() (which is 0) - ```c++ - #include + on libstdc++. Thanks @zach2good and @phprus. - int main() { - // prints " 2023" - fmt::print("{:>8%Y}\n", std::chrono::system_clock::now()); - } - ``` +- Moved `std::error_code` formatter from `fmt/os.h` to `fmt/std.h`. + (https://github.com/fmtlib/fmt/pull/3125). Thanks @phprus. - Thanks @ShawnZhong. +- Added formatters for standard container adapters: + `std::priority_queue`, `std::queue` and `std::stack` + (https://github.com/fmtlib/fmt/issues/3215, + https://github.com/fmtlib/fmt/pull/3279). For example + ([godbolt](https://godbolt.org/z/74h1xY9qK)): -- Implemented formatting of subseconds - (https://github.com/fmtlib/fmt/issues/2207, - https://github.com/fmtlib/fmt/issues/3117, - https://github.com/fmtlib/fmt/pull/3115, - https://github.com/fmtlib/fmt/pull/3143, - https://github.com/fmtlib/fmt/pull/3144, - https://github.com/fmtlib/fmt/pull/3349). For example - ([godbolt](https://godbolt.org/z/45738oGEo)): + ```c++ + #include + #include + #include - ```c++ - #include + int main() { + auto s = std::stack>(); + for (auto b: {true, false, true}) s.push(b); + fmt::print("{}\n", s); // prints [true, false, true] + } + ``` - int main() { - // prints 01.234567 - fmt::print("{:%S}\n", std::chrono::microseconds(1234567)); - } - ``` + Thanks @ShawnZhong. - Thanks @patrickroocks @phprus and @BRevzin. +- Added a formatter for `std::optional` to `fmt/std.h` + (https://github.com/fmtlib/fmt/issues/1367, + https://github.com/fmtlib/fmt/pull/3303). + Thanks @tom-huntington. -- Added precision support to `%S` - (https://github.com/fmtlib/fmt/pull/3148). Thanks @SappyJoy +- Fixed formatting of valueless by exception variants + (https://github.com/fmtlib/fmt/pull/3347). Thanks @TheOmegaCarrot. -- Added support for `std::utc_time` - (https://github.com/fmtlib/fmt/issues/3098, - https://github.com/fmtlib/fmt/pull/3110). Thanks @patrickroocks. +- Made `fmt::ptr` accept `unique_ptr` with a custom deleter + (https://github.com/fmtlib/fmt/pull/3177). Thanks @hmbj. -- Switched formatting of `std::chrono::system_clock` from local time - to UTC for compatibility with the standard - (https://github.com/fmtlib/fmt/issues/3199, - https://github.com/fmtlib/fmt/pull/3230). Thanks @ned14. +- Fixed formatting of noncopyable ranges and nested ranges of chars + (https://github.com/fmtlib/fmt/pull/3158 + https://github.com/fmtlib/fmt/issues/3286, + https://github.com/fmtlib/fmt/pull/3290). Thanks @BRevzin. -- Added support for `%Ez` and `%Oz` to chrono formatters. - (https://github.com/fmtlib/fmt/issues/3220, - https://github.com/fmtlib/fmt/pull/3222). Thanks @phprus. +- Fixed issues with formatting of paths and ranges of paths + (https://github.com/fmtlib/fmt/issues/3319, + https://github.com/fmtlib/fmt/pull/3321 + https://github.com/fmtlib/fmt/issues/3322). Thanks @phprus. -- Improved validation of format specifiers for `std::chrono::duration` - (https://github.com/fmtlib/fmt/issues/3219, - https://github.com/fmtlib/fmt/pull/3232). Thanks @ShawnZhong. +- Improved handling of invalid Unicode in paths. -- Fixed formatting of time points before the epoch - (https://github.com/fmtlib/fmt/issues/3117, - https://github.com/fmtlib/fmt/pull/3261). For example - ([godbolt](https://godbolt.org/z/f7bcznb3W)): +- Enabled compile-time checks on Apple clang 14 and later + (https://github.com/fmtlib/fmt/pull/3331). Thanks @cloyce. - ```c++ - #include +- Improved compile-time checks of named arguments + (https://github.com/fmtlib/fmt/issues/3105, + https://github.com/fmtlib/fmt/pull/3214). Thanks @rbrich. - int main() { - auto t = std::chrono::system_clock::from_time_t(0) - - std::chrono::milliseconds(250); - fmt::print("{:%S}\n", t); // prints 59.750000000 - } - ``` +- Fixed formatting when both alignment and `0` are given + (https://github.com/fmtlib/fmt/issues/3236, + https://github.com/fmtlib/fmt/pull/3248). Thanks @ShawnZhong. - Thanks @ShawnZhong. +- Improved Unicode support in the experimental file API on Windows + (https://github.com/fmtlib/fmt/issues/3234, + https://github.com/fmtlib/fmt/pull/3293). Thanks @Fros1er. -- Experimental: implemented glibc extension for padding seconds, - minutes and hours - (https://github.com/fmtlib/fmt/issues/2959, - https://github.com/fmtlib/fmt/pull/3271). Thanks @ShawnZhong. +- Unified UTF transcoding + (https://github.com/fmtlib/fmt/pull/3416). Thanks @phprus. -- Added a formatter for `std::exception` - (https://github.com/fmtlib/fmt/issues/2977, - https://github.com/fmtlib/fmt/issues/3012, - https://github.com/fmtlib/fmt/pull/3062, - https://github.com/fmtlib/fmt/pull/3076, - https://github.com/fmtlib/fmt/pull/3119). For example - ([godbolt](https://godbolt.org/z/8xoWGs9e4)): +- Added support for UTF-8 digit separators via an experimental locale + facet (https://github.com/fmtlib/fmt/issues/1861). For + example ([godbolt](https://godbolt.org/z/f7bcznb3W)): - ```c++ - #include - #include + ```c++ + auto loc = std::locale( + std::locale(), new fmt::format_facet("’")); + auto s = fmt::format(loc, "{:L}", 1000); + ``` - int main() { - try { - std::vector().at(0); - } catch(const std::exception& e) { - fmt::print("{}", e); - } - } - ``` + where `’` is U+2019 used as a digit separator in the de_CH locale. - prints: +- Added an overload of `formatted_size` that takes a locale + (https://github.com/fmtlib/fmt/issues/3084, + https://github.com/fmtlib/fmt/pull/3087). Thanks @gerboengels. - vector::_M_range_check: __n (which is 0) >= this->size() (which is 0) +- Removed the deprecated `FMT_DEPRECATED_OSTREAM`. - on libstdc++. Thanks @zach2good and @phprus. +- Fixed a UB when using a null `std::string_view` with + `fmt::to_string` or format string compilation + (https://github.com/fmtlib/fmt/issues/3241, + https://github.com/fmtlib/fmt/pull/3244). Thanks @phprus. -- Moved `std::error_code` formatter from `fmt/os.h` to `fmt/std.h`. - (https://github.com/fmtlib/fmt/pull/3125). Thanks @phprus. +- Added `starts_with` to the fallback `string_view` implementation + (https://github.com/fmtlib/fmt/pull/3080). Thanks @phprus. -- Added formatters for standard container adapters: - `std::priority_queue`, `std::queue` and `std::stack` - (https://github.com/fmtlib/fmt/issues/3215, - https://github.com/fmtlib/fmt/pull/3279). For example - ([godbolt](https://godbolt.org/z/74h1xY9qK)): +- Added `fmt::basic_format_string::get()` for compatibility with + `basic_format_string` + (https://github.com/fmtlib/fmt/pull/3111). Thanks @huangqinjin. - ```c++ - #include - #include - #include +- Added `println` for compatibility with C++23 + (https://github.com/fmtlib/fmt/pull/3267). Thanks @ShawnZhong. - int main() { - auto s = std::stack>(); - for (auto b: {true, false, true}) s.push(b); - fmt::print("{}\n", s); // prints [true, false, true] - } - ``` +- Renamed the `FMT_EXPORT` macro for shared library usage to + `FMT_LIB_EXPORT`. - Thanks @ShawnZhong. +- Improved documentation + (https://github.com/fmtlib/fmt/issues/3108, + https://github.com/fmtlib/fmt/issues/3169, + https://github.com/fmtlib/fmt/pull/3243). + https://github.com/fmtlib/fmt/pull/3404). + Thanks @Cleroth and @Vertexwahn. -- Added a formatter for `std::optional` to `fmt/std.h` - (https://github.com/fmtlib/fmt/issues/1367, - https://github.com/fmtlib/fmt/pull/3303). - Thanks @tom-huntington. +- Improved build configuration and tests + (https://github.com/fmtlib/fmt/pull/3118, + https://github.com/fmtlib/fmt/pull/3120, + https://github.com/fmtlib/fmt/pull/3188, + https://github.com/fmtlib/fmt/issues/3189, + https://github.com/fmtlib/fmt/pull/3198, + https://github.com/fmtlib/fmt/pull/3205, + https://github.com/fmtlib/fmt/pull/3207, + https://github.com/fmtlib/fmt/pull/3210, + https://github.com/fmtlib/fmt/pull/3240, + https://github.com/fmtlib/fmt/pull/3256, + https://github.com/fmtlib/fmt/pull/3264, + https://github.com/fmtlib/fmt/issues/3299, + https://github.com/fmtlib/fmt/pull/3302, + https://github.com/fmtlib/fmt/pull/3312, + https://github.com/fmtlib/fmt/issues/3317, + https://github.com/fmtlib/fmt/pull/3328, + https://github.com/fmtlib/fmt/pull/3333, + https://github.com/fmtlib/fmt/pull/3369, + https://github.com/fmtlib/fmt/issues/3373, + https://github.com/fmtlib/fmt/pull/3395, + https://github.com/fmtlib/fmt/pull/3406, + https://github.com/fmtlib/fmt/pull/3411). + Thanks @dimztimz, @phprus, @DavidKorczynski, @ChrisThrasher, + @FrancoisCarouge, @kennyweiss, @luzpaz, @codeinred, @Mixaill, @joycebrum, + @kevinhwang and @Vertexwahn. -- Fixed formatting of valueless by exception variants - (https://github.com/fmtlib/fmt/pull/3347). Thanks @TheOmegaCarrot. +- Fixed a regression in handling empty format specifiers after a colon + (`{:}`) (https://github.com/fmtlib/fmt/pull/3086). Thanks @oxidase. -- Made `fmt::ptr` accept `unique_ptr` with a custom deleter - (https://github.com/fmtlib/fmt/pull/3177). Thanks @hmbj. +- Worked around a broken implementation of + `std::is_constant_evaluated` in some versions of libstdc++ on clang + (https://github.com/fmtlib/fmt/issues/3247, + https://github.com/fmtlib/fmt/pull/3281). Thanks @phprus. -- Fixed formatting of noncopyable ranges and nested ranges of chars - (https://github.com/fmtlib/fmt/pull/3158 - https://github.com/fmtlib/fmt/issues/3286, - https://github.com/fmtlib/fmt/pull/3290). Thanks @BRevzin. +- Fixed formatting of volatile variables + (https://github.com/fmtlib/fmt/pull/3068). -- Fixed issues with formatting of paths and ranges of paths - (https://github.com/fmtlib/fmt/issues/3319, - https://github.com/fmtlib/fmt/pull/3321 - https://github.com/fmtlib/fmt/issues/3322). Thanks @phprus. - -- Improved handling of invalid Unicode in paths. - -- Enabled compile-time checks on Apple clang 14 and later - (https://github.com/fmtlib/fmt/pull/3331). Thanks @cloyce. - -- Improved compile-time checks of named arguments - (https://github.com/fmtlib/fmt/issues/3105, - https://github.com/fmtlib/fmt/pull/3214). Thanks @rbrich. - -- Fixed formatting when both alignment and `0` are given - (https://github.com/fmtlib/fmt/issues/3236, - https://github.com/fmtlib/fmt/pull/3248). Thanks @ShawnZhong. - -- Improved Unicode support in the experimental file API on Windows - (https://github.com/fmtlib/fmt/issues/3234, - https://github.com/fmtlib/fmt/pull/3293). Thanks @Fros1er. - -- Unified UTF transcoding - (https://github.com/fmtlib/fmt/pull/3416). Thanks @phprus. - -- Added support for UTF-8 digit separators via an experimental locale - facet (https://github.com/fmtlib/fmt/issues/1861). For - example ([godbolt](https://godbolt.org/z/f7bcznb3W)): - - ```c++ - auto loc = std::locale( - std::locale(), new fmt::format_facet("’")); - auto s = fmt::format(loc, "{:L}", 1000); - ``` - - where `’` is U+2019 used as a digit separator in the de_CH locale. - -- Added an overload of `formatted_size` that takes a locale - (https://github.com/fmtlib/fmt/issues/3084, - https://github.com/fmtlib/fmt/pull/3087). Thanks @gerboengels. - -- Removed the deprecated `FMT_DEPRECATED_OSTREAM`. - -- Fixed a UB when using a null `std::string_view` with - `fmt::to_string` or format string compilation - (https://github.com/fmtlib/fmt/issues/3241, - https://github.com/fmtlib/fmt/pull/3244). Thanks @phprus. - -- Added `starts_with` to the fallback `string_view` implementation - (https://github.com/fmtlib/fmt/pull/3080). Thanks @phprus. - -- Added `fmt::basic_format_string::get()` for compatibility with - `basic_format_string` - (https://github.com/fmtlib/fmt/pull/3111). Thanks @huangqinjin. - -- Added `println` for compatibility with C++23 - (https://github.com/fmtlib/fmt/pull/3267). Thanks @ShawnZhong. - -- Renamed the `FMT_EXPORT` macro for shared library usage to - `FMT_LIB_EXPORT`. - -- Improved documentation - (https://github.com/fmtlib/fmt/issues/3108, - https://github.com/fmtlib/fmt/issues/3169, - https://github.com/fmtlib/fmt/pull/3243). - https://github.com/fmtlib/fmt/pull/3404). - Thanks @Cleroth and @Vertexwahn. - -- Improved build configuration and tests - (https://github.com/fmtlib/fmt/pull/3118, - https://github.com/fmtlib/fmt/pull/3120, - https://github.com/fmtlib/fmt/pull/3188, - https://github.com/fmtlib/fmt/issues/3189, - https://github.com/fmtlib/fmt/pull/3198, - https://github.com/fmtlib/fmt/pull/3205, - https://github.com/fmtlib/fmt/pull/3207, - https://github.com/fmtlib/fmt/pull/3210, - https://github.com/fmtlib/fmt/pull/3240, - https://github.com/fmtlib/fmt/pull/3256, - https://github.com/fmtlib/fmt/pull/3264, - https://github.com/fmtlib/fmt/issues/3299, - https://github.com/fmtlib/fmt/pull/3302, - https://github.com/fmtlib/fmt/pull/3312, - https://github.com/fmtlib/fmt/issues/3317, - https://github.com/fmtlib/fmt/pull/3328, - https://github.com/fmtlib/fmt/pull/3333, - https://github.com/fmtlib/fmt/pull/3369, - https://github.com/fmtlib/fmt/issues/3373, - https://github.com/fmtlib/fmt/pull/3395, - https://github.com/fmtlib/fmt/pull/3406, - https://github.com/fmtlib/fmt/pull/3411). - Thanks @dimztimz, @phprus, @DavidKorczynski, @ChrisThrasher, - @FrancoisCarouge, @kennyweiss, @luzpaz, @codeinred, @Mixaill, @joycebrum, - @kevinhwang and @Vertexwahn. - -- Fixed a regression in handling empty format specifiers after a colon - (`{:}`) (https://github.com/fmtlib/fmt/pull/3086). Thanks @oxidase. - -- Worked around a broken implementation of - `std::is_constant_evaluated` in some versions of libstdc++ on clang - (https://github.com/fmtlib/fmt/issues/3247, - https://github.com/fmtlib/fmt/pull/3281). Thanks @phprus. - -- Fixed formatting of volatile variables - (https://github.com/fmtlib/fmt/pull/3068). - -- Fixed various warnings and compilation issues - (https://github.com/fmtlib/fmt/pull/3057, - https://github.com/fmtlib/fmt/pull/3066, - https://github.com/fmtlib/fmt/pull/3072, - https://github.com/fmtlib/fmt/pull/3082, - https://github.com/fmtlib/fmt/pull/3091, - https://github.com/fmtlib/fmt/issues/3092, - https://github.com/fmtlib/fmt/pull/3093, - https://github.com/fmtlib/fmt/pull/3095, - https://github.com/fmtlib/fmt/issues/3096, - https://github.com/fmtlib/fmt/pull/3097, - https://github.com/fmtlib/fmt/issues/3128, - https://github.com/fmtlib/fmt/pull/3129, - https://github.com/fmtlib/fmt/pull/3137, - https://github.com/fmtlib/fmt/pull/3139, - https://github.com/fmtlib/fmt/issues/3140, - https://github.com/fmtlib/fmt/pull/3142, - https://github.com/fmtlib/fmt/issues/3149, - https://github.com/fmtlib/fmt/pull/3150, - https://github.com/fmtlib/fmt/issues/3154, - https://github.com/fmtlib/fmt/issues/3163, - https://github.com/fmtlib/fmt/issues/3178, - https://github.com/fmtlib/fmt/pull/3184, - https://github.com/fmtlib/fmt/pull/3196, - https://github.com/fmtlib/fmt/issues/3204, - https://github.com/fmtlib/fmt/pull/3206, - https://github.com/fmtlib/fmt/pull/3208, - https://github.com/fmtlib/fmt/issues/3213, - https://github.com/fmtlib/fmt/pull/3216, - https://github.com/fmtlib/fmt/issues/3224, - https://github.com/fmtlib/fmt/issues/3226, - https://github.com/fmtlib/fmt/issues/3228, - https://github.com/fmtlib/fmt/pull/3229, - https://github.com/fmtlib/fmt/pull/3259, - https://github.com/fmtlib/fmt/issues/3274, - https://github.com/fmtlib/fmt/issues/3287, - https://github.com/fmtlib/fmt/pull/3288, - https://github.com/fmtlib/fmt/issues/3292, - https://github.com/fmtlib/fmt/pull/3295, - https://github.com/fmtlib/fmt/pull/3296, - https://github.com/fmtlib/fmt/issues/3298, - https://github.com/fmtlib/fmt/issues/3325, - https://github.com/fmtlib/fmt/pull/3326, - https://github.com/fmtlib/fmt/issues/3334, - https://github.com/fmtlib/fmt/issues/3342, - https://github.com/fmtlib/fmt/pull/3343, - https://github.com/fmtlib/fmt/issues/3351, - https://github.com/fmtlib/fmt/pull/3352, - https://github.com/fmtlib/fmt/pull/3362, - https://github.com/fmtlib/fmt/issues/3365, - https://github.com/fmtlib/fmt/pull/3366, - https://github.com/fmtlib/fmt/pull/3374, - https://github.com/fmtlib/fmt/issues/3377, - https://github.com/fmtlib/fmt/pull/3378, - https://github.com/fmtlib/fmt/issues/3381, - https://github.com/fmtlib/fmt/pull/3398, - https://github.com/fmtlib/fmt/pull/3413, - https://github.com/fmtlib/fmt/issues/3415). - Thanks @phprus, @gsjaardema, @NewbieOrange, @EngineLessCC, @asmaloney, - @HazardyKnusperkeks, @sergiud, @Youw, @thesmurph, @czudziakm, - @Roman-Koshelev, @chronoxor, @ShawnZhong, @russelltg, @glebm, @tmartin-gh, - @Zhaojun-Liu, @louiswins and @mogemimi. +- Fixed various warnings and compilation issues + (https://github.com/fmtlib/fmt/pull/3057, + https://github.com/fmtlib/fmt/pull/3066, + https://github.com/fmtlib/fmt/pull/3072, + https://github.com/fmtlib/fmt/pull/3082, + https://github.com/fmtlib/fmt/pull/3091, + https://github.com/fmtlib/fmt/issues/3092, + https://github.com/fmtlib/fmt/pull/3093, + https://github.com/fmtlib/fmt/pull/3095, + https://github.com/fmtlib/fmt/issues/3096, + https://github.com/fmtlib/fmt/pull/3097, + https://github.com/fmtlib/fmt/issues/3128, + https://github.com/fmtlib/fmt/pull/3129, + https://github.com/fmtlib/fmt/pull/3137, + https://github.com/fmtlib/fmt/pull/3139, + https://github.com/fmtlib/fmt/issues/3140, + https://github.com/fmtlib/fmt/pull/3142, + https://github.com/fmtlib/fmt/issues/3149, + https://github.com/fmtlib/fmt/pull/3150, + https://github.com/fmtlib/fmt/issues/3154, + https://github.com/fmtlib/fmt/issues/3163, + https://github.com/fmtlib/fmt/issues/3178, + https://github.com/fmtlib/fmt/pull/3184, + https://github.com/fmtlib/fmt/pull/3196, + https://github.com/fmtlib/fmt/issues/3204, + https://github.com/fmtlib/fmt/pull/3206, + https://github.com/fmtlib/fmt/pull/3208, + https://github.com/fmtlib/fmt/issues/3213, + https://github.com/fmtlib/fmt/pull/3216, + https://github.com/fmtlib/fmt/issues/3224, + https://github.com/fmtlib/fmt/issues/3226, + https://github.com/fmtlib/fmt/issues/3228, + https://github.com/fmtlib/fmt/pull/3229, + https://github.com/fmtlib/fmt/pull/3259, + https://github.com/fmtlib/fmt/issues/3274, + https://github.com/fmtlib/fmt/issues/3287, + https://github.com/fmtlib/fmt/pull/3288, + https://github.com/fmtlib/fmt/issues/3292, + https://github.com/fmtlib/fmt/pull/3295, + https://github.com/fmtlib/fmt/pull/3296, + https://github.com/fmtlib/fmt/issues/3298, + https://github.com/fmtlib/fmt/issues/3325, + https://github.com/fmtlib/fmt/pull/3326, + https://github.com/fmtlib/fmt/issues/3334, + https://github.com/fmtlib/fmt/issues/3342, + https://github.com/fmtlib/fmt/pull/3343, + https://github.com/fmtlib/fmt/issues/3351, + https://github.com/fmtlib/fmt/pull/3352, + https://github.com/fmtlib/fmt/pull/3362, + https://github.com/fmtlib/fmt/issues/3365, + https://github.com/fmtlib/fmt/pull/3366, + https://github.com/fmtlib/fmt/pull/3374, + https://github.com/fmtlib/fmt/issues/3377, + https://github.com/fmtlib/fmt/pull/3378, + https://github.com/fmtlib/fmt/issues/3381, + https://github.com/fmtlib/fmt/pull/3398, + https://github.com/fmtlib/fmt/pull/3413, + https://github.com/fmtlib/fmt/issues/3415). + Thanks @phprus, @gsjaardema, @NewbieOrange, @EngineLessCC, @asmaloney, + @HazardyKnusperkeks, @sergiud, @Youw, @thesmurph, @czudziakm, + @Roman-Koshelev, @chronoxor, @ShawnZhong, @russelltg, @glebm, @tmartin-gh, + @Zhaojun-Liu, @louiswins and @mogemimi. # 9.1.0 - 2022-08-27 -- `fmt::formatted_size` now works at compile time - (https://github.com/fmtlib/fmt/pull/3026). For example - ([godbolt](https://godbolt.org/z/1MW5rMdf8)): +- `fmt::formatted_size` now works at compile time + (https://github.com/fmtlib/fmt/pull/3026). For example + ([godbolt](https://godbolt.org/z/1MW5rMdf8)): - ```c++ - #include + ```c++ + #include - int main() { - using namespace fmt::literals; - constexpr size_t n = fmt::formatted_size("{}"_cf, 42); - fmt::print("{}\n", n); // prints 2 - } - ``` + int main() { + using namespace fmt::literals; + constexpr size_t n = fmt::formatted_size("{}"_cf, 42); + fmt::print("{}\n", n); // prints 2 + } + ``` - Thanks @marksantaniello. + Thanks @marksantaniello. -- Fixed handling of invalid UTF-8 - (https://github.com/fmtlib/fmt/pull/3038, - https://github.com/fmtlib/fmt/pull/3044, - https://github.com/fmtlib/fmt/pull/3056). - Thanks @phprus and @skeeto. +- Fixed handling of invalid UTF-8 + (https://github.com/fmtlib/fmt/pull/3038, + https://github.com/fmtlib/fmt/pull/3044, + https://github.com/fmtlib/fmt/pull/3056). + Thanks @phprus and @skeeto. -- Improved Unicode support in `ostream` overloads of `print` - (https://github.com/fmtlib/fmt/pull/2994, - https://github.com/fmtlib/fmt/pull/3001, - https://github.com/fmtlib/fmt/pull/3025). Thanks @dimztimz. +- Improved Unicode support in `ostream` overloads of `print` + (https://github.com/fmtlib/fmt/pull/2994, + https://github.com/fmtlib/fmt/pull/3001, + https://github.com/fmtlib/fmt/pull/3025). Thanks @dimztimz. -- Fixed handling of the sign specifier in localized formatting on - systems with 32-bit `wchar_t` - (https://github.com/fmtlib/fmt/issues/3041). +- Fixed handling of the sign specifier in localized formatting on + systems with 32-bit `wchar_t` + (https://github.com/fmtlib/fmt/issues/3041). -- Added support for wide streams to `fmt::streamed` - (https://github.com/fmtlib/fmt/pull/2994). Thanks @phprus. +- Added support for wide streams to `fmt::streamed` + (https://github.com/fmtlib/fmt/pull/2994). Thanks @phprus. -- Added the `n` specifier that disables the output of delimiters when - formatting ranges (https://github.com/fmtlib/fmt/pull/2981, - https://github.com/fmtlib/fmt/pull/2983). For example - ([godbolt](https://godbolt.org/z/roKqGdj8c)): +- Added the `n` specifier that disables the output of delimiters when + formatting ranges (https://github.com/fmtlib/fmt/pull/2981, + https://github.com/fmtlib/fmt/pull/2983). For example + ([godbolt](https://godbolt.org/z/roKqGdj8c)): - ```c++ - #include - #include + ```c++ + #include + #include - int main() { - auto v = std::vector{1, 2, 3}; - fmt::print("{:n}\n", v); // prints 1, 2, 3 - } - ``` + int main() { + auto v = std::vector{1, 2, 3}; + fmt::print("{:n}\n", v); // prints 1, 2, 3 + } + ``` - Thanks @BRevzin. + Thanks @BRevzin. -- Worked around problematic `std::string_view` constructors introduced - in C++23 (https://github.com/fmtlib/fmt/issues/3030, - https://github.com/fmtlib/fmt/issues/3050). Thanks @strega-nil-ms. +- Worked around problematic `std::string_view` constructors introduced + in C++23 (https://github.com/fmtlib/fmt/issues/3030, + https://github.com/fmtlib/fmt/issues/3050). Thanks @strega-nil-ms. -- Improve handling (exclusion) of recursive ranges - (https://github.com/fmtlib/fmt/issues/2968, - https://github.com/fmtlib/fmt/pull/2974). Thanks @Dani-Hub. +- Improve handling (exclusion) of recursive ranges + (https://github.com/fmtlib/fmt/issues/2968, + https://github.com/fmtlib/fmt/pull/2974). Thanks @Dani-Hub. -- Improved error reporting in format string compilation - (https://github.com/fmtlib/fmt/issues/3055). +- Improved error reporting in format string compilation + (https://github.com/fmtlib/fmt/issues/3055). -- Improved the implementation of - [Dragonbox](https://github.com/jk-jeon/dragonbox), the algorithm - used for the default floating-point formatting - (https://github.com/fmtlib/fmt/pull/2984). Thanks @jk-jeon. +- Improved the implementation of + [Dragonbox](https://github.com/jk-jeon/dragonbox), the algorithm + used for the default floating-point formatting + (https://github.com/fmtlib/fmt/pull/2984). Thanks @jk-jeon. -- Fixed issues with floating-point formatting on exotic platforms. +- Fixed issues with floating-point formatting on exotic platforms. -- Improved the implementation of chrono formatting - (https://github.com/fmtlib/fmt/pull/3010). Thanks @phprus. +- Improved the implementation of chrono formatting + (https://github.com/fmtlib/fmt/pull/3010). Thanks @phprus. -- Improved documentation - (https://github.com/fmtlib/fmt/pull/2966, - https://github.com/fmtlib/fmt/pull/3009, - https://github.com/fmtlib/fmt/issues/3020, - https://github.com/fmtlib/fmt/pull/3037). - Thanks @mwinterb, @jcelerier and @remiburtin. +- Improved documentation + (https://github.com/fmtlib/fmt/pull/2966, + https://github.com/fmtlib/fmt/pull/3009, + https://github.com/fmtlib/fmt/issues/3020, + https://github.com/fmtlib/fmt/pull/3037). + Thanks @mwinterb, @jcelerier and @remiburtin. -- Improved build configuration - (https://github.com/fmtlib/fmt/pull/2991, - https://github.com/fmtlib/fmt/pull/2995, - https://github.com/fmtlib/fmt/issues/3004, - https://github.com/fmtlib/fmt/pull/3007, - https://github.com/fmtlib/fmt/pull/3040). - Thanks @dimztimz and @hwhsu1231. +- Improved build configuration + (https://github.com/fmtlib/fmt/pull/2991, + https://github.com/fmtlib/fmt/pull/2995, + https://github.com/fmtlib/fmt/issues/3004, + https://github.com/fmtlib/fmt/pull/3007, + https://github.com/fmtlib/fmt/pull/3040). + Thanks @dimztimz and @hwhsu1231. -- Fixed various warnings and compilation issues - (https://github.com/fmtlib/fmt/issues/2969, - https://github.com/fmtlib/fmt/pull/2971, - https://github.com/fmtlib/fmt/issues/2975, - https://github.com/fmtlib/fmt/pull/2982, - https://github.com/fmtlib/fmt/pull/2985, - https://github.com/fmtlib/fmt/issues/2988, - https://github.com/fmtlib/fmt/issues/2989, - https://github.com/fmtlib/fmt/issues/3000, - https://github.com/fmtlib/fmt/issues/3006, - https://github.com/fmtlib/fmt/issues/3014, - https://github.com/fmtlib/fmt/issues/3015, - https://github.com/fmtlib/fmt/pull/3021, - https://github.com/fmtlib/fmt/issues/3023, - https://github.com/fmtlib/fmt/pull/3024, - https://github.com/fmtlib/fmt/pull/3029, - https://github.com/fmtlib/fmt/pull/3043, - https://github.com/fmtlib/fmt/issues/3052, - https://github.com/fmtlib/fmt/pull/3053, - https://github.com/fmtlib/fmt/pull/3054). - Thanks @h-friederich, @dimztimz, @olupton, @bernhardmgruber and @phprus. +- Fixed various warnings and compilation issues + (https://github.com/fmtlib/fmt/issues/2969, + https://github.com/fmtlib/fmt/pull/2971, + https://github.com/fmtlib/fmt/issues/2975, + https://github.com/fmtlib/fmt/pull/2982, + https://github.com/fmtlib/fmt/pull/2985, + https://github.com/fmtlib/fmt/issues/2988, + https://github.com/fmtlib/fmt/issues/2989, + https://github.com/fmtlib/fmt/issues/3000, + https://github.com/fmtlib/fmt/issues/3006, + https://github.com/fmtlib/fmt/issues/3014, + https://github.com/fmtlib/fmt/issues/3015, + https://github.com/fmtlib/fmt/pull/3021, + https://github.com/fmtlib/fmt/issues/3023, + https://github.com/fmtlib/fmt/pull/3024, + https://github.com/fmtlib/fmt/pull/3029, + https://github.com/fmtlib/fmt/pull/3043, + https://github.com/fmtlib/fmt/issues/3052, + https://github.com/fmtlib/fmt/pull/3053, + https://github.com/fmtlib/fmt/pull/3054). + Thanks @h-friederich, @dimztimz, @olupton, @bernhardmgruber and @phprus. # 9.0.0 - 2022-07-04 -- Switched to the internal floating point formatter for all decimal - presentation formats. In particular this results in consistent - rounding on all platforms and removing the `s[n]printf` fallback for - decimal FP formatting. +- Switched to the internal floating point formatter for all decimal + presentation formats. In particular this results in consistent + rounding on all platforms and removing the `s[n]printf` fallback for + decimal FP formatting. -- Compile-time floating point formatting no longer requires the - header-only mode. For example - ([godbolt](https://godbolt.org/z/G37PTeG3b)): +- Compile-time floating point formatting no longer requires the + header-only mode. For example + ([godbolt](https://godbolt.org/z/G37PTeG3b)): - ```c++ - #include - #include + ```c++ + #include + #include - consteval auto compile_time_dtoa(double value) -> std::array { - auto result = std::array(); - fmt::format_to(result.data(), FMT_COMPILE("{}"), value); - return result; + consteval auto compile_time_dtoa(double value) -> std::array { + auto result = std::array(); + fmt::format_to(result.data(), FMT_COMPILE("{}"), value); + return result; + } + + constexpr auto answer = compile_time_dtoa(0.42); + ``` + + works with the default settings. + +- Improved the implementation of + [Dragonbox](https://github.com/jk-jeon/dragonbox), the algorithm + used for the default floating-point formatting + (https://github.com/fmtlib/fmt/pull/2713, + https://github.com/fmtlib/fmt/pull/2750). Thanks @jk-jeon. + +- Made `fmt::to_string` work with `__float128`. This uses the internal + FP formatter and works even on system without `__float128` support + in `[s]printf`. + +- Disabled automatic `std::ostream` insertion operator (`operator<<`) + discovery when `fmt/ostream.h` is included to prevent ODR + violations. You can get the old behavior by defining + `FMT_DEPRECATED_OSTREAM` but this will be removed in the next major + release. Use `fmt::streamed` or `fmt::ostream_formatter` to enable + formatting via `std::ostream` instead. + +- Added `fmt::ostream_formatter` that can be used to write `formatter` + specializations that perform formatting via `std::ostream`. For + example ([godbolt](https://godbolt.org/z/5sEc5qMsf)): + + ```c++ + #include + + struct date { + int year, month, day; + + friend std::ostream& operator<<(std::ostream& os, const date& d) { + return os << d.year << '-' << d.month << '-' << d.day; } + }; - constexpr auto answer = compile_time_dtoa(0.42); - ``` + template <> struct fmt::formatter : ostream_formatter {}; - works with the default settings. + std::string s = fmt::format("The date is {}", date{2012, 12, 9}); + // s == "The date is 2012-12-9" + ``` -- Improved the implementation of - [Dragonbox](https://github.com/jk-jeon/dragonbox), the algorithm - used for the default floating-point formatting - (https://github.com/fmtlib/fmt/pull/2713, - https://github.com/fmtlib/fmt/pull/2750). Thanks @jk-jeon. +- Added the `fmt::streamed` function that takes an object and formats + it via `std::ostream`. For example + ([godbolt](https://godbolt.org/z/5G3346G1f)): -- Made `fmt::to_string` work with `__float128`. This uses the internal - FP formatter and works even on system without `__float128` support - in `[s]printf`. + ```c++ + #include + #include -- Disabled automatic `std::ostream` insertion operator (`operator<<`) - discovery when `fmt/ostream.h` is included to prevent ODR - violations. You can get the old behavior by defining - `FMT_DEPRECATED_OSTREAM` but this will be removed in the next major - release. Use `fmt::streamed` or `fmt::ostream_formatter` to enable - formatting via `std::ostream` instead. + int main() { + fmt::print("Current thread id: {}\n", + fmt::streamed(std::this_thread::get_id())); + } + ``` -- Added `fmt::ostream_formatter` that can be used to write `formatter` - specializations that perform formatting via `std::ostream`. For - example ([godbolt](https://godbolt.org/z/5sEc5qMsf)): + Note that `fmt/std.h` provides a `formatter` specialization for + `std::thread::id` so you don\'t need to format it via + `std::ostream`. - ```c++ - #include +- Deprecated implicit conversions of unscoped enums to integers for + consistency with scoped enums. - struct date { - int year, month, day; +- Added an argument-dependent lookup based `format_as` extension API + to simplify formatting of enums. - friend std::ostream& operator<<(std::ostream& os, const date& d) { - return os << d.year << '-' << d.month << '-' << d.day; - } - }; +- Added experimental `std::variant` formatting support + (https://github.com/fmtlib/fmt/pull/2941). For example + ([godbolt](https://godbolt.org/z/KG9z6cq68)): - template <> struct fmt::formatter : ostream_formatter {}; + ```c++ + #include + #include - std::string s = fmt::format("The date is {}", date{2012, 12, 9}); - // s == "The date is 2012-12-9" - ``` + int main() { + auto v = std::variant(42); + fmt::print("{}\n", v); + } + ``` -- Added the `fmt::streamed` function that takes an object and formats - it via `std::ostream`. For example - ([godbolt](https://godbolt.org/z/5G3346G1f)): + prints: - ```c++ - #include - #include + variant(42) - int main() { - fmt::print("Current thread id: {}\n", - fmt::streamed(std::this_thread::get_id())); - } - ``` + Thanks @jehelset. - Note that `fmt/std.h` provides a `formatter` specialization for - `std::thread::id` so you don\'t need to format it via - `std::ostream`. +- Added experimental `std::filesystem::path` formatting support + (https://github.com/fmtlib/fmt/issues/2865, + https://github.com/fmtlib/fmt/pull/2902, + https://github.com/fmtlib/fmt/issues/2917, + https://github.com/fmtlib/fmt/pull/2918). For example + ([godbolt](https://godbolt.org/z/o44dMexEb)): -- Deprecated implicit conversions of unscoped enums to integers for - consistency with scoped enums. + ```c++ + #include + #include -- Added an argument-dependent lookup based `format_as` extension API - to simplify formatting of enums. + int main() { + fmt::print("There is no place like {}.", std::filesystem::path("/home")); + } + ``` -- Added experimental `std::variant` formatting support - (https://github.com/fmtlib/fmt/pull/2941). For example - ([godbolt](https://godbolt.org/z/KG9z6cq68)): + prints: - ```c++ - #include - #include + There is no place like "/home". - int main() { - auto v = std::variant(42); - fmt::print("{}\n", v); - } - ``` + Thanks @phprus. - prints: +- Added a `std::thread::id` formatter to `fmt/std.h`. For example + ([godbolt](https://godbolt.org/z/j1azbYf3E)): - variant(42) + ```c++ + #include + #include - Thanks @jehelset. + int main() { + fmt::print("Current thread id: {}\n", std::this_thread::get_id()); + } + ``` -- Added experimental `std::filesystem::path` formatting support - (https://github.com/fmtlib/fmt/issues/2865, - https://github.com/fmtlib/fmt/pull/2902, - https://github.com/fmtlib/fmt/issues/2917, - https://github.com/fmtlib/fmt/pull/2918). For example - ([godbolt](https://godbolt.org/z/o44dMexEb)): +- Added `fmt::styled` that applies a text style to an individual + argument (https://github.com/fmtlib/fmt/pull/2793). For + example ([godbolt](https://godbolt.org/z/vWGW7v5M6)): - ```c++ - #include - #include + ```c++ + #include + #include - int main() { - fmt::print("There is no place like {}.", std::filesystem::path("/home")); - } - ``` + int main() { + auto now = std::chrono::system_clock::now(); + fmt::print( + "[{}] {}: {}\n", + fmt::styled(now, fmt::emphasis::bold), + fmt::styled("error", fg(fmt::color::red)), + "something went wrong"); + } + ``` - prints: + prints - There is no place like "/home". + ![](https://user-images.githubusercontent.com/576385/175071215-12809244-dab0-4005-96d8-7cd911c964d5.png) - Thanks @phprus. + Thanks @rbrugo. -- Added a `std::thread::id` formatter to `fmt/std.h`. For example - ([godbolt](https://godbolt.org/z/j1azbYf3E)): +- Made `fmt::print` overload for text styles correctly handle UTF-8 + (https://github.com/fmtlib/fmt/issues/2681, + https://github.com/fmtlib/fmt/pull/2701). Thanks @AlexGuteniev. - ```c++ - #include - #include +- Fixed Unicode handling when writing to an ostream. - int main() { - fmt::print("Current thread id: {}\n", std::this_thread::get_id()); - } - ``` +- Added support for nested specifiers to range formatting + (https://github.com/fmtlib/fmt/pull/2673). For example + ([godbolt](https://godbolt.org/z/xd3Gj38cf)): -- Added `fmt::styled` that applies a text style to an individual - argument (https://github.com/fmtlib/fmt/pull/2793). For - example ([godbolt](https://godbolt.org/z/vWGW7v5M6)): + ```c++ + #include + #include - ```c++ - #include - #include + int main() { + fmt::print("{::#x}\n", std::vector{10, 20, 30}); + } + ``` - int main() { - auto now = std::chrono::system_clock::now(); - fmt::print( - "[{}] {}: {}\n", - fmt::styled(now, fmt::emphasis::bold), - fmt::styled("error", fg(fmt::color::red)), - "something went wrong"); - } - ``` + prints `[0xa, 0x14, 0x1e]`. - prints - - ![](https://user-images.githubusercontent.com/576385/175071215-12809244-dab0-4005-96d8-7cd911c964d5.png) - - Thanks @rbrugo. - -- Made `fmt::print` overload for text styles correctly handle UTF-8 - (https://github.com/fmtlib/fmt/issues/2681, - https://github.com/fmtlib/fmt/pull/2701). Thanks @AlexGuteniev. - -- Fixed Unicode handling when writing to an ostream. - -- Added support for nested specifiers to range formatting - (https://github.com/fmtlib/fmt/pull/2673). For example - ([godbolt](https://godbolt.org/z/xd3Gj38cf)): - - ```c++ - #include - #include - - int main() { - fmt::print("{::#x}\n", std::vector{10, 20, 30}); - } - ``` - - prints `[0xa, 0x14, 0x1e]`. - - Thanks @BRevzin. - -- Implemented escaping of wide strings in ranges - (https://github.com/fmtlib/fmt/pull/2904). Thanks @phprus. - -- Added support for ranges with `begin` / `end` found via the - argument-dependent lookup - (https://github.com/fmtlib/fmt/pull/2807). Thanks @rbrugo. - -- Fixed formatting of certain kinds of ranges of ranges - (https://github.com/fmtlib/fmt/pull/2787). Thanks @BRevzin. - -- Fixed handling of maps with element types other than `std::pair` - (https://github.com/fmtlib/fmt/pull/2944). Thanks @BrukerJWD. - -- Made tuple formatter enabled only if elements are formattable - (https://github.com/fmtlib/fmt/issues/2939, - https://github.com/fmtlib/fmt/pull/2940). Thanks @jehelset. - -- Made `fmt::join` compatible with format string compilation - (https://github.com/fmtlib/fmt/issues/2719, - https://github.com/fmtlib/fmt/pull/2720). Thanks @phprus. - -- Made compile-time checks work with named arguments of custom types - and `std::ostream` `print` overloads - (https://github.com/fmtlib/fmt/issues/2816, - https://github.com/fmtlib/fmt/issues/2817, - https://github.com/fmtlib/fmt/pull/2819). Thanks @timsong-cpp. - -- Removed `make_args_checked` because it is no longer needed for - compile-time checks - (https://github.com/fmtlib/fmt/pull/2760). Thanks @phprus. - -- Removed the following deprecated APIs: `_format`, `arg_join`, the - `format_to` overload that takes a memory buffer, `[v]fprintf` that - takes an `ostream`. - -- Removed the deprecated implicit conversion of `[const] signed char*` - and `[const] unsigned char*` to C strings. - -- Removed the deprecated `fmt/locale.h`. - -- Replaced the deprecated `fileno()` with `descriptor()` in - `buffered_file`. - -- Moved `to_string_view` to the `detail` namespace since it\'s an - implementation detail. - -- Made access mode of a created file consistent with `fopen` by - setting `S_IWGRP` and `S_IWOTH` - (https://github.com/fmtlib/fmt/pull/2733). Thanks @arogge. - -- Removed a redundant buffer resize when formatting to `std::ostream` - (https://github.com/fmtlib/fmt/issues/2842, - https://github.com/fmtlib/fmt/pull/2843). Thanks @jcelerier. - -- Made precision computation for strings consistent with width - (https://github.com/fmtlib/fmt/issues/2888). - -- Fixed handling of locale separators in floating point formatting - (https://github.com/fmtlib/fmt/issues/2830). - -- Made sign specifiers work with `__int128_t` - (https://github.com/fmtlib/fmt/issues/2773). - -- Improved support for systems such as CHERI with extra data stored in - pointers (https://github.com/fmtlib/fmt/pull/2932). - Thanks @davidchisnall. - -- Improved documentation - (https://github.com/fmtlib/fmt/pull/2706, - https://github.com/fmtlib/fmt/pull/2712, - https://github.com/fmtlib/fmt/pull/2789, - https://github.com/fmtlib/fmt/pull/2803, - https://github.com/fmtlib/fmt/pull/2805, - https://github.com/fmtlib/fmt/pull/2815, - https://github.com/fmtlib/fmt/pull/2924). - Thanks @BRevzin, @Pokechu22, @setoye, @rtobar, @rbrugo, @anoonD and - @leha-bot. - -- Improved build configuration - (https://github.com/fmtlib/fmt/pull/2766, - https://github.com/fmtlib/fmt/pull/2772, - https://github.com/fmtlib/fmt/pull/2836, - https://github.com/fmtlib/fmt/pull/2852, - https://github.com/fmtlib/fmt/pull/2907, - https://github.com/fmtlib/fmt/pull/2913, - https://github.com/fmtlib/fmt/pull/2914). - Thanks @kambala-decapitator, @mattiasljungstrom, @kieselnb, @nathannaveen - and @Vertexwahn. - -- Fixed various warnings and compilation issues - (https://github.com/fmtlib/fmt/issues/2408, - https://github.com/fmtlib/fmt/issues/2507, - https://github.com/fmtlib/fmt/issues/2697, - https://github.com/fmtlib/fmt/issues/2715, - https://github.com/fmtlib/fmt/issues/2717, - https://github.com/fmtlib/fmt/pull/2722, - https://github.com/fmtlib/fmt/pull/2724, - https://github.com/fmtlib/fmt/pull/2725, - https://github.com/fmtlib/fmt/issues/2726, - https://github.com/fmtlib/fmt/pull/2728, - https://github.com/fmtlib/fmt/pull/2732, - https://github.com/fmtlib/fmt/issues/2738, - https://github.com/fmtlib/fmt/pull/2742, - https://github.com/fmtlib/fmt/issues/2744, - https://github.com/fmtlib/fmt/issues/2745, - https://github.com/fmtlib/fmt/issues/2746, - https://github.com/fmtlib/fmt/issues/2754, - https://github.com/fmtlib/fmt/pull/2755, - https://github.com/fmtlib/fmt/issues/2757, - https://github.com/fmtlib/fmt/pull/2758, - https://github.com/fmtlib/fmt/issues/2761, - https://github.com/fmtlib/fmt/pull/2762, - https://github.com/fmtlib/fmt/issues/2763, - https://github.com/fmtlib/fmt/pull/2765, - https://github.com/fmtlib/fmt/issues/2769, - https://github.com/fmtlib/fmt/pull/2770, - https://github.com/fmtlib/fmt/issues/2771, - https://github.com/fmtlib/fmt/issues/2777, - https://github.com/fmtlib/fmt/pull/2779, - https://github.com/fmtlib/fmt/pull/2782, - https://github.com/fmtlib/fmt/pull/2783, - https://github.com/fmtlib/fmt/issues/2794, - https://github.com/fmtlib/fmt/issues/2796, - https://github.com/fmtlib/fmt/pull/2797, - https://github.com/fmtlib/fmt/pull/2801, - https://github.com/fmtlib/fmt/pull/2802, - https://github.com/fmtlib/fmt/issues/2808, - https://github.com/fmtlib/fmt/issues/2818, - https://github.com/fmtlib/fmt/pull/2819, - https://github.com/fmtlib/fmt/issues/2829, - https://github.com/fmtlib/fmt/issues/2835, - https://github.com/fmtlib/fmt/issues/2848, - https://github.com/fmtlib/fmt/issues/2860, - https://github.com/fmtlib/fmt/pull/2861, - https://github.com/fmtlib/fmt/pull/2882, - https://github.com/fmtlib/fmt/issues/2886, - https://github.com/fmtlib/fmt/issues/2891, - https://github.com/fmtlib/fmt/pull/2892, - https://github.com/fmtlib/fmt/issues/2895, - https://github.com/fmtlib/fmt/issues/2896, - https://github.com/fmtlib/fmt/pull/2903, - https://github.com/fmtlib/fmt/issues/2906, - https://github.com/fmtlib/fmt/issues/2908, - https://github.com/fmtlib/fmt/pull/2909, - https://github.com/fmtlib/fmt/issues/2920, - https://github.com/fmtlib/fmt/pull/2922, - https://github.com/fmtlib/fmt/pull/2927, - https://github.com/fmtlib/fmt/pull/2929, - https://github.com/fmtlib/fmt/issues/2936, - https://github.com/fmtlib/fmt/pull/2937, - https://github.com/fmtlib/fmt/pull/2938, - https://github.com/fmtlib/fmt/pull/2951, - https://github.com/fmtlib/fmt/issues/2954, - https://github.com/fmtlib/fmt/pull/2957, - https://github.com/fmtlib/fmt/issues/2958, - https://github.com/fmtlib/fmt/pull/2960). - Thanks @matrackif @Tobi823, @ivan-volnov, @VasiliPupkin256, - @federico-busato, @barcharcraz, @jk-jeon, @HazardyKnusperkeks, @dalboris, - @seanm, @gsjaardema, @timsong-cpp, @seanm, @frithrah, @chronoxor, @Agga, - @madmaxoft, @JurajX, @phprus and @Dani-Hub. + Thanks @BRevzin. + +- Implemented escaping of wide strings in ranges + (https://github.com/fmtlib/fmt/pull/2904). Thanks @phprus. + +- Added support for ranges with `begin` / `end` found via the + argument-dependent lookup + (https://github.com/fmtlib/fmt/pull/2807). Thanks @rbrugo. + +- Fixed formatting of certain kinds of ranges of ranges + (https://github.com/fmtlib/fmt/pull/2787). Thanks @BRevzin. + +- Fixed handling of maps with element types other than `std::pair` + (https://github.com/fmtlib/fmt/pull/2944). Thanks @BrukerJWD. + +- Made tuple formatter enabled only if elements are formattable + (https://github.com/fmtlib/fmt/issues/2939, + https://github.com/fmtlib/fmt/pull/2940). Thanks @jehelset. + +- Made `fmt::join` compatible with format string compilation + (https://github.com/fmtlib/fmt/issues/2719, + https://github.com/fmtlib/fmt/pull/2720). Thanks @phprus. + +- Made compile-time checks work with named arguments of custom types + and `std::ostream` `print` overloads + (https://github.com/fmtlib/fmt/issues/2816, + https://github.com/fmtlib/fmt/issues/2817, + https://github.com/fmtlib/fmt/pull/2819). Thanks @timsong-cpp. + +- Removed `make_args_checked` because it is no longer needed for + compile-time checks + (https://github.com/fmtlib/fmt/pull/2760). Thanks @phprus. + +- Removed the following deprecated APIs: `_format`, `arg_join`, the + `format_to` overload that takes a memory buffer, `[v]fprintf` that + takes an `ostream`. + +- Removed the deprecated implicit conversion of `[const] signed char*` + and `[const] unsigned char*` to C strings. + +- Removed the deprecated `fmt/locale.h`. + +- Replaced the deprecated `fileno()` with `descriptor()` in + `buffered_file`. + +- Moved `to_string_view` to the `detail` namespace since it\'s an + implementation detail. + +- Made access mode of a created file consistent with `fopen` by + setting `S_IWGRP` and `S_IWOTH` + (https://github.com/fmtlib/fmt/pull/2733). Thanks @arogge. + +- Removed a redundant buffer resize when formatting to `std::ostream` + (https://github.com/fmtlib/fmt/issues/2842, + https://github.com/fmtlib/fmt/pull/2843). Thanks @jcelerier. + +- Made precision computation for strings consistent with width + (https://github.com/fmtlib/fmt/issues/2888). + +- Fixed handling of locale separators in floating point formatting + (https://github.com/fmtlib/fmt/issues/2830). + +- Made sign specifiers work with `__int128_t` + (https://github.com/fmtlib/fmt/issues/2773). + +- Improved support for systems such as CHERI with extra data stored in + pointers (https://github.com/fmtlib/fmt/pull/2932). + Thanks @davidchisnall. + +- Improved documentation + (https://github.com/fmtlib/fmt/pull/2706, + https://github.com/fmtlib/fmt/pull/2712, + https://github.com/fmtlib/fmt/pull/2789, + https://github.com/fmtlib/fmt/pull/2803, + https://github.com/fmtlib/fmt/pull/2805, + https://github.com/fmtlib/fmt/pull/2815, + https://github.com/fmtlib/fmt/pull/2924). + Thanks @BRevzin, @Pokechu22, @setoye, @rtobar, @rbrugo, @anoonD and + @leha-bot. + +- Improved build configuration + (https://github.com/fmtlib/fmt/pull/2766, + https://github.com/fmtlib/fmt/pull/2772, + https://github.com/fmtlib/fmt/pull/2836, + https://github.com/fmtlib/fmt/pull/2852, + https://github.com/fmtlib/fmt/pull/2907, + https://github.com/fmtlib/fmt/pull/2913, + https://github.com/fmtlib/fmt/pull/2914). + Thanks @kambala-decapitator, @mattiasljungstrom, @kieselnb, @nathannaveen + and @Vertexwahn. + +- Fixed various warnings and compilation issues + (https://github.com/fmtlib/fmt/issues/2408, + https://github.com/fmtlib/fmt/issues/2507, + https://github.com/fmtlib/fmt/issues/2697, + https://github.com/fmtlib/fmt/issues/2715, + https://github.com/fmtlib/fmt/issues/2717, + https://github.com/fmtlib/fmt/pull/2722, + https://github.com/fmtlib/fmt/pull/2724, + https://github.com/fmtlib/fmt/pull/2725, + https://github.com/fmtlib/fmt/issues/2726, + https://github.com/fmtlib/fmt/pull/2728, + https://github.com/fmtlib/fmt/pull/2732, + https://github.com/fmtlib/fmt/issues/2738, + https://github.com/fmtlib/fmt/pull/2742, + https://github.com/fmtlib/fmt/issues/2744, + https://github.com/fmtlib/fmt/issues/2745, + https://github.com/fmtlib/fmt/issues/2746, + https://github.com/fmtlib/fmt/issues/2754, + https://github.com/fmtlib/fmt/pull/2755, + https://github.com/fmtlib/fmt/issues/2757, + https://github.com/fmtlib/fmt/pull/2758, + https://github.com/fmtlib/fmt/issues/2761, + https://github.com/fmtlib/fmt/pull/2762, + https://github.com/fmtlib/fmt/issues/2763, + https://github.com/fmtlib/fmt/pull/2765, + https://github.com/fmtlib/fmt/issues/2769, + https://github.com/fmtlib/fmt/pull/2770, + https://github.com/fmtlib/fmt/issues/2771, + https://github.com/fmtlib/fmt/issues/2777, + https://github.com/fmtlib/fmt/pull/2779, + https://github.com/fmtlib/fmt/pull/2782, + https://github.com/fmtlib/fmt/pull/2783, + https://github.com/fmtlib/fmt/issues/2794, + https://github.com/fmtlib/fmt/issues/2796, + https://github.com/fmtlib/fmt/pull/2797, + https://github.com/fmtlib/fmt/pull/2801, + https://github.com/fmtlib/fmt/pull/2802, + https://github.com/fmtlib/fmt/issues/2808, + https://github.com/fmtlib/fmt/issues/2818, + https://github.com/fmtlib/fmt/pull/2819, + https://github.com/fmtlib/fmt/issues/2829, + https://github.com/fmtlib/fmt/issues/2835, + https://github.com/fmtlib/fmt/issues/2848, + https://github.com/fmtlib/fmt/issues/2860, + https://github.com/fmtlib/fmt/pull/2861, + https://github.com/fmtlib/fmt/pull/2882, + https://github.com/fmtlib/fmt/issues/2886, + https://github.com/fmtlib/fmt/issues/2891, + https://github.com/fmtlib/fmt/pull/2892, + https://github.com/fmtlib/fmt/issues/2895, + https://github.com/fmtlib/fmt/issues/2896, + https://github.com/fmtlib/fmt/pull/2903, + https://github.com/fmtlib/fmt/issues/2906, + https://github.com/fmtlib/fmt/issues/2908, + https://github.com/fmtlib/fmt/pull/2909, + https://github.com/fmtlib/fmt/issues/2920, + https://github.com/fmtlib/fmt/pull/2922, + https://github.com/fmtlib/fmt/pull/2927, + https://github.com/fmtlib/fmt/pull/2929, + https://github.com/fmtlib/fmt/issues/2936, + https://github.com/fmtlib/fmt/pull/2937, + https://github.com/fmtlib/fmt/pull/2938, + https://github.com/fmtlib/fmt/pull/2951, + https://github.com/fmtlib/fmt/issues/2954, + https://github.com/fmtlib/fmt/pull/2957, + https://github.com/fmtlib/fmt/issues/2958, + https://github.com/fmtlib/fmt/pull/2960). + Thanks @matrackif @Tobi823, @ivan-volnov, @VasiliPupkin256, + @federico-busato, @barcharcraz, @jk-jeon, @HazardyKnusperkeks, @dalboris, + @seanm, @gsjaardema, @timsong-cpp, @seanm, @frithrah, @chronoxor, @Agga, + @madmaxoft, @JurajX, @phprus and @Dani-Hub. # 8.1.1 - 2022-01-06 -- Restored ABI compatibility with version 8.0.x - (https://github.com/fmtlib/fmt/issues/2695, - https://github.com/fmtlib/fmt/pull/2696). Thanks @saraedum. -- Fixed chrono formatting on big endian systems - (https://github.com/fmtlib/fmt/issues/2698, - https://github.com/fmtlib/fmt/pull/2699). - Thanks @phprus and @xvitaly. -- Fixed a linkage error with mingw - (https://github.com/fmtlib/fmt/issues/2691, - https://github.com/fmtlib/fmt/pull/2692). Thanks @rbberger. +- Restored ABI compatibility with version 8.0.x + (https://github.com/fmtlib/fmt/issues/2695, + https://github.com/fmtlib/fmt/pull/2696). Thanks @saraedum. +- Fixed chrono formatting on big endian systems + (https://github.com/fmtlib/fmt/issues/2698, + https://github.com/fmtlib/fmt/pull/2699). + Thanks @phprus and @xvitaly. +- Fixed a linkage error with mingw + (https://github.com/fmtlib/fmt/issues/2691, + https://github.com/fmtlib/fmt/pull/2692). Thanks @rbberger. # 8.1.0 - 2022-01-02 -- Optimized chrono formatting - (https://github.com/fmtlib/fmt/pull/2500, - https://github.com/fmtlib/fmt/pull/2537, - https://github.com/fmtlib/fmt/issues/2541, - https://github.com/fmtlib/fmt/pull/2544, - https://github.com/fmtlib/fmt/pull/2550, - https://github.com/fmtlib/fmt/pull/2551, - https://github.com/fmtlib/fmt/pull/2576, - https://github.com/fmtlib/fmt/issues/2577, - https://github.com/fmtlib/fmt/pull/2586, - https://github.com/fmtlib/fmt/pull/2591, - https://github.com/fmtlib/fmt/pull/2594, - https://github.com/fmtlib/fmt/pull/2602, - https://github.com/fmtlib/fmt/pull/2617, - https://github.com/fmtlib/fmt/issues/2628, - https://github.com/fmtlib/fmt/pull/2633, - https://github.com/fmtlib/fmt/issues/2670, - https://github.com/fmtlib/fmt/pull/2671). +- Optimized chrono formatting + (https://github.com/fmtlib/fmt/pull/2500, + https://github.com/fmtlib/fmt/pull/2537, + https://github.com/fmtlib/fmt/issues/2541, + https://github.com/fmtlib/fmt/pull/2544, + https://github.com/fmtlib/fmt/pull/2550, + https://github.com/fmtlib/fmt/pull/2551, + https://github.com/fmtlib/fmt/pull/2576, + https://github.com/fmtlib/fmt/issues/2577, + https://github.com/fmtlib/fmt/pull/2586, + https://github.com/fmtlib/fmt/pull/2591, + https://github.com/fmtlib/fmt/pull/2594, + https://github.com/fmtlib/fmt/pull/2602, + https://github.com/fmtlib/fmt/pull/2617, + https://github.com/fmtlib/fmt/issues/2628, + https://github.com/fmtlib/fmt/pull/2633, + https://github.com/fmtlib/fmt/issues/2670, + https://github.com/fmtlib/fmt/pull/2671). - Processing of some specifiers such as `%z` and `%Y` is now up to - 10-20 times faster, for example on GCC 11 with libstdc++: + Processing of some specifiers such as `%z` and `%Y` is now up to + 10-20 times faster, for example on GCC 11 with libstdc++: - ---------------------------------------------------------------------------- - Benchmark Before After - ---------------------------------------------------------------------------- - FMTFormatter_z 261 ns 26.3 ns - FMTFormatterCompile_z 246 ns 11.6 ns - FMTFormatter_Y 263 ns 26.1 ns - FMTFormatterCompile_Y 244 ns 10.5 ns - ---------------------------------------------------------------------------- + ---------------------------------------------------------------------------- + Benchmark Before After + ---------------------------------------------------------------------------- + FMTFormatter_z 261 ns 26.3 ns + FMTFormatterCompile_z 246 ns 11.6 ns + FMTFormatter_Y 263 ns 26.1 ns + FMTFormatterCompile_Y 244 ns 10.5 ns + ---------------------------------------------------------------------------- - Thanks @phprus and @toughengineer. + Thanks @phprus and @toughengineer. -- Implemented subsecond formatting for chrono durations - (https://github.com/fmtlib/fmt/pull/2623). For example - ([godbolt](https://godbolt.org/z/es7vWTETe)): +- Implemented subsecond formatting for chrono durations + (https://github.com/fmtlib/fmt/pull/2623). For example + ([godbolt](https://godbolt.org/z/es7vWTETe)): - ```c++ - #include + ```c++ + #include - int main() { - fmt::print("{:%S}", std::chrono::milliseconds(1234)); - } - ``` + int main() { + fmt::print("{:%S}", std::chrono::milliseconds(1234)); + } + ``` - prints \"01.234\". + prints \"01.234\". - Thanks @matrackif. + Thanks @matrackif. -- Fixed handling of precision 0 when formatting chrono durations - (https://github.com/fmtlib/fmt/issues/2587, - https://github.com/fmtlib/fmt/pull/2588). Thanks @lukester1975. +- Fixed handling of precision 0 when formatting chrono durations + (https://github.com/fmtlib/fmt/issues/2587, + https://github.com/fmtlib/fmt/pull/2588). Thanks @lukester1975. -- Fixed an overflow on invalid inputs in the `tm` formatter - (https://github.com/fmtlib/fmt/pull/2564). Thanks @phprus. +- Fixed an overflow on invalid inputs in the `tm` formatter + (https://github.com/fmtlib/fmt/pull/2564). Thanks @phprus. -- Added `fmt::group_digits` that formats integers with a non-localized - digit separator (comma) for groups of three digits. For example - ([godbolt](https://godbolt.org/z/TxGxG9Poq)): +- Added `fmt::group_digits` that formats integers with a non-localized + digit separator (comma) for groups of three digits. For example + ([godbolt](https://godbolt.org/z/TxGxG9Poq)): - ```c++ - #include + ```c++ + #include - int main() { - fmt::print("{} dollars", fmt::group_digits(1000000)); - } - ``` + int main() { + fmt::print("{} dollars", fmt::group_digits(1000000)); + } + ``` - prints \"1,000,000 dollars\". + prints \"1,000,000 dollars\". -- Added support for faint, conceal, reverse and blink text styles - (https://github.com/fmtlib/fmt/pull/2394): +- Added support for faint, conceal, reverse and blink text styles + (https://github.com/fmtlib/fmt/pull/2394): - + - Thanks @benit8 and @data-man. + Thanks @benit8 and @data-man. -- Added experimental support for compile-time floating point - formatting (https://github.com/fmtlib/fmt/pull/2426, - https://github.com/fmtlib/fmt/pull/2470). It is currently - limited to the header-only mode. Thanks @alexezeder. +- Added experimental support for compile-time floating point + formatting (https://github.com/fmtlib/fmt/pull/2426, + https://github.com/fmtlib/fmt/pull/2470). It is currently + limited to the header-only mode. Thanks @alexezeder. -- Added UDL-based named argument support to compile-time format string - checks (https://github.com/fmtlib/fmt/issues/2640, - https://github.com/fmtlib/fmt/pull/2649). For example - ([godbolt](https://godbolt.org/z/ohGbbvonv)): +- Added UDL-based named argument support to compile-time format string + checks (https://github.com/fmtlib/fmt/issues/2640, + https://github.com/fmtlib/fmt/pull/2649). For example + ([godbolt](https://godbolt.org/z/ohGbbvonv)): - ```c++ - #include + ```c++ + #include - int main() { - using namespace fmt::literals; - fmt::print("{answer:s}", "answer"_a=42); - } - ``` + int main() { + using namespace fmt::literals; + fmt::print("{answer:s}", "answer"_a=42); + } + ``` - gives a compile-time error on compilers with C++20 `consteval` and - non-type template parameter support (gcc 10+) because `s` is not a - valid format specifier for an integer. + gives a compile-time error on compilers with C++20 `consteval` and + non-type template parameter support (gcc 10+) because `s` is not a + valid format specifier for an integer. - Thanks @alexezeder. + Thanks @alexezeder. -- Implemented escaping of string range elements. For example - ([godbolt](https://godbolt.org/z/rKvM1vKf3)): +- Implemented escaping of string range elements. For example + ([godbolt](https://godbolt.org/z/rKvM1vKf3)): - ```c++ - #include - #include + ```c++ + #include + #include - int main() { - fmt::print("{}", std::vector{"\naan"}); - } - ``` + int main() { + fmt::print("{}", std::vector{"\naan"}); + } + ``` - is now printed as: + is now printed as: - ["\naan"] + ["\naan"] - instead of: + instead of: - [" - aan"] + [" + aan"] -- Added an experimental `?` specifier for escaping strings. - (https://github.com/fmtlib/fmt/pull/2674). Thanks @BRevzin. +- Added an experimental `?` specifier for escaping strings. + (https://github.com/fmtlib/fmt/pull/2674). Thanks @BRevzin. -- Switched to JSON-like representation of maps and sets for - consistency with Python\'s `str.format`. For example - ([godbolt](https://godbolt.org/z/seKjoY9W5)): +- Switched to JSON-like representation of maps and sets for + consistency with Python\'s `str.format`. For example + ([godbolt](https://godbolt.org/z/seKjoY9W5)): - ```c++ - #include - #include + ```c++ + #include + #include - int main() { - fmt::print("{}", std::map{{"answer", 42}}); - } - ``` + int main() { + fmt::print("{}", std::map{{"answer", 42}}); + } + ``` - is now printed as: + is now printed as: - {"answer": 42} + {"answer": 42} -- Extended `fmt::join` to support C++20-only ranges - (https://github.com/fmtlib/fmt/pull/2549). Thanks @BRevzin. +- Extended `fmt::join` to support C++20-only ranges + (https://github.com/fmtlib/fmt/pull/2549). Thanks @BRevzin. -- Optimized handling of non-const-iterable ranges and implemented - initial support for non-const-formattable types. +- Optimized handling of non-const-iterable ranges and implemented + initial support for non-const-formattable types. -- Disabled implicit conversions of scoped enums to integers that was - accidentally introduced in earlier versions - (https://github.com/fmtlib/fmt/pull/1841). +- Disabled implicit conversions of scoped enums to integers that was + accidentally introduced in earlier versions + (https://github.com/fmtlib/fmt/pull/1841). -- Deprecated implicit conversion of `[const] signed char*` and - `[const] unsigned char*` to C strings. +- Deprecated implicit conversion of `[const] signed char*` and + `[const] unsigned char*` to C strings. -- Deprecated `_format`, a legacy UDL-based format API - (https://github.com/fmtlib/fmt/pull/2646). Thanks @alexezeder. +- Deprecated `_format`, a legacy UDL-based format API + (https://github.com/fmtlib/fmt/pull/2646). Thanks @alexezeder. -- Marked `format`, `formatted_size` and `to_string` as `[[nodiscard]]` - (https://github.com/fmtlib/fmt/pull/2612). @0x8000-0000. +- Marked `format`, `formatted_size` and `to_string` as `[[nodiscard]]` + (https://github.com/fmtlib/fmt/pull/2612). @0x8000-0000. -- Added missing diagnostic when trying to format function and member - pointers as well as objects convertible to pointers which is - explicitly disallowed - (https://github.com/fmtlib/fmt/issues/2598, - https://github.com/fmtlib/fmt/pull/2609, - https://github.com/fmtlib/fmt/pull/2610). Thanks @AlexGuteniev. +- Added missing diagnostic when trying to format function and member + pointers as well as objects convertible to pointers which is + explicitly disallowed + (https://github.com/fmtlib/fmt/issues/2598, + https://github.com/fmtlib/fmt/pull/2609, + https://github.com/fmtlib/fmt/pull/2610). Thanks @AlexGuteniev. -- Optimized writing to a contiguous buffer with `format_to_n` - (https://github.com/fmtlib/fmt/pull/2489). Thanks @Roman-Koshelev. +- Optimized writing to a contiguous buffer with `format_to_n` + (https://github.com/fmtlib/fmt/pull/2489). Thanks @Roman-Koshelev. -- Optimized writing to non-`char` buffers - (https://github.com/fmtlib/fmt/pull/2477). Thanks @Roman-Koshelev. +- Optimized writing to non-`char` buffers + (https://github.com/fmtlib/fmt/pull/2477). Thanks @Roman-Koshelev. -- Decimal point is now localized when using the `L` specifier. +- Decimal point is now localized when using the `L` specifier. -- Improved floating point formatter implementation - (https://github.com/fmtlib/fmt/pull/2498, - https://github.com/fmtlib/fmt/pull/2499). Thanks @Roman-Koshelev. +- Improved floating point formatter implementation + (https://github.com/fmtlib/fmt/pull/2498, + https://github.com/fmtlib/fmt/pull/2499). Thanks @Roman-Koshelev. -- Fixed handling of very large precision in fixed format - (https://github.com/fmtlib/fmt/pull/2616). +- Fixed handling of very large precision in fixed format + (https://github.com/fmtlib/fmt/pull/2616). -- Made a table of cached powers used in FP formatting static - (https://github.com/fmtlib/fmt/pull/2509). Thanks @jk-jeon. +- Made a table of cached powers used in FP formatting static + (https://github.com/fmtlib/fmt/pull/2509). Thanks @jk-jeon. -- Resolved a lookup ambiguity with C++20 format-related functions due - to ADL (https://github.com/fmtlib/fmt/issues/2639, - https://github.com/fmtlib/fmt/pull/2641). Thanks @mkurdej. +- Resolved a lookup ambiguity with C++20 format-related functions due + to ADL (https://github.com/fmtlib/fmt/issues/2639, + https://github.com/fmtlib/fmt/pull/2641). Thanks @mkurdej. -- Removed unnecessary inline namespace qualification - (https://github.com/fmtlib/fmt/issues/2642, - https://github.com/fmtlib/fmt/pull/2643). Thanks @mkurdej. +- Removed unnecessary inline namespace qualification + (https://github.com/fmtlib/fmt/issues/2642, + https://github.com/fmtlib/fmt/pull/2643). Thanks @mkurdej. -- Implemented argument forwarding in `format_to_n` - (https://github.com/fmtlib/fmt/issues/2462, - https://github.com/fmtlib/fmt/pull/2463). Thanks @owent. +- Implemented argument forwarding in `format_to_n` + (https://github.com/fmtlib/fmt/issues/2462, + https://github.com/fmtlib/fmt/pull/2463). Thanks @owent. -- Fixed handling of implicit conversions in `fmt::to_string` and - format string compilation - (https://github.com/fmtlib/fmt/issues/2565). +- Fixed handling of implicit conversions in `fmt::to_string` and + format string compilation + (https://github.com/fmtlib/fmt/issues/2565). -- Changed the default access mode of files created by - `fmt::output_file` to `-rw-r--r--` for consistency with `fopen` - (https://github.com/fmtlib/fmt/issues/2530). +- Changed the default access mode of files created by + `fmt::output_file` to `-rw-r--r--` for consistency with `fopen` + (https://github.com/fmtlib/fmt/issues/2530). -- Make `fmt::ostream::flush` public - (https://github.com/fmtlib/fmt/issues/2435). +- Make `fmt::ostream::flush` public + (https://github.com/fmtlib/fmt/issues/2435). -- Improved C++14/17 attribute detection - (https://github.com/fmtlib/fmt/pull/2615). Thanks @AlexGuteniev. +- Improved C++14/17 attribute detection + (https://github.com/fmtlib/fmt/pull/2615). Thanks @AlexGuteniev. -- Improved `consteval` detection for MSVC - (https://github.com/fmtlib/fmt/pull/2559). Thanks @DanielaE. +- Improved `consteval` detection for MSVC + (https://github.com/fmtlib/fmt/pull/2559). Thanks @DanielaE. -- Improved documentation - (https://github.com/fmtlib/fmt/issues/2406, - https://github.com/fmtlib/fmt/pull/2446, - https://github.com/fmtlib/fmt/issues/2493, - https://github.com/fmtlib/fmt/issues/2513, - https://github.com/fmtlib/fmt/pull/2515, - https://github.com/fmtlib/fmt/issues/2522, - https://github.com/fmtlib/fmt/pull/2562, - https://github.com/fmtlib/fmt/pull/2575, - https://github.com/fmtlib/fmt/pull/2606, - https://github.com/fmtlib/fmt/pull/2620, - https://github.com/fmtlib/fmt/issues/2676). - Thanks @sobolevn, @UnePierre, @zhsj, @phprus, @ericcurtin and @Lounarok. +- Improved documentation + (https://github.com/fmtlib/fmt/issues/2406, + https://github.com/fmtlib/fmt/pull/2446, + https://github.com/fmtlib/fmt/issues/2493, + https://github.com/fmtlib/fmt/issues/2513, + https://github.com/fmtlib/fmt/pull/2515, + https://github.com/fmtlib/fmt/issues/2522, + https://github.com/fmtlib/fmt/pull/2562, + https://github.com/fmtlib/fmt/pull/2575, + https://github.com/fmtlib/fmt/pull/2606, + https://github.com/fmtlib/fmt/pull/2620, + https://github.com/fmtlib/fmt/issues/2676). + Thanks @sobolevn, @UnePierre, @zhsj, @phprus, @ericcurtin and @Lounarok. -- Improved fuzzers and added a fuzzer for chrono timepoint formatting - (https://github.com/fmtlib/fmt/pull/2461, - https://github.com/fmtlib/fmt/pull/2469). @pauldreik, +- Improved fuzzers and added a fuzzer for chrono timepoint formatting + (https://github.com/fmtlib/fmt/pull/2461, + https://github.com/fmtlib/fmt/pull/2469). @pauldreik, -- Added the `FMT_SYSTEM_HEADERS` CMake option setting which marks - {fmt}\'s headers as system. It can be used to suppress warnings - (https://github.com/fmtlib/fmt/issues/2644, - https://github.com/fmtlib/fmt/pull/2651). Thanks @alexezeder. +- Added the `FMT_SYSTEM_HEADERS` CMake option setting which marks + {fmt}\'s headers as system. It can be used to suppress warnings + (https://github.com/fmtlib/fmt/issues/2644, + https://github.com/fmtlib/fmt/pull/2651). Thanks @alexezeder. -- Added the Bazel build system support - (https://github.com/fmtlib/fmt/pull/2505, - https://github.com/fmtlib/fmt/pull/2516). Thanks @Vertexwahn. +- Added the Bazel build system support + (https://github.com/fmtlib/fmt/pull/2505, + https://github.com/fmtlib/fmt/pull/2516). Thanks @Vertexwahn. -- Improved build configuration and tests - (https://github.com/fmtlib/fmt/issues/2437, - https://github.com/fmtlib/fmt/pull/2558, - https://github.com/fmtlib/fmt/pull/2648, - https://github.com/fmtlib/fmt/pull/2650, - https://github.com/fmtlib/fmt/pull/2663, - https://github.com/fmtlib/fmt/pull/2677). - Thanks @DanielaE, @alexezeder and @phprus. +- Improved build configuration and tests + (https://github.com/fmtlib/fmt/issues/2437, + https://github.com/fmtlib/fmt/pull/2558, + https://github.com/fmtlib/fmt/pull/2648, + https://github.com/fmtlib/fmt/pull/2650, + https://github.com/fmtlib/fmt/pull/2663, + https://github.com/fmtlib/fmt/pull/2677). + Thanks @DanielaE, @alexezeder and @phprus. -- Fixed various warnings and compilation issues - (https://github.com/fmtlib/fmt/pull/2353, - https://github.com/fmtlib/fmt/pull/2356, - https://github.com/fmtlib/fmt/pull/2399, - https://github.com/fmtlib/fmt/issues/2408, - https://github.com/fmtlib/fmt/pull/2414, - https://github.com/fmtlib/fmt/pull/2427, - https://github.com/fmtlib/fmt/pull/2432, - https://github.com/fmtlib/fmt/pull/2442, - https://github.com/fmtlib/fmt/pull/2434, - https://github.com/fmtlib/fmt/issues/2439, - https://github.com/fmtlib/fmt/pull/2447, - https://github.com/fmtlib/fmt/pull/2450, - https://github.com/fmtlib/fmt/issues/2455, - https://github.com/fmtlib/fmt/issues/2465, - https://github.com/fmtlib/fmt/issues/2472, - https://github.com/fmtlib/fmt/issues/2474, - https://github.com/fmtlib/fmt/pull/2476, - https://github.com/fmtlib/fmt/issues/2478, - https://github.com/fmtlib/fmt/issues/2479, - https://github.com/fmtlib/fmt/issues/2481, - https://github.com/fmtlib/fmt/pull/2482, - https://github.com/fmtlib/fmt/pull/2483, - https://github.com/fmtlib/fmt/issues/2490, - https://github.com/fmtlib/fmt/pull/2491, - https://github.com/fmtlib/fmt/pull/2510, - https://github.com/fmtlib/fmt/pull/2518, - https://github.com/fmtlib/fmt/issues/2528, - https://github.com/fmtlib/fmt/pull/2529, - https://github.com/fmtlib/fmt/pull/2539, - https://github.com/fmtlib/fmt/issues/2540, - https://github.com/fmtlib/fmt/pull/2545, - https://github.com/fmtlib/fmt/pull/2555, - https://github.com/fmtlib/fmt/issues/2557, - https://github.com/fmtlib/fmt/issues/2570, - https://github.com/fmtlib/fmt/pull/2573, - https://github.com/fmtlib/fmt/pull/2582, - https://github.com/fmtlib/fmt/issues/2605, - https://github.com/fmtlib/fmt/pull/2611, - https://github.com/fmtlib/fmt/pull/2647, - https://github.com/fmtlib/fmt/issues/2627, - https://github.com/fmtlib/fmt/pull/2630, - https://github.com/fmtlib/fmt/issues/2635, - https://github.com/fmtlib/fmt/issues/2638, - https://github.com/fmtlib/fmt/issues/2653, - https://github.com/fmtlib/fmt/issues/2654, - https://github.com/fmtlib/fmt/issues/2661, - https://github.com/fmtlib/fmt/pull/2664, - https://github.com/fmtlib/fmt/pull/2684). - Thanks @DanielaE, @mwinterb, @cdacamar, @TrebledJ, @bodomartin, @cquammen, - @white238, @mmarkeloff, @palacaze, @jcelerier, @mborn-adi, @BrukerJWD, - @spyridon97, @phprus, @oliverlee, @joshessman-llnl, @akohlmey, @timkalu, - @olupton, @Acretock, @alexezeder, @andrewcorrigan, @lucpelletier and - @HazardyKnusperkeks. +- Fixed various warnings and compilation issues + (https://github.com/fmtlib/fmt/pull/2353, + https://github.com/fmtlib/fmt/pull/2356, + https://github.com/fmtlib/fmt/pull/2399, + https://github.com/fmtlib/fmt/issues/2408, + https://github.com/fmtlib/fmt/pull/2414, + https://github.com/fmtlib/fmt/pull/2427, + https://github.com/fmtlib/fmt/pull/2432, + https://github.com/fmtlib/fmt/pull/2442, + https://github.com/fmtlib/fmt/pull/2434, + https://github.com/fmtlib/fmt/issues/2439, + https://github.com/fmtlib/fmt/pull/2447, + https://github.com/fmtlib/fmt/pull/2450, + https://github.com/fmtlib/fmt/issues/2455, + https://github.com/fmtlib/fmt/issues/2465, + https://github.com/fmtlib/fmt/issues/2472, + https://github.com/fmtlib/fmt/issues/2474, + https://github.com/fmtlib/fmt/pull/2476, + https://github.com/fmtlib/fmt/issues/2478, + https://github.com/fmtlib/fmt/issues/2479, + https://github.com/fmtlib/fmt/issues/2481, + https://github.com/fmtlib/fmt/pull/2482, + https://github.com/fmtlib/fmt/pull/2483, + https://github.com/fmtlib/fmt/issues/2490, + https://github.com/fmtlib/fmt/pull/2491, + https://github.com/fmtlib/fmt/pull/2510, + https://github.com/fmtlib/fmt/pull/2518, + https://github.com/fmtlib/fmt/issues/2528, + https://github.com/fmtlib/fmt/pull/2529, + https://github.com/fmtlib/fmt/pull/2539, + https://github.com/fmtlib/fmt/issues/2540, + https://github.com/fmtlib/fmt/pull/2545, + https://github.com/fmtlib/fmt/pull/2555, + https://github.com/fmtlib/fmt/issues/2557, + https://github.com/fmtlib/fmt/issues/2570, + https://github.com/fmtlib/fmt/pull/2573, + https://github.com/fmtlib/fmt/pull/2582, + https://github.com/fmtlib/fmt/issues/2605, + https://github.com/fmtlib/fmt/pull/2611, + https://github.com/fmtlib/fmt/pull/2647, + https://github.com/fmtlib/fmt/issues/2627, + https://github.com/fmtlib/fmt/pull/2630, + https://github.com/fmtlib/fmt/issues/2635, + https://github.com/fmtlib/fmt/issues/2638, + https://github.com/fmtlib/fmt/issues/2653, + https://github.com/fmtlib/fmt/issues/2654, + https://github.com/fmtlib/fmt/issues/2661, + https://github.com/fmtlib/fmt/pull/2664, + https://github.com/fmtlib/fmt/pull/2684). + Thanks @DanielaE, @mwinterb, @cdacamar, @TrebledJ, @bodomartin, @cquammen, + @white238, @mmarkeloff, @palacaze, @jcelerier, @mborn-adi, @BrukerJWD, + @spyridon97, @phprus, @oliverlee, @joshessman-llnl, @akohlmey, @timkalu, + @olupton, @Acretock, @alexezeder, @andrewcorrigan, @lucpelletier and + @HazardyKnusperkeks. # 8.0.1 - 2021-07-02 -- Fixed the version number in the inline namespace - (https://github.com/fmtlib/fmt/issues/2374). -- Added a missing presentation type check for `std::string` - (https://github.com/fmtlib/fmt/issues/2402). -- Fixed a linkage error when mixing code built with clang and gcc - (https://github.com/fmtlib/fmt/issues/2377). -- Fixed documentation issues - (https://github.com/fmtlib/fmt/pull/2396, - https://github.com/fmtlib/fmt/issues/2403, - https://github.com/fmtlib/fmt/issues/2406). Thanks @mkurdej. -- Removed dead code in FP formatter ( - https://github.com/fmtlib/fmt/pull/2398). Thanks @javierhonduco. -- Fixed various warnings and compilation issues - (https://github.com/fmtlib/fmt/issues/2351, - https://github.com/fmtlib/fmt/issues/2359, - https://github.com/fmtlib/fmt/pull/2365, - https://github.com/fmtlib/fmt/issues/2368, - https://github.com/fmtlib/fmt/pull/2370, - https://github.com/fmtlib/fmt/pull/2376, - https://github.com/fmtlib/fmt/pull/2381, - https://github.com/fmtlib/fmt/pull/2382, - https://github.com/fmtlib/fmt/issues/2386, - https://github.com/fmtlib/fmt/pull/2389, - https://github.com/fmtlib/fmt/pull/2395, - https://github.com/fmtlib/fmt/pull/2397, - https://github.com/fmtlib/fmt/issues/2400, - https://github.com/fmtlib/fmt/issues/2401, - https://github.com/fmtlib/fmt/pull/2407). - Thanks @zx2c4, @AidanSun05, @mattiasljungstrom, @joemmett, @erengy, - @patlkli, @gsjaardema and @phprus. +- Fixed the version number in the inline namespace + (https://github.com/fmtlib/fmt/issues/2374). +- Added a missing presentation type check for `std::string` + (https://github.com/fmtlib/fmt/issues/2402). +- Fixed a linkage error when mixing code built with clang and gcc + (https://github.com/fmtlib/fmt/issues/2377). +- Fixed documentation issues + (https://github.com/fmtlib/fmt/pull/2396, + https://github.com/fmtlib/fmt/issues/2403, + https://github.com/fmtlib/fmt/issues/2406). Thanks @mkurdej. +- Removed dead code in FP formatter ( + https://github.com/fmtlib/fmt/pull/2398). Thanks @javierhonduco. +- Fixed various warnings and compilation issues + (https://github.com/fmtlib/fmt/issues/2351, + https://github.com/fmtlib/fmt/issues/2359, + https://github.com/fmtlib/fmt/pull/2365, + https://github.com/fmtlib/fmt/issues/2368, + https://github.com/fmtlib/fmt/pull/2370, + https://github.com/fmtlib/fmt/pull/2376, + https://github.com/fmtlib/fmt/pull/2381, + https://github.com/fmtlib/fmt/pull/2382, + https://github.com/fmtlib/fmt/issues/2386, + https://github.com/fmtlib/fmt/pull/2389, + https://github.com/fmtlib/fmt/pull/2395, + https://github.com/fmtlib/fmt/pull/2397, + https://github.com/fmtlib/fmt/issues/2400, + https://github.com/fmtlib/fmt/issues/2401, + https://github.com/fmtlib/fmt/pull/2407). + Thanks @zx2c4, @AidanSun05, @mattiasljungstrom, @joemmett, @erengy, + @patlkli, @gsjaardema and @phprus. # 8.0.0 - 2021-06-21 -- Enabled compile-time format string checks by default. For example - ([godbolt](https://godbolt.org/z/sMxcohGjz)): +- Enabled compile-time format string checks by default. For example + ([godbolt](https://godbolt.org/z/sMxcohGjz)): - ```c++ - #include + ```c++ + #include - int main() { - fmt::print("{:d}", "I am not a number"); + int main() { + fmt::print("{:d}", "I am not a number"); + } + ``` + + gives a compile-time error on compilers with C++20 `consteval` + support (gcc 10+, clang 11+) because `d` is not a valid format + specifier for a string. + + To pass a runtime string wrap it in `fmt::runtime`: + + ```c++ + fmt::print(fmt::runtime("{:d}"), "I am not a number"); + ``` + +- Added compile-time formatting + (https://github.com/fmtlib/fmt/pull/2019, + https://github.com/fmtlib/fmt/pull/2044, + https://github.com/fmtlib/fmt/pull/2056, + https://github.com/fmtlib/fmt/pull/2072, + https://github.com/fmtlib/fmt/pull/2075, + https://github.com/fmtlib/fmt/issues/2078, + https://github.com/fmtlib/fmt/pull/2129, + https://github.com/fmtlib/fmt/pull/2326). For example + ([godbolt](https://godbolt.org/z/Mxx9d89jM)): + + ```c++ + #include + + consteval auto compile_time_itoa(int value) -> std::array { + auto result = std::array(); + fmt::format_to(result.data(), FMT_COMPILE("{}"), value); + return result; + } + + constexpr auto answer = compile_time_itoa(42); + ``` + + Most of the formatting functionality is available at compile time + with a notable exception of floating-point numbers and pointers. + Thanks @alexezeder. + +- Optimized handling of format specifiers during format string + compilation. For example, hexadecimal formatting (`"{:x}"`) is now + 3-7x faster than before when using `format_to` with format string + compilation and a stack-allocated buffer + (https://github.com/fmtlib/fmt/issues/1944). + + Before (7.1.3): + + ---------------------------------------------------------------------------- + Benchmark Time CPU Iterations + ---------------------------------------------------------------------------- + FMTCompileOld/0 15.5 ns 15.5 ns 43302898 + FMTCompileOld/42 16.6 ns 16.6 ns 43278267 + FMTCompileOld/273123 18.7 ns 18.6 ns 37035861 + FMTCompileOld/9223372036854775807 19.4 ns 19.4 ns 35243000 + ---------------------------------------------------------------------------- + + After (8.x): + + ---------------------------------------------------------------------------- + Benchmark Time CPU Iterations + ---------------------------------------------------------------------------- + FMTCompileNew/0 1.99 ns 1.99 ns 360523686 + FMTCompileNew/42 2.33 ns 2.33 ns 279865664 + FMTCompileNew/273123 3.72 ns 3.71 ns 190230315 + FMTCompileNew/9223372036854775807 5.28 ns 5.26 ns 130711631 + ---------------------------------------------------------------------------- + + It is even faster than `std::to_chars` from libc++ compiled with + clang on macOS: + + ---------------------------------------------------------------------------- + Benchmark Time CPU Iterations + ---------------------------------------------------------------------------- + ToChars/0 4.42 ns 4.41 ns 160196630 + ToChars/42 5.00 ns 4.98 ns 140735201 + ToChars/273123 7.26 ns 7.24 ns 95784130 + ToChars/9223372036854775807 8.77 ns 8.75 ns 75872534 + ---------------------------------------------------------------------------- + + In other cases, especially involving `std::string` construction, the + speed up is usually lower because handling format specifiers takes a + smaller fraction of the total time. + +- Added the `_cf` user-defined literal to represent a compiled format + string. It can be used instead of the `FMT_COMPILE` macro + (https://github.com/fmtlib/fmt/pull/2043, + https://github.com/fmtlib/fmt/pull/2242): + + ```c++ + #include + + using namespace fmt::literals; + auto s = fmt::format(FMT_COMPILE("{}"), 42); // 🙁 not modern + auto s = fmt::format("{}"_cf, 42); // 🙂 modern as hell + ``` + + It requires compiler support for class types in non-type template + parameters (a C++20 feature) which is available in GCC 9.3+. + Thanks @alexezeder. + +- Format string compilation now requires `format` functions of + `formatter` specializations for user-defined types to be `const`: + + ```c++ + template <> struct fmt::formatter: formatter { + template + auto format(my_type obj, FormatContext& ctx) const { // Note const here. + // ... } - ``` - - gives a compile-time error on compilers with C++20 `consteval` - support (gcc 10+, clang 11+) because `d` is not a valid format - specifier for a string. - - To pass a runtime string wrap it in `fmt::runtime`: - - ```c++ - fmt::print(fmt::runtime("{:d}"), "I am not a number"); - ``` - -- Added compile-time formatting - (https://github.com/fmtlib/fmt/pull/2019, - https://github.com/fmtlib/fmt/pull/2044, - https://github.com/fmtlib/fmt/pull/2056, - https://github.com/fmtlib/fmt/pull/2072, - https://github.com/fmtlib/fmt/pull/2075, - https://github.com/fmtlib/fmt/issues/2078, - https://github.com/fmtlib/fmt/pull/2129, - https://github.com/fmtlib/fmt/pull/2326). For example - ([godbolt](https://godbolt.org/z/Mxx9d89jM)): - - ```c++ - #include - - consteval auto compile_time_itoa(int value) -> std::array { - auto result = std::array(); - fmt::format_to(result.data(), FMT_COMPILE("{}"), value); - return result; - } - - constexpr auto answer = compile_time_itoa(42); - ``` - - Most of the formatting functionality is available at compile time - with a notable exception of floating-point numbers and pointers. - Thanks @alexezeder. - -- Optimized handling of format specifiers during format string - compilation. For example, hexadecimal formatting (`"{:x}"`) is now - 3-7x faster than before when using `format_to` with format string - compilation and a stack-allocated buffer - (https://github.com/fmtlib/fmt/issues/1944). - - Before (7.1.3): - - ---------------------------------------------------------------------------- - Benchmark Time CPU Iterations - ---------------------------------------------------------------------------- - FMTCompileOld/0 15.5 ns 15.5 ns 43302898 - FMTCompileOld/42 16.6 ns 16.6 ns 43278267 - FMTCompileOld/273123 18.7 ns 18.6 ns 37035861 - FMTCompileOld/9223372036854775807 19.4 ns 19.4 ns 35243000 - ---------------------------------------------------------------------------- - - After (8.x): - - ---------------------------------------------------------------------------- - Benchmark Time CPU Iterations - ---------------------------------------------------------------------------- - FMTCompileNew/0 1.99 ns 1.99 ns 360523686 - FMTCompileNew/42 2.33 ns 2.33 ns 279865664 - FMTCompileNew/273123 3.72 ns 3.71 ns 190230315 - FMTCompileNew/9223372036854775807 5.28 ns 5.26 ns 130711631 - ---------------------------------------------------------------------------- - - It is even faster than `std::to_chars` from libc++ compiled with - clang on macOS: - - ---------------------------------------------------------------------------- - Benchmark Time CPU Iterations - ---------------------------------------------------------------------------- - ToChars/0 4.42 ns 4.41 ns 160196630 - ToChars/42 5.00 ns 4.98 ns 140735201 - ToChars/273123 7.26 ns 7.24 ns 95784130 - ToChars/9223372036854775807 8.77 ns 8.75 ns 75872534 - ---------------------------------------------------------------------------- - - In other cases, especially involving `std::string` construction, the - speed up is usually lower because handling format specifiers takes a - smaller fraction of the total time. - -- Added the `_cf` user-defined literal to represent a compiled format - string. It can be used instead of the `FMT_COMPILE` macro - (https://github.com/fmtlib/fmt/pull/2043, - https://github.com/fmtlib/fmt/pull/2242): - - ```c++ - #include - - using namespace fmt::literals; - auto s = fmt::format(FMT_COMPILE("{}"), 42); // 🙁 not modern - auto s = fmt::format("{}"_cf, 42); // 🙂 modern as hell - ``` - - It requires compiler support for class types in non-type template - parameters (a C++20 feature) which is available in GCC 9.3+. - Thanks @alexezeder. - -- Format string compilation now requires `format` functions of - `formatter` specializations for user-defined types to be `const`: - - ```c++ - template <> struct fmt::formatter: formatter { - template - auto format(my_type obj, FormatContext& ctx) const { // Note const here. - // ... - } - }; - ``` - -- Added UDL-based named argument support to format string compilation - (https://github.com/fmtlib/fmt/pull/2243, - https://github.com/fmtlib/fmt/pull/2281). For example: - - ```c++ - #include - - using namespace fmt::literals; - auto s = fmt::format(FMT_COMPILE("{answer}"), "answer"_a = 42); - ``` - - Here the argument named \"answer\" is resolved at compile time with - no runtime overhead. Thanks @alexezeder. - -- Added format string compilation support to `fmt::print` - (https://github.com/fmtlib/fmt/issues/2280, - https://github.com/fmtlib/fmt/pull/2304). Thanks @alexezeder. - -- Added initial support for compiling {fmt} as a C++20 module - (https://github.com/fmtlib/fmt/pull/2235, - https://github.com/fmtlib/fmt/pull/2240, - https://github.com/fmtlib/fmt/pull/2260, - https://github.com/fmtlib/fmt/pull/2282, - https://github.com/fmtlib/fmt/pull/2283, - https://github.com/fmtlib/fmt/pull/2288, - https://github.com/fmtlib/fmt/pull/2298, - https://github.com/fmtlib/fmt/pull/2306, - https://github.com/fmtlib/fmt/pull/2307, - https://github.com/fmtlib/fmt/pull/2309, - https://github.com/fmtlib/fmt/pull/2318, - https://github.com/fmtlib/fmt/pull/2324, - https://github.com/fmtlib/fmt/pull/2332, - https://github.com/fmtlib/fmt/pull/2340). Thanks @DanielaE. - -- Made symbols private by default reducing shared library size - (https://github.com/fmtlib/fmt/pull/2301). For example - there was a \~15% reported reduction on one platform. Thanks @sergiud. - -- Optimized includes making the result of preprocessing `fmt/format.h` - \~20% smaller with libstdc++/C++20 and slightly improving build - times (https://github.com/fmtlib/fmt/issues/1998). - -- Added support of ranges with non-const `begin` / `end` - (https://github.com/fmtlib/fmt/pull/1953). Thanks @kitegi. - -- Added support of `std::byte` and other formattable types to - `fmt::join` (https://github.com/fmtlib/fmt/issues/1981, - https://github.com/fmtlib/fmt/issues/2040, - https://github.com/fmtlib/fmt/pull/2050, - https://github.com/fmtlib/fmt/issues/2262). For example: - - ```c++ - #include - #include - #include - - int main() { - auto bytes = std::vector{std::byte(4), std::byte(2)}; - fmt::print("{}", fmt::join(bytes, "")); - } - ``` - - prints \"42\". - - Thanks @kamibo. - -- Implemented the default format for `std::chrono::system_clock` - (https://github.com/fmtlib/fmt/issues/2319, - https://github.com/fmtlib/fmt/pull/2345). For example: - - ```c++ - #include - - int main() { - fmt::print("{}", std::chrono::system_clock::now()); - } - ``` - - prints \"2021-06-18 15:22:00\" (the output depends on the current - date and time). Thanks @sunmy2019. - -- Made more chrono specifiers locale independent by default. Use the - `'L'` specifier to get localized formatting. For example: - - ```c++ - #include - - int main() { - std::locale::global(std::locale("ru_RU.UTF-8")); - auto monday = std::chrono::weekday(1); - fmt::print("{}\n", monday); // prints "Mon" - fmt::print("{:L}\n", monday); // prints "пн" - } - ``` - -- Improved locale handling in chrono formatting - (https://github.com/fmtlib/fmt/issues/2337, - https://github.com/fmtlib/fmt/pull/2349, - https://github.com/fmtlib/fmt/pull/2350). Thanks @phprus. - -- Deprecated `fmt/locale.h` moving the formatting functions that take - a locale to `fmt/format.h` (`char`) and `fmt/xchar` (other - overloads). This doesn\'t introduce a dependency on `` so - there is virtually no compile time effect. - -- Deprecated an undocumented `format_to` overload that takes - `basic_memory_buffer`. - -- Made parameter order in `vformat_to` consistent with `format_to` - (https://github.com/fmtlib/fmt/issues/2327). - -- Added support for time points with arbitrary durations - (https://github.com/fmtlib/fmt/issues/2208). For example: + }; + ``` + +- Added UDL-based named argument support to format string compilation + (https://github.com/fmtlib/fmt/pull/2243, + https://github.com/fmtlib/fmt/pull/2281). For example: + + ```c++ + #include + + using namespace fmt::literals; + auto s = fmt::format(FMT_COMPILE("{answer}"), "answer"_a = 42); + ``` + + Here the argument named \"answer\" is resolved at compile time with + no runtime overhead. Thanks @alexezeder. + +- Added format string compilation support to `fmt::print` + (https://github.com/fmtlib/fmt/issues/2280, + https://github.com/fmtlib/fmt/pull/2304). Thanks @alexezeder. + +- Added initial support for compiling {fmt} as a C++20 module + (https://github.com/fmtlib/fmt/pull/2235, + https://github.com/fmtlib/fmt/pull/2240, + https://github.com/fmtlib/fmt/pull/2260, + https://github.com/fmtlib/fmt/pull/2282, + https://github.com/fmtlib/fmt/pull/2283, + https://github.com/fmtlib/fmt/pull/2288, + https://github.com/fmtlib/fmt/pull/2298, + https://github.com/fmtlib/fmt/pull/2306, + https://github.com/fmtlib/fmt/pull/2307, + https://github.com/fmtlib/fmt/pull/2309, + https://github.com/fmtlib/fmt/pull/2318, + https://github.com/fmtlib/fmt/pull/2324, + https://github.com/fmtlib/fmt/pull/2332, + https://github.com/fmtlib/fmt/pull/2340). Thanks @DanielaE. + +- Made symbols private by default reducing shared library size + (https://github.com/fmtlib/fmt/pull/2301). For example + there was a \~15% reported reduction on one platform. Thanks @sergiud. + +- Optimized includes making the result of preprocessing `fmt/format.h` + \~20% smaller with libstdc++/C++20 and slightly improving build + times (https://github.com/fmtlib/fmt/issues/1998). + +- Added support of ranges with non-const `begin` / `end` + (https://github.com/fmtlib/fmt/pull/1953). Thanks @kitegi. + +- Added support of `std::byte` and other formattable types to + `fmt::join` (https://github.com/fmtlib/fmt/issues/1981, + https://github.com/fmtlib/fmt/issues/2040, + https://github.com/fmtlib/fmt/pull/2050, + https://github.com/fmtlib/fmt/issues/2262). For example: + + ```c++ + #include + #include + #include + + int main() { + auto bytes = std::vector{std::byte(4), std::byte(2)}; + fmt::print("{}", fmt::join(bytes, "")); + } + ``` + + prints \"42\". + + Thanks @kamibo. + +- Implemented the default format for `std::chrono::system_clock` + (https://github.com/fmtlib/fmt/issues/2319, + https://github.com/fmtlib/fmt/pull/2345). For example: + + ```c++ + #include + + int main() { + fmt::print("{}", std::chrono::system_clock::now()); + } + ``` + + prints \"2021-06-18 15:22:00\" (the output depends on the current + date and time). Thanks @sunmy2019. + +- Made more chrono specifiers locale independent by default. Use the + `'L'` specifier to get localized formatting. For example: + + ```c++ + #include + + int main() { + std::locale::global(std::locale("ru_RU.UTF-8")); + auto monday = std::chrono::weekday(1); + fmt::print("{}\n", monday); // prints "Mon" + fmt::print("{:L}\n", monday); // prints "пн" + } + ``` + +- Improved locale handling in chrono formatting + (https://github.com/fmtlib/fmt/issues/2337, + https://github.com/fmtlib/fmt/pull/2349, + https://github.com/fmtlib/fmt/pull/2350). Thanks @phprus. + +- Deprecated `fmt/locale.h` moving the formatting functions that take + a locale to `fmt/format.h` (`char`) and `fmt/xchar` (other + overloads). This doesn\'t introduce a dependency on `` so + there is virtually no compile time effect. + +- Deprecated an undocumented `format_to` overload that takes + `basic_memory_buffer`. + +- Made parameter order in `vformat_to` consistent with `format_to` + (https://github.com/fmtlib/fmt/issues/2327). + +- Added support for time points with arbitrary durations + (https://github.com/fmtlib/fmt/issues/2208). For example: - ```c++ - #include + ```c++ + #include - int main() { - using tp = std::chrono::time_point< - std::chrono::system_clock, std::chrono::seconds>; - fmt::print("{:%S}", tp(std::chrono::seconds(42))); - } - ``` + int main() { + using tp = std::chrono::time_point< + std::chrono::system_clock, std::chrono::seconds>; + fmt::print("{:%S}", tp(std::chrono::seconds(42))); + } + ``` - prints \"42\". + prints \"42\". -- Formatting floating-point numbers no longer produces trailing zeros - by default for consistency with `std::format`. For example: +- Formatting floating-point numbers no longer produces trailing zeros + by default for consistency with `std::format`. For example: - ```c++ - #include + ```c++ + #include - int main() { - fmt::print("{0:.3}", 1.1); - } - ``` + int main() { + fmt::print("{0:.3}", 1.1); + } + ``` - prints \"1.1\". Use the `'#'` specifier to keep trailing zeros. + prints \"1.1\". Use the `'#'` specifier to keep trailing zeros. -- Dropped a limit on the number of elements in a range and replaced - `{}` with `[]` as range delimiters for consistency with Python\'s - `str.format`. +- Dropped a limit on the number of elements in a range and replaced + `{}` with `[]` as range delimiters for consistency with Python\'s + `str.format`. -- The `'L'` specifier for locale-specific numeric formatting can now - be combined with presentation specifiers as in `std::format`. For - example: +- The `'L'` specifier for locale-specific numeric formatting can now + be combined with presentation specifiers as in `std::format`. For + example: - ```c++ - #include - #include + ```c++ + #include + #include - int main() { - std::locale::global(std::locale("fr_FR.UTF-8")); - fmt::print("{0:.2Lf}", 0.42); - } - ``` + int main() { + std::locale::global(std::locale("fr_FR.UTF-8")); + fmt::print("{0:.2Lf}", 0.42); + } + ``` - prints \"0,42\". The deprecated `'n'` specifier has been removed. + prints \"0,42\". The deprecated `'n'` specifier has been removed. -- Made the `0` specifier ignored for infinity and NaN - (https://github.com/fmtlib/fmt/issues/2305, - https://github.com/fmtlib/fmt/pull/2310). Thanks @Liedtke. +- Made the `0` specifier ignored for infinity and NaN + (https://github.com/fmtlib/fmt/issues/2305, + https://github.com/fmtlib/fmt/pull/2310). Thanks @Liedtke. -- Made the hexfloat formatting use the right alignment by default - (https://github.com/fmtlib/fmt/issues/2308, - https://github.com/fmtlib/fmt/pull/2317). Thanks @Liedtke. +- Made the hexfloat formatting use the right alignment by default + (https://github.com/fmtlib/fmt/issues/2308, + https://github.com/fmtlib/fmt/pull/2317). Thanks @Liedtke. -- Removed the deprecated numeric alignment (`'='`). Use the `'0'` - specifier instead. +- Removed the deprecated numeric alignment (`'='`). Use the `'0'` + specifier instead. -- Removed the deprecated `fmt/posix.h` header that has been replaced - with `fmt/os.h`. +- Removed the deprecated `fmt/posix.h` header that has been replaced + with `fmt/os.h`. -- Removed the deprecated `format_to_n_context`, `format_to_n_args` and - `make_format_to_n_args`. They have been replaced with - `format_context`, `` format_args` and ``make_format_args\`\` - respectively. +- Removed the deprecated `format_to_n_context`, `format_to_n_args` and + `make_format_to_n_args`. They have been replaced with + `format_context`, `` format_args` and ``make_format_args\`\` + respectively. -- Moved `wchar_t`-specific functions and types to `fmt/xchar.h`. You - can define `FMT_DEPRECATED_INCLUDE_XCHAR` to automatically include - `fmt/xchar.h` from `fmt/format.h` but this will be disabled in the - next major release. +- Moved `wchar_t`-specific functions and types to `fmt/xchar.h`. You + can define `FMT_DEPRECATED_INCLUDE_XCHAR` to automatically include + `fmt/xchar.h` from `fmt/format.h` but this will be disabled in the + next major release. -- Fixed handling of the `'+'` specifier in localized formatting - (https://github.com/fmtlib/fmt/issues/2133). +- Fixed handling of the `'+'` specifier in localized formatting + (https://github.com/fmtlib/fmt/issues/2133). -- Added support for the `'s'` format specifier that gives textual - representation of `bool` - (https://github.com/fmtlib/fmt/issues/2094, - https://github.com/fmtlib/fmt/pull/2109). For example: +- Added support for the `'s'` format specifier that gives textual + representation of `bool` + (https://github.com/fmtlib/fmt/issues/2094, + https://github.com/fmtlib/fmt/pull/2109). For example: - ```c++ - #include + ```c++ + #include - int main() { - fmt::print("{:s}", true); - } - ``` + int main() { + fmt::print("{:s}", true); + } + ``` - prints \"true\". Thanks @powercoderlol. + prints \"true\". Thanks @powercoderlol. -- Made `fmt::ptr` work with function pointers - (https://github.com/fmtlib/fmt/pull/2131). For example: +- Made `fmt::ptr` work with function pointers + (https://github.com/fmtlib/fmt/pull/2131). For example: - ```c++ - #include + ```c++ + #include - int main() { - fmt::print("My main: {}\n", fmt::ptr(main)); - } - ``` + int main() { + fmt::print("My main: {}\n", fmt::ptr(main)); + } + ``` - Thanks @mikecrowe. + Thanks @mikecrowe. -- The undocumented support for specializing `formatter` for pointer - types has been removed. +- The undocumented support for specializing `formatter` for pointer + types has been removed. -- Fixed `fmt::formatted_size` with format string compilation - (https://github.com/fmtlib/fmt/pull/2141, - https://github.com/fmtlib/fmt/pull/2161). Thanks @alexezeder. +- Fixed `fmt::formatted_size` with format string compilation + (https://github.com/fmtlib/fmt/pull/2141, + https://github.com/fmtlib/fmt/pull/2161). Thanks @alexezeder. -- Fixed handling of empty format strings during format string - compilation (https://github.com/fmtlib/fmt/issues/2042): +- Fixed handling of empty format strings during format string + compilation (https://github.com/fmtlib/fmt/issues/2042): - ```c++ - auto s = fmt::format(FMT_COMPILE("")); - ``` + ```c++ + auto s = fmt::format(FMT_COMPILE("")); + ``` - Thanks @alexezeder. + Thanks @alexezeder. -- Fixed handling of enums in `fmt::to_string` - (https://github.com/fmtlib/fmt/issues/2036). +- Fixed handling of enums in `fmt::to_string` + (https://github.com/fmtlib/fmt/issues/2036). -- Improved width computation - (https://github.com/fmtlib/fmt/issues/2033, - https://github.com/fmtlib/fmt/issues/2091). For example: +- Improved width computation + (https://github.com/fmtlib/fmt/issues/2033, + https://github.com/fmtlib/fmt/issues/2091). For example: - ```c++ - #include + ```c++ + #include - int main() { - fmt::print("{:-<10}{}\n", "你好", "世界"); - fmt::print("{:-<10}{}\n", "hello", "world"); - } - ``` + int main() { + fmt::print("{:-<10}{}\n", "你好", "世界"); + fmt::print("{:-<10}{}\n", "hello", "world"); + } + ``` - prints + prints - ![](https://user-images.githubusercontent.com/576385/119840373-cea3ca80-beb9-11eb-91e0-54266c48e181.png) + ![](https://user-images.githubusercontent.com/576385/119840373-cea3ca80-beb9-11eb-91e0-54266c48e181.png) - on a modern terminal. + on a modern terminal. -- The experimental fast output stream (`fmt::ostream`) is now - truncated by default for consistency with `fopen` - (https://github.com/fmtlib/fmt/issues/2018). For example: +- The experimental fast output stream (`fmt::ostream`) is now + truncated by default for consistency with `fopen` + (https://github.com/fmtlib/fmt/issues/2018). For example: - ```c++ - #include + ```c++ + #include - int main() { - fmt::ostream out1 = fmt::output_file("guide"); - out1.print("Zaphod"); - out1.close(); - fmt::ostream out2 = fmt::output_file("guide"); - out2.print("Ford"); - } - ``` - - writes \"Ford\" to the file \"guide\". To preserve the old file - content if any pass `fmt::file::WRONLY | fmt::file::CREATE` flags to - `fmt::output_file`. - -- Fixed moving of `fmt::ostream` that holds buffered data - (https://github.com/fmtlib/fmt/issues/2197, - https://github.com/fmtlib/fmt/pull/2198). Thanks @vtta. - -- Replaced the `fmt::system_error` exception with a function of the - same name that constructs `std::system_error` - (https://github.com/fmtlib/fmt/issues/2266). - -- Replaced the `fmt::windows_error` exception with a function of the - same name that constructs `std::system_error` with the category - returned by `fmt::system_category()` - (https://github.com/fmtlib/fmt/issues/2274, - https://github.com/fmtlib/fmt/pull/2275). The latter is - similar to `std::system_category` but correctly handles UTF-8. - Thanks @phprus. - -- Replaced `fmt::error_code` with `std::error_code` and made it - formattable (https://github.com/fmtlib/fmt/issues/2269, - https://github.com/fmtlib/fmt/pull/2270, - https://github.com/fmtlib/fmt/pull/2273). Thanks @phprus. - -- Added speech synthesis support - (https://github.com/fmtlib/fmt/pull/2206). - -- Made `format_to` work with a memory buffer that has a custom - allocator (https://github.com/fmtlib/fmt/pull/2300). - Thanks @voxmea. - -- Added `Allocator::max_size` support to `basic_memory_buffer`. - (https://github.com/fmtlib/fmt/pull/1960). Thanks @phprus. - -- Added wide string support to `fmt::join` - (https://github.com/fmtlib/fmt/pull/2236). Thanks @crbrz. - -- Made iterators passed to `formatter` specializations via a format - context satisfy C++20 `std::output_iterator` requirements - (https://github.com/fmtlib/fmt/issues/2156, - https://github.com/fmtlib/fmt/pull/2158, - https://github.com/fmtlib/fmt/issues/2195, - https://github.com/fmtlib/fmt/pull/2204). Thanks @randomnetcat. - -- Optimized the `printf` implementation - (https://github.com/fmtlib/fmt/pull/1982, - https://github.com/fmtlib/fmt/pull/1984, - https://github.com/fmtlib/fmt/pull/2016, - https://github.com/fmtlib/fmt/pull/2164). - Thanks @rimathia and @moiwi. - -- Improved detection of `constexpr` `char_traits` - (https://github.com/fmtlib/fmt/pull/2246, - https://github.com/fmtlib/fmt/pull/2257). Thanks @phprus. - -- Fixed writing to `stdout` when it is redirected to `NUL` on Windows - (https://github.com/fmtlib/fmt/issues/2080). - -- Fixed exception propagation from iterators - (https://github.com/fmtlib/fmt/issues/2097). - -- Improved `strftime` error handling - (https://github.com/fmtlib/fmt/issues/2238, - https://github.com/fmtlib/fmt/pull/2244). Thanks @yumeyao. - -- Stopped using deprecated GCC UDL template extension. - -- Added `fmt/args.h` to the install target - (https://github.com/fmtlib/fmt/issues/2096). - -- Error messages are now passed to assert when exceptions are disabled - (https://github.com/fmtlib/fmt/pull/2145). Thanks @NobodyXu. - -- Added the `FMT_MASTER_PROJECT` CMake option to control build and - install targets when {fmt} is included via `add_subdirectory` - (https://github.com/fmtlib/fmt/issues/2098, - https://github.com/fmtlib/fmt/pull/2100). - Thanks @randomizedthinking. - -- Improved build configuration - (https://github.com/fmtlib/fmt/pull/2026, - https://github.com/fmtlib/fmt/pull/2122). - Thanks @luncliff and @ibaned. - -- Fixed various warnings and compilation issues - (https://github.com/fmtlib/fmt/issues/1947, - https://github.com/fmtlib/fmt/pull/1959, - https://github.com/fmtlib/fmt/pull/1963, - https://github.com/fmtlib/fmt/pull/1965, - https://github.com/fmtlib/fmt/issues/1966, - https://github.com/fmtlib/fmt/pull/1974, - https://github.com/fmtlib/fmt/pull/1975, - https://github.com/fmtlib/fmt/pull/1990, - https://github.com/fmtlib/fmt/issues/2000, - https://github.com/fmtlib/fmt/pull/2001, - https://github.com/fmtlib/fmt/issues/2002, - https://github.com/fmtlib/fmt/issues/2004, - https://github.com/fmtlib/fmt/pull/2006, - https://github.com/fmtlib/fmt/pull/2009, - https://github.com/fmtlib/fmt/pull/2010, - https://github.com/fmtlib/fmt/issues/2038, - https://github.com/fmtlib/fmt/issues/2039, - https://github.com/fmtlib/fmt/issues/2047, - https://github.com/fmtlib/fmt/pull/2053, - https://github.com/fmtlib/fmt/issues/2059, - https://github.com/fmtlib/fmt/pull/2065, - https://github.com/fmtlib/fmt/pull/2067, - https://github.com/fmtlib/fmt/pull/2068, - https://github.com/fmtlib/fmt/pull/2073, - https://github.com/fmtlib/fmt/issues/2103, - https://github.com/fmtlib/fmt/issues/2105, - https://github.com/fmtlib/fmt/pull/2106, - https://github.com/fmtlib/fmt/pull/2107, - https://github.com/fmtlib/fmt/issues/2116, - https://github.com/fmtlib/fmt/pull/2117, - https://github.com/fmtlib/fmt/issues/2118, - https://github.com/fmtlib/fmt/pull/2119, - https://github.com/fmtlib/fmt/issues/2127, - https://github.com/fmtlib/fmt/pull/2128, - https://github.com/fmtlib/fmt/issues/2140, - https://github.com/fmtlib/fmt/issues/2142, - https://github.com/fmtlib/fmt/pull/2143, - https://github.com/fmtlib/fmt/pull/2144, - https://github.com/fmtlib/fmt/issues/2147, - https://github.com/fmtlib/fmt/issues/2148, - https://github.com/fmtlib/fmt/issues/2149, - https://github.com/fmtlib/fmt/pull/2152, - https://github.com/fmtlib/fmt/pull/2160, - https://github.com/fmtlib/fmt/issues/2170, - https://github.com/fmtlib/fmt/issues/2175, - https://github.com/fmtlib/fmt/issues/2176, - https://github.com/fmtlib/fmt/pull/2177, - https://github.com/fmtlib/fmt/issues/2178, - https://github.com/fmtlib/fmt/pull/2179, - https://github.com/fmtlib/fmt/issues/2180, - https://github.com/fmtlib/fmt/issues/2181, - https://github.com/fmtlib/fmt/pull/2183, - https://github.com/fmtlib/fmt/issues/2184, - https://github.com/fmtlib/fmt/issues/2185, - https://github.com/fmtlib/fmt/pull/2186, - https://github.com/fmtlib/fmt/pull/2187, - https://github.com/fmtlib/fmt/pull/2190, - https://github.com/fmtlib/fmt/pull/2192, - https://github.com/fmtlib/fmt/pull/2194, - https://github.com/fmtlib/fmt/pull/2205, - https://github.com/fmtlib/fmt/issues/2210, - https://github.com/fmtlib/fmt/pull/2211, - https://github.com/fmtlib/fmt/pull/2215, - https://github.com/fmtlib/fmt/pull/2216, - https://github.com/fmtlib/fmt/pull/2218, - https://github.com/fmtlib/fmt/pull/2220, - https://github.com/fmtlib/fmt/issues/2228, - https://github.com/fmtlib/fmt/pull/2229, - https://github.com/fmtlib/fmt/pull/2230, - https://github.com/fmtlib/fmt/issues/2233, - https://github.com/fmtlib/fmt/pull/2239, - https://github.com/fmtlib/fmt/issues/2248, - https://github.com/fmtlib/fmt/issues/2252, - https://github.com/fmtlib/fmt/pull/2253, - https://github.com/fmtlib/fmt/pull/2255, - https://github.com/fmtlib/fmt/issues/2261, - https://github.com/fmtlib/fmt/issues/2278, - https://github.com/fmtlib/fmt/issues/2284, - https://github.com/fmtlib/fmt/pull/2287, - https://github.com/fmtlib/fmt/pull/2289, - https://github.com/fmtlib/fmt/pull/2290, - https://github.com/fmtlib/fmt/pull/2293, - https://github.com/fmtlib/fmt/issues/2295, - https://github.com/fmtlib/fmt/pull/2296, - https://github.com/fmtlib/fmt/pull/2297, - https://github.com/fmtlib/fmt/issues/2311, - https://github.com/fmtlib/fmt/pull/2313, - https://github.com/fmtlib/fmt/pull/2315, - https://github.com/fmtlib/fmt/issues/2320, - https://github.com/fmtlib/fmt/pull/2321, - https://github.com/fmtlib/fmt/pull/2323, - https://github.com/fmtlib/fmt/issues/2328, - https://github.com/fmtlib/fmt/pull/2329, - https://github.com/fmtlib/fmt/pull/2333, - https://github.com/fmtlib/fmt/pull/2338, - https://github.com/fmtlib/fmt/pull/2341). - Thanks @darklukee, @fagg, @killerbot242, @jgopel, @yeswalrus, @Finkman, - @HazardyKnusperkeks, @dkavolis, @concatime, @chronoxor, @summivox, @yNeo, - @Apache-HB, @alexezeder, @toojays, @Brainy0207, @vadz, @imsherlock, @phprus, - @white238, @yafshar, @BillyDonahue, @jstaahl, @denchat, @DanielaE, - @ilyakurdyukov, @ilmai, @JessyDL, @sergiud, @mwinterb, @sven-herrmann, - @jmelas, @twoixter, @crbrz and @upsj. - -- Improved documentation - (https://github.com/fmtlib/fmt/issues/1986, - https://github.com/fmtlib/fmt/pull/2051, - https://github.com/fmtlib/fmt/issues/2057, - https://github.com/fmtlib/fmt/pull/2081, - https://github.com/fmtlib/fmt/issues/2084, - https://github.com/fmtlib/fmt/pull/2312). - Thanks @imba-tjd, @0x416c69 and @mordante. - -- Continuous integration and test improvements - (https://github.com/fmtlib/fmt/issues/1969, - https://github.com/fmtlib/fmt/pull/1991, - https://github.com/fmtlib/fmt/pull/2020, - https://github.com/fmtlib/fmt/pull/2110, - https://github.com/fmtlib/fmt/pull/2114, - https://github.com/fmtlib/fmt/issues/2196, - https://github.com/fmtlib/fmt/pull/2217, - https://github.com/fmtlib/fmt/pull/2247, - https://github.com/fmtlib/fmt/pull/2256, - https://github.com/fmtlib/fmt/pull/2336, - https://github.com/fmtlib/fmt/pull/2346). - Thanks @jgopel, @alexezeder and @DanielaE. + int main() { + fmt::ostream out1 = fmt::output_file("guide"); + out1.print("Zaphod"); + out1.close(); + fmt::ostream out2 = fmt::output_file("guide"); + out2.print("Ford"); + } + ``` + + writes \"Ford\" to the file \"guide\". To preserve the old file + content if any pass `fmt::file::WRONLY | fmt::file::CREATE` flags to + `fmt::output_file`. + +- Fixed moving of `fmt::ostream` that holds buffered data + (https://github.com/fmtlib/fmt/issues/2197, + https://github.com/fmtlib/fmt/pull/2198). Thanks @vtta. + +- Replaced the `fmt::system_error` exception with a function of the + same name that constructs `std::system_error` + (https://github.com/fmtlib/fmt/issues/2266). + +- Replaced the `fmt::windows_error` exception with a function of the + same name that constructs `std::system_error` with the category + returned by `fmt::system_category()` + (https://github.com/fmtlib/fmt/issues/2274, + https://github.com/fmtlib/fmt/pull/2275). The latter is + similar to `std::system_category` but correctly handles UTF-8. + Thanks @phprus. + +- Replaced `fmt::error_code` with `std::error_code` and made it + formattable (https://github.com/fmtlib/fmt/issues/2269, + https://github.com/fmtlib/fmt/pull/2270, + https://github.com/fmtlib/fmt/pull/2273). Thanks @phprus. + +- Added speech synthesis support + (https://github.com/fmtlib/fmt/pull/2206). + +- Made `format_to` work with a memory buffer that has a custom + allocator (https://github.com/fmtlib/fmt/pull/2300). + Thanks @voxmea. + +- Added `Allocator::max_size` support to `basic_memory_buffer`. + (https://github.com/fmtlib/fmt/pull/1960). Thanks @phprus. + +- Added wide string support to `fmt::join` + (https://github.com/fmtlib/fmt/pull/2236). Thanks @crbrz. + +- Made iterators passed to `formatter` specializations via a format + context satisfy C++20 `std::output_iterator` requirements + (https://github.com/fmtlib/fmt/issues/2156, + https://github.com/fmtlib/fmt/pull/2158, + https://github.com/fmtlib/fmt/issues/2195, + https://github.com/fmtlib/fmt/pull/2204). Thanks @randomnetcat. + +- Optimized the `printf` implementation + (https://github.com/fmtlib/fmt/pull/1982, + https://github.com/fmtlib/fmt/pull/1984, + https://github.com/fmtlib/fmt/pull/2016, + https://github.com/fmtlib/fmt/pull/2164). + Thanks @rimathia and @moiwi. + +- Improved detection of `constexpr` `char_traits` + (https://github.com/fmtlib/fmt/pull/2246, + https://github.com/fmtlib/fmt/pull/2257). Thanks @phprus. + +- Fixed writing to `stdout` when it is redirected to `NUL` on Windows + (https://github.com/fmtlib/fmt/issues/2080). + +- Fixed exception propagation from iterators + (https://github.com/fmtlib/fmt/issues/2097). + +- Improved `strftime` error handling + (https://github.com/fmtlib/fmt/issues/2238, + https://github.com/fmtlib/fmt/pull/2244). Thanks @yumeyao. + +- Stopped using deprecated GCC UDL template extension. + +- Added `fmt/args.h` to the install target + (https://github.com/fmtlib/fmt/issues/2096). + +- Error messages are now passed to assert when exceptions are disabled + (https://github.com/fmtlib/fmt/pull/2145). Thanks @NobodyXu. + +- Added the `FMT_MASTER_PROJECT` CMake option to control build and + install targets when {fmt} is included via `add_subdirectory` + (https://github.com/fmtlib/fmt/issues/2098, + https://github.com/fmtlib/fmt/pull/2100). + Thanks @randomizedthinking. + +- Improved build configuration + (https://github.com/fmtlib/fmt/pull/2026, + https://github.com/fmtlib/fmt/pull/2122). + Thanks @luncliff and @ibaned. + +- Fixed various warnings and compilation issues + (https://github.com/fmtlib/fmt/issues/1947, + https://github.com/fmtlib/fmt/pull/1959, + https://github.com/fmtlib/fmt/pull/1963, + https://github.com/fmtlib/fmt/pull/1965, + https://github.com/fmtlib/fmt/issues/1966, + https://github.com/fmtlib/fmt/pull/1974, + https://github.com/fmtlib/fmt/pull/1975, + https://github.com/fmtlib/fmt/pull/1990, + https://github.com/fmtlib/fmt/issues/2000, + https://github.com/fmtlib/fmt/pull/2001, + https://github.com/fmtlib/fmt/issues/2002, + https://github.com/fmtlib/fmt/issues/2004, + https://github.com/fmtlib/fmt/pull/2006, + https://github.com/fmtlib/fmt/pull/2009, + https://github.com/fmtlib/fmt/pull/2010, + https://github.com/fmtlib/fmt/issues/2038, + https://github.com/fmtlib/fmt/issues/2039, + https://github.com/fmtlib/fmt/issues/2047, + https://github.com/fmtlib/fmt/pull/2053, + https://github.com/fmtlib/fmt/issues/2059, + https://github.com/fmtlib/fmt/pull/2065, + https://github.com/fmtlib/fmt/pull/2067, + https://github.com/fmtlib/fmt/pull/2068, + https://github.com/fmtlib/fmt/pull/2073, + https://github.com/fmtlib/fmt/issues/2103, + https://github.com/fmtlib/fmt/issues/2105, + https://github.com/fmtlib/fmt/pull/2106, + https://github.com/fmtlib/fmt/pull/2107, + https://github.com/fmtlib/fmt/issues/2116, + https://github.com/fmtlib/fmt/pull/2117, + https://github.com/fmtlib/fmt/issues/2118, + https://github.com/fmtlib/fmt/pull/2119, + https://github.com/fmtlib/fmt/issues/2127, + https://github.com/fmtlib/fmt/pull/2128, + https://github.com/fmtlib/fmt/issues/2140, + https://github.com/fmtlib/fmt/issues/2142, + https://github.com/fmtlib/fmt/pull/2143, + https://github.com/fmtlib/fmt/pull/2144, + https://github.com/fmtlib/fmt/issues/2147, + https://github.com/fmtlib/fmt/issues/2148, + https://github.com/fmtlib/fmt/issues/2149, + https://github.com/fmtlib/fmt/pull/2152, + https://github.com/fmtlib/fmt/pull/2160, + https://github.com/fmtlib/fmt/issues/2170, + https://github.com/fmtlib/fmt/issues/2175, + https://github.com/fmtlib/fmt/issues/2176, + https://github.com/fmtlib/fmt/pull/2177, + https://github.com/fmtlib/fmt/issues/2178, + https://github.com/fmtlib/fmt/pull/2179, + https://github.com/fmtlib/fmt/issues/2180, + https://github.com/fmtlib/fmt/issues/2181, + https://github.com/fmtlib/fmt/pull/2183, + https://github.com/fmtlib/fmt/issues/2184, + https://github.com/fmtlib/fmt/issues/2185, + https://github.com/fmtlib/fmt/pull/2186, + https://github.com/fmtlib/fmt/pull/2187, + https://github.com/fmtlib/fmt/pull/2190, + https://github.com/fmtlib/fmt/pull/2192, + https://github.com/fmtlib/fmt/pull/2194, + https://github.com/fmtlib/fmt/pull/2205, + https://github.com/fmtlib/fmt/issues/2210, + https://github.com/fmtlib/fmt/pull/2211, + https://github.com/fmtlib/fmt/pull/2215, + https://github.com/fmtlib/fmt/pull/2216, + https://github.com/fmtlib/fmt/pull/2218, + https://github.com/fmtlib/fmt/pull/2220, + https://github.com/fmtlib/fmt/issues/2228, + https://github.com/fmtlib/fmt/pull/2229, + https://github.com/fmtlib/fmt/pull/2230, + https://github.com/fmtlib/fmt/issues/2233, + https://github.com/fmtlib/fmt/pull/2239, + https://github.com/fmtlib/fmt/issues/2248, + https://github.com/fmtlib/fmt/issues/2252, + https://github.com/fmtlib/fmt/pull/2253, + https://github.com/fmtlib/fmt/pull/2255, + https://github.com/fmtlib/fmt/issues/2261, + https://github.com/fmtlib/fmt/issues/2278, + https://github.com/fmtlib/fmt/issues/2284, + https://github.com/fmtlib/fmt/pull/2287, + https://github.com/fmtlib/fmt/pull/2289, + https://github.com/fmtlib/fmt/pull/2290, + https://github.com/fmtlib/fmt/pull/2293, + https://github.com/fmtlib/fmt/issues/2295, + https://github.com/fmtlib/fmt/pull/2296, + https://github.com/fmtlib/fmt/pull/2297, + https://github.com/fmtlib/fmt/issues/2311, + https://github.com/fmtlib/fmt/pull/2313, + https://github.com/fmtlib/fmt/pull/2315, + https://github.com/fmtlib/fmt/issues/2320, + https://github.com/fmtlib/fmt/pull/2321, + https://github.com/fmtlib/fmt/pull/2323, + https://github.com/fmtlib/fmt/issues/2328, + https://github.com/fmtlib/fmt/pull/2329, + https://github.com/fmtlib/fmt/pull/2333, + https://github.com/fmtlib/fmt/pull/2338, + https://github.com/fmtlib/fmt/pull/2341). + Thanks @darklukee, @fagg, @killerbot242, @jgopel, @yeswalrus, @Finkman, + @HazardyKnusperkeks, @dkavolis, @concatime, @chronoxor, @summivox, @yNeo, + @Apache-HB, @alexezeder, @toojays, @Brainy0207, @vadz, @imsherlock, @phprus, + @white238, @yafshar, @BillyDonahue, @jstaahl, @denchat, @DanielaE, + @ilyakurdyukov, @ilmai, @JessyDL, @sergiud, @mwinterb, @sven-herrmann, + @jmelas, @twoixter, @crbrz and @upsj. + +- Improved documentation + (https://github.com/fmtlib/fmt/issues/1986, + https://github.com/fmtlib/fmt/pull/2051, + https://github.com/fmtlib/fmt/issues/2057, + https://github.com/fmtlib/fmt/pull/2081, + https://github.com/fmtlib/fmt/issues/2084, + https://github.com/fmtlib/fmt/pull/2312). + Thanks @imba-tjd, @0x416c69 and @mordante. + +- Continuous integration and test improvements + (https://github.com/fmtlib/fmt/issues/1969, + https://github.com/fmtlib/fmt/pull/1991, + https://github.com/fmtlib/fmt/pull/2020, + https://github.com/fmtlib/fmt/pull/2110, + https://github.com/fmtlib/fmt/pull/2114, + https://github.com/fmtlib/fmt/issues/2196, + https://github.com/fmtlib/fmt/pull/2217, + https://github.com/fmtlib/fmt/pull/2247, + https://github.com/fmtlib/fmt/pull/2256, + https://github.com/fmtlib/fmt/pull/2336, + https://github.com/fmtlib/fmt/pull/2346). + Thanks @jgopel, @alexezeder and @DanielaE. # 7.1.3 - 2020-11-24 -- Fixed handling of buffer boundaries in `format_to_n` - (https://github.com/fmtlib/fmt/issues/1996, - https://github.com/fmtlib/fmt/issues/2029). -- Fixed linkage errors when linking with a shared library - (https://github.com/fmtlib/fmt/issues/2011). -- Reintroduced ostream support to range formatters - (https://github.com/fmtlib/fmt/issues/2014). -- Worked around an issue with mixing std versions in gcc - (https://github.com/fmtlib/fmt/issues/2017). +- Fixed handling of buffer boundaries in `format_to_n` + (https://github.com/fmtlib/fmt/issues/1996, + https://github.com/fmtlib/fmt/issues/2029). +- Fixed linkage errors when linking with a shared library + (https://github.com/fmtlib/fmt/issues/2011). +- Reintroduced ostream support to range formatters + (https://github.com/fmtlib/fmt/issues/2014). +- Worked around an issue with mixing std versions in gcc + (https://github.com/fmtlib/fmt/issues/2017). # 7.1.2 - 2020-11-04 -- Fixed floating point formatting with large precision - (https://github.com/fmtlib/fmt/issues/1976). +- Fixed floating point formatting with large precision + (https://github.com/fmtlib/fmt/issues/1976). # 7.1.1 - 2020-11-01 -- Fixed ABI compatibility with 7.0.x - (https://github.com/fmtlib/fmt/issues/1961). -- Added the `FMT_ARM_ABI_COMPATIBILITY` macro to work around ABI - incompatibility between GCC and Clang on ARM - (https://github.com/fmtlib/fmt/issues/1919). -- Worked around a SFINAE bug in GCC 8 - (https://github.com/fmtlib/fmt/issues/1957). -- Fixed linkage errors when building with GCC\'s LTO - (https://github.com/fmtlib/fmt/issues/1955). -- Fixed a compilation error when building without `__builtin_clz` or - equivalent (https://github.com/fmtlib/fmt/pull/1968). - Thanks @tohammer. -- Fixed a sign conversion warning - (https://github.com/fmtlib/fmt/pull/1964). Thanks @OptoCloud. +- Fixed ABI compatibility with 7.0.x + (https://github.com/fmtlib/fmt/issues/1961). +- Added the `FMT_ARM_ABI_COMPATIBILITY` macro to work around ABI + incompatibility between GCC and Clang on ARM + (https://github.com/fmtlib/fmt/issues/1919). +- Worked around a SFINAE bug in GCC 8 + (https://github.com/fmtlib/fmt/issues/1957). +- Fixed linkage errors when building with GCC\'s LTO + (https://github.com/fmtlib/fmt/issues/1955). +- Fixed a compilation error when building without `__builtin_clz` or + equivalent (https://github.com/fmtlib/fmt/pull/1968). + Thanks @tohammer. +- Fixed a sign conversion warning + (https://github.com/fmtlib/fmt/pull/1964). Thanks @OptoCloud. # 7.1.0 - 2020-10-25 -- Switched from - [Grisu3](https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf) - to [Dragonbox](https://github.com/jk-jeon/dragonbox) for the default - floating-point formatting which gives the shortest decimal - representation with round-trip guarantee and correct rounding - (https://github.com/fmtlib/fmt/pull/1882, - https://github.com/fmtlib/fmt/pull/1887, - https://github.com/fmtlib/fmt/pull/1894). This makes {fmt} - up to 20-30x faster than common implementations of - `std::ostringstream` and `sprintf` on - [dtoa-benchmark](https://github.com/fmtlib/dtoa-benchmark) and - faster than double-conversion and Ryū: - - ![](https://user-images.githubusercontent.com/576385/95684665-11719600-0ba8-11eb-8e5b-972ff4e49428.png) - - It is possible to get even better performance at the cost of larger - binary size by compiling with the `FMT_USE_FULL_CACHE_DRAGONBOX` - macro set to 1. - - Thanks @jk-jeon. - -- Added an experimental unsynchronized file output API which, together - with [format string - compilation](https://fmt.dev/latest/api.html#compile-api), can give - [5-9 times speed up compared to - fprintf](https://www.zverovich.net/2020/08/04/optimal-file-buffer-size.html) - on common platforms ([godbolt](https://godbolt.org/z/nsTcG8)): - - ```c++ - #include - - int main() { - auto f = fmt::output_file("guide"); - f.print("The answer is {}.", 42); - } - ``` - -- Added a formatter for `std::chrono::time_point` - (https://github.com/fmtlib/fmt/issues/1819, - https://github.com/fmtlib/fmt/pull/1837). For example - ([godbolt](https://godbolt.org/z/c4M6fh)): - - ```c++ - #include - - int main() { - auto now = std::chrono::system_clock::now(); - fmt::print("The time is {:%H:%M:%S}.\n", now); - } - ``` - - Thanks @adamburgess. - -- Added support for ranges with non-const `begin`/`end` to `fmt::join` - (https://github.com/fmtlib/fmt/issues/1784, - https://github.com/fmtlib/fmt/pull/1786). For example - ([godbolt](https://godbolt.org/z/jP63Tv)): - - ```c++ - #include - #include - - int main() { - using std::literals::string_literals::operator""s; - auto strs = std::array{"a"s, "bb"s, "ccc"s}; - auto range = strs | ranges::views::filter( - [] (const std::string &x) { return x.size() != 2; } - ); - fmt::print("{}\n", fmt::join(range, "")); - } - ``` - - prints \"accc\". - - Thanks @tonyelewis. - -- Added a `memory_buffer::append` overload that takes a range - (https://github.com/fmtlib/fmt/pull/1806). Thanks @BRevzin. - -- Improved handling of single code units in `FMT_COMPILE`. For - example: - - ```c++ - #include - - char* f(char* buf) { - return fmt::format_to(buf, FMT_COMPILE("x{}"), 42); - } - ``` - - compiles to just ([godbolt](https://godbolt.org/z/5vncz3)): - - ```asm - _Z1fPc: - movb $120, (%rdi) - xorl %edx, %edx - cmpl $42, _ZN3fmt2v76detail10basic_dataIvE23zero_or_powers_of_10_32E+8(%rip) - movl $3, %eax - seta %dl - subl %edx, %eax - movzwl _ZN3fmt2v76detail10basic_dataIvE6digitsE+84(%rip), %edx - cltq - addq %rdi, %rax - movw %dx, -2(%rax) - ret - ``` - - Here a single `mov` instruction writes `'x'` (`$120`) to the output - buffer. - -- Added dynamic width support to format string compilation - (https://github.com/fmtlib/fmt/issues/1809). - -- Improved error reporting for unformattable types: now you\'ll get - the type name directly in the error message instead of the note: - - ```c++ - #include - - struct how_about_no {}; - - int main() { - fmt::print("{}", how_about_no()); - } - ``` - - Error ([godbolt](https://godbolt.org/z/GoxM4e)): - - `fmt/core.h:1438:3: error: static_assert failed due to requirement 'fmt::v7::formattable()' "Cannot format an argument. To make type T formattable provide a formatter specialization: https://fmt.dev/latest/api.html#udt" ...` - -- Added the - [make_args_checked](https://fmt.dev/7.1.0/api.html#argument-lists) - function template that allows you to write formatting functions with - compile-time format string checks and avoid binary code bloat - ([godbolt](https://godbolt.org/z/PEf9qr)): - - ```c++ - void vlog(const char* file, int line, fmt::string_view format, - fmt::format_args args) { - fmt::print("{}: {}: ", file, line); - fmt::vprint(format, args); - } - - template - void log(const char* file, int line, const S& format, Args&&... args) { - vlog(file, line, format, - fmt::make_args_checked(format, args...)); - } - - #define MY_LOG(format, ...) \ - log(__FILE__, __LINE__, FMT_STRING(format), __VA_ARGS__) - - MY_LOG("invalid squishiness: {}", 42); - ``` - -- Replaced `snprintf` fallback with a faster internal IEEE 754 `float` - and `double` formatter for arbitrary precision. For example - ([godbolt](https://godbolt.org/z/dPhWvj)): - - ```c++ - #include - - int main() { - fmt::print("{:.500}\n", 4.9406564584124654E-324); - } - ``` - - prints - - `4.9406564584124654417656879286822137236505980261432476442558568250067550727020875186529983636163599237979656469544571773092665671035593979639877479601078187812630071319031140452784581716784898210368871863605699873072305000638740915356498438731247339727316961514003171538539807412623856559117102665855668676818703956031062493194527159149245532930545654440112748012970999954193198940908041656332452475714786901472678015935523861155013480352649347201937902681071074917033322268447533357208324319360923829e-324`. +- Switched from + [Grisu3](https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf) + to [Dragonbox](https://github.com/jk-jeon/dragonbox) for the default + floating-point formatting which gives the shortest decimal + representation with round-trip guarantee and correct rounding + (https://github.com/fmtlib/fmt/pull/1882, + https://github.com/fmtlib/fmt/pull/1887, + https://github.com/fmtlib/fmt/pull/1894). This makes {fmt} + up to 20-30x faster than common implementations of + `std::ostringstream` and `sprintf` on + [dtoa-benchmark](https://github.com/fmtlib/dtoa-benchmark) and + faster than double-conversion and Ryū: + + ![](https://user-images.githubusercontent.com/576385/95684665-11719600-0ba8-11eb-8e5b-972ff4e49428.png) + + It is possible to get even better performance at the cost of larger + binary size by compiling with the `FMT_USE_FULL_CACHE_DRAGONBOX` + macro set to 1. + + Thanks @jk-jeon. + +- Added an experimental unsynchronized file output API which, together + with [format string + compilation](https://fmt.dev/latest/api.html#compile-api), can give + [5-9 times speed up compared to + fprintf](https://www.zverovich.net/2020/08/04/optimal-file-buffer-size.html) + on common platforms ([godbolt](https://godbolt.org/z/nsTcG8)): + + ```c++ + #include + + int main() { + auto f = fmt::output_file("guide"); + f.print("The answer is {}.", 42); + } + ``` + +- Added a formatter for `std::chrono::time_point` + (https://github.com/fmtlib/fmt/issues/1819, + https://github.com/fmtlib/fmt/pull/1837). For example + ([godbolt](https://godbolt.org/z/c4M6fh)): + + ```c++ + #include + + int main() { + auto now = std::chrono::system_clock::now(); + fmt::print("The time is {:%H:%M:%S}.\n", now); + } + ``` + + Thanks @adamburgess. + +- Added support for ranges with non-const `begin`/`end` to `fmt::join` + (https://github.com/fmtlib/fmt/issues/1784, + https://github.com/fmtlib/fmt/pull/1786). For example + ([godbolt](https://godbolt.org/z/jP63Tv)): + + ```c++ + #include + #include + + int main() { + using std::literals::string_literals::operator""s; + auto strs = std::array{"a"s, "bb"s, "ccc"s}; + auto range = strs | ranges::views::filter( + [] (const std::string &x) { return x.size() != 2; } + ); + fmt::print("{}\n", fmt::join(range, "")); + } + ``` + + prints \"accc\". + + Thanks @tonyelewis. + +- Added a `memory_buffer::append` overload that takes a range + (https://github.com/fmtlib/fmt/pull/1806). Thanks @BRevzin. + +- Improved handling of single code units in `FMT_COMPILE`. For + example: + + ```c++ + #include + + char* f(char* buf) { + return fmt::format_to(buf, FMT_COMPILE("x{}"), 42); + } + ``` + + compiles to just ([godbolt](https://godbolt.org/z/5vncz3)): + + ```asm + _Z1fPc: + movb $120, (%rdi) + xorl %edx, %edx + cmpl $42, _ZN3fmt2v76detail10basic_dataIvE23zero_or_powers_of_10_32E+8(%rip) + movl $3, %eax + seta %dl + subl %edx, %eax + movzwl _ZN3fmt2v76detail10basic_dataIvE6digitsE+84(%rip), %edx + cltq + addq %rdi, %rax + movw %dx, -2(%rax) + ret + ``` + + Here a single `mov` instruction writes `'x'` (`$120`) to the output + buffer. + +- Added dynamic width support to format string compilation + (https://github.com/fmtlib/fmt/issues/1809). + +- Improved error reporting for unformattable types: now you\'ll get + the type name directly in the error message instead of the note: + + ```c++ + #include + + struct how_about_no {}; + + int main() { + fmt::print("{}", how_about_no()); + } + ``` + + Error ([godbolt](https://godbolt.org/z/GoxM4e)): + + `fmt/core.h:1438:3: error: static_assert failed due to requirement 'fmt::v7::formattable()' "Cannot format an argument. To make type T formattable provide a formatter specialization: https://fmt.dev/latest/api.html#udt" ...` + +- Added the + [make_args_checked](https://fmt.dev/7.1.0/api.html#argument-lists) + function template that allows you to write formatting functions with + compile-time format string checks and avoid binary code bloat + ([godbolt](https://godbolt.org/z/PEf9qr)): + + ```c++ + void vlog(const char* file, int line, fmt::string_view format, + fmt::format_args args) { + fmt::print("{}: {}: ", file, line); + fmt::vprint(format, args); + } + + template + void log(const char* file, int line, const S& format, Args&&... args) { + vlog(file, line, format, + fmt::make_args_checked(format, args...)); + } + + #define MY_LOG(format, ...) \ + log(__FILE__, __LINE__, FMT_STRING(format), __VA_ARGS__) + + MY_LOG("invalid squishiness: {}", 42); + ``` + +- Replaced `snprintf` fallback with a faster internal IEEE 754 `float` + and `double` formatter for arbitrary precision. For example + ([godbolt](https://godbolt.org/z/dPhWvj)): + + ```c++ + #include + + int main() { + fmt::print("{:.500}\n", 4.9406564584124654E-324); + } + ``` + + prints + + `4.9406564584124654417656879286822137236505980261432476442558568250067550727020875186529983636163599237979656469544571773092665671035593979639877479601078187812630071319031140452784581716784898210368871863605699873072305000638740915356498438731247339727316961514003171538539807412623856559117102665855668676818703956031062493194527159149245532930545654440112748012970999954193198940908041656332452475714786901472678015935523861155013480352649347201937902681071074917033322268447533357208324319360923829e-324`. -- Made `format_to_n` and `formatted_size` part of the [core - API](https://fmt.dev/latest/api.html#core-api) - ([godbolt](https://godbolt.org/z/sPjY1K)): - - ```c++ - #include - - int main() { - char buffer[10]; - auto result = fmt::format_to_n(buffer, sizeof(buffer), "{}", 42); - } - ``` - -- Added `fmt::format_to_n` overload with format string compilation - (https://github.com/fmtlib/fmt/issues/1764, - https://github.com/fmtlib/fmt/pull/1767, - https://github.com/fmtlib/fmt/pull/1869). For example - ([godbolt](https://godbolt.org/z/93h86q)): - - ```c++ - #include - - int main() { - char buffer[8]; - fmt::format_to_n(buffer, sizeof(buffer), FMT_COMPILE("{}"), 42); - } - ``` - - Thanks @Kurkin and @alexezeder. - -- Added `fmt::format_to` overload that take `text_style` - (https://github.com/fmtlib/fmt/issues/1593, - https://github.com/fmtlib/fmt/issues/1842, - https://github.com/fmtlib/fmt/pull/1843). For example - ([godbolt](https://godbolt.org/z/91153r)): - - ```c++ - #include - - int main() { - std::string out; - fmt::format_to(std::back_inserter(out), - fmt::emphasis::bold | fg(fmt::color::red), - "The answer is {}.", 42); - } - ``` - - Thanks @Naios. - -- Made the `'#'` specifier emit trailing zeros in addition to the - decimal point (https://github.com/fmtlib/fmt/issues/1797). - For example ([godbolt](https://godbolt.org/z/bhdcW9)): - - ```c++ - #include - - int main() { - fmt::print("{:#.2g}", 0.5); - } - ``` - - prints `0.50`. - -- Changed the default floating point format to not include `.0` for - consistency with `std::format` and `std::to_chars` - (https://github.com/fmtlib/fmt/issues/1893, - https://github.com/fmtlib/fmt/issues/1943). It is possible - to get the decimal point and trailing zero with the `#` specifier. - -- Fixed an issue with floating-point formatting that could result in - addition of a non-significant trailing zero in rare cases e.g. - `1.00e-34` instead of `1.0e-34` - (https://github.com/fmtlib/fmt/issues/1873, - https://github.com/fmtlib/fmt/issues/1917). - -- Made `fmt::to_string` fallback on `ostream` insertion operator if - the `formatter` specialization is not provided - (https://github.com/fmtlib/fmt/issues/1815, - https://github.com/fmtlib/fmt/pull/1829). Thanks @alexezeder. - -- Added support for the append mode to the experimental file API and - improved `fcntl.h` detection. - (https://github.com/fmtlib/fmt/pull/1847, - https://github.com/fmtlib/fmt/pull/1848). Thanks @t-wiser. - -- Fixed handling of types that have both an implicit conversion - operator and an overloaded `ostream` insertion operator - (https://github.com/fmtlib/fmt/issues/1766). - -- Fixed a slicing issue in an internal iterator type - (https://github.com/fmtlib/fmt/pull/1822). Thanks @BRevzin. - -- Fixed an issue in locale-specific integer formatting - (https://github.com/fmtlib/fmt/issues/1927). - -- Fixed handling of exotic code unit types - (https://github.com/fmtlib/fmt/issues/1870, - https://github.com/fmtlib/fmt/issues/1932). - -- Improved `FMT_ALWAYS_INLINE` - (https://github.com/fmtlib/fmt/pull/1878). Thanks @jk-jeon. - -- Removed dependency on `windows.h` - (https://github.com/fmtlib/fmt/pull/1900). Thanks @bernd5. - -- Optimized counting of decimal digits on MSVC - (https://github.com/fmtlib/fmt/pull/1890). Thanks @mwinterb. - -- Improved documentation - (https://github.com/fmtlib/fmt/issues/1772, - https://github.com/fmtlib/fmt/pull/1775, - https://github.com/fmtlib/fmt/pull/1792, - https://github.com/fmtlib/fmt/pull/1838, - https://github.com/fmtlib/fmt/pull/1888, - https://github.com/fmtlib/fmt/pull/1918, - https://github.com/fmtlib/fmt/pull/1939). - Thanks @leolchat, @pepsiman, @Klaim, @ravijanjam, @francesco-st and @udnaan. - -- Added the `FMT_REDUCE_INT_INSTANTIATIONS` CMake option that reduces - the binary code size at the cost of some integer formatting - performance. This can be useful for extremely memory-constrained - embedded systems - (https://github.com/fmtlib/fmt/issues/1778, - https://github.com/fmtlib/fmt/pull/1781). Thanks @kammce. - -- Added the `FMT_USE_INLINE_NAMESPACES` macro to control usage of - inline namespaces - (https://github.com/fmtlib/fmt/pull/1945). Thanks @darklukee. - -- Improved build configuration - (https://github.com/fmtlib/fmt/pull/1760, - https://github.com/fmtlib/fmt/pull/1770, - https://github.com/fmtlib/fmt/issues/1779, - https://github.com/fmtlib/fmt/pull/1783, - https://github.com/fmtlib/fmt/pull/1823). - Thanks @dvetutnev, @xvitaly, @tambry, @medithe and @martinwuehrer. - -- Fixed various warnings and compilation issues - (https://github.com/fmtlib/fmt/pull/1790, - https://github.com/fmtlib/fmt/pull/1802, - https://github.com/fmtlib/fmt/pull/1808, - https://github.com/fmtlib/fmt/issues/1810, - https://github.com/fmtlib/fmt/issues/1811, - https://github.com/fmtlib/fmt/pull/1812, - https://github.com/fmtlib/fmt/pull/1814, - https://github.com/fmtlib/fmt/pull/1816, - https://github.com/fmtlib/fmt/pull/1817, - https://github.com/fmtlib/fmt/pull/1818, - https://github.com/fmtlib/fmt/issues/1825, - https://github.com/fmtlib/fmt/pull/1836, - https://github.com/fmtlib/fmt/pull/1855, - https://github.com/fmtlib/fmt/pull/1856, - https://github.com/fmtlib/fmt/pull/1860, - https://github.com/fmtlib/fmt/pull/1877, - https://github.com/fmtlib/fmt/pull/1879, - https://github.com/fmtlib/fmt/pull/1880, - https://github.com/fmtlib/fmt/issues/1896, - https://github.com/fmtlib/fmt/pull/1897, - https://github.com/fmtlib/fmt/pull/1898, - https://github.com/fmtlib/fmt/issues/1904, - https://github.com/fmtlib/fmt/pull/1908, - https://github.com/fmtlib/fmt/issues/1911, - https://github.com/fmtlib/fmt/issues/1912, - https://github.com/fmtlib/fmt/issues/1928, - https://github.com/fmtlib/fmt/pull/1929, - https://github.com/fmtlib/fmt/issues/1935, - https://github.com/fmtlib/fmt/pull/1937, - https://github.com/fmtlib/fmt/pull/1942, - https://github.com/fmtlib/fmt/issues/1949). - Thanks @TheQwertiest, @medithe, @martinwuehrer, @n16h7hunt3r, @Othereum, - @gsjaardema, @AlexanderLanin, @gcerretani, @chronoxor, @noizefloor, - @akohlmey, @jk-jeon, @rimathia, @rglarix, @moiwi, @heckad, @MarcDirven. - @BartSiwek and @darklukee. +- Made `format_to_n` and `formatted_size` part of the [core + API](https://fmt.dev/latest/api.html#core-api) + ([godbolt](https://godbolt.org/z/sPjY1K)): + + ```c++ + #include + + int main() { + char buffer[10]; + auto result = fmt::format_to_n(buffer, sizeof(buffer), "{}", 42); + } + ``` + +- Added `fmt::format_to_n` overload with format string compilation + (https://github.com/fmtlib/fmt/issues/1764, + https://github.com/fmtlib/fmt/pull/1767, + https://github.com/fmtlib/fmt/pull/1869). For example + ([godbolt](https://godbolt.org/z/93h86q)): + + ```c++ + #include + + int main() { + char buffer[8]; + fmt::format_to_n(buffer, sizeof(buffer), FMT_COMPILE("{}"), 42); + } + ``` + + Thanks @Kurkin and @alexezeder. + +- Added `fmt::format_to` overload that take `text_style` + (https://github.com/fmtlib/fmt/issues/1593, + https://github.com/fmtlib/fmt/issues/1842, + https://github.com/fmtlib/fmt/pull/1843). For example + ([godbolt](https://godbolt.org/z/91153r)): + + ```c++ + #include + + int main() { + std::string out; + fmt::format_to(std::back_inserter(out), + fmt::emphasis::bold | fg(fmt::color::red), + "The answer is {}.", 42); + } + ``` + + Thanks @Naios. + +- Made the `'#'` specifier emit trailing zeros in addition to the + decimal point (https://github.com/fmtlib/fmt/issues/1797). + For example ([godbolt](https://godbolt.org/z/bhdcW9)): + + ```c++ + #include + + int main() { + fmt::print("{:#.2g}", 0.5); + } + ``` + + prints `0.50`. + +- Changed the default floating point format to not include `.0` for + consistency with `std::format` and `std::to_chars` + (https://github.com/fmtlib/fmt/issues/1893, + https://github.com/fmtlib/fmt/issues/1943). It is possible + to get the decimal point and trailing zero with the `#` specifier. + +- Fixed an issue with floating-point formatting that could result in + addition of a non-significant trailing zero in rare cases e.g. + `1.00e-34` instead of `1.0e-34` + (https://github.com/fmtlib/fmt/issues/1873, + https://github.com/fmtlib/fmt/issues/1917). + +- Made `fmt::to_string` fallback on `ostream` insertion operator if + the `formatter` specialization is not provided + (https://github.com/fmtlib/fmt/issues/1815, + https://github.com/fmtlib/fmt/pull/1829). Thanks @alexezeder. + +- Added support for the append mode to the experimental file API and + improved `fcntl.h` detection. + (https://github.com/fmtlib/fmt/pull/1847, + https://github.com/fmtlib/fmt/pull/1848). Thanks @t-wiser. + +- Fixed handling of types that have both an implicit conversion + operator and an overloaded `ostream` insertion operator + (https://github.com/fmtlib/fmt/issues/1766). + +- Fixed a slicing issue in an internal iterator type + (https://github.com/fmtlib/fmt/pull/1822). Thanks @BRevzin. + +- Fixed an issue in locale-specific integer formatting + (https://github.com/fmtlib/fmt/issues/1927). + +- Fixed handling of exotic code unit types + (https://github.com/fmtlib/fmt/issues/1870, + https://github.com/fmtlib/fmt/issues/1932). + +- Improved `FMT_ALWAYS_INLINE` + (https://github.com/fmtlib/fmt/pull/1878). Thanks @jk-jeon. + +- Removed dependency on `windows.h` + (https://github.com/fmtlib/fmt/pull/1900). Thanks @bernd5. + +- Optimized counting of decimal digits on MSVC + (https://github.com/fmtlib/fmt/pull/1890). Thanks @mwinterb. + +- Improved documentation + (https://github.com/fmtlib/fmt/issues/1772, + https://github.com/fmtlib/fmt/pull/1775, + https://github.com/fmtlib/fmt/pull/1792, + https://github.com/fmtlib/fmt/pull/1838, + https://github.com/fmtlib/fmt/pull/1888, + https://github.com/fmtlib/fmt/pull/1918, + https://github.com/fmtlib/fmt/pull/1939). + Thanks @leolchat, @pepsiman, @Klaim, @ravijanjam, @francesco-st and @udnaan. + +- Added the `FMT_REDUCE_INT_INSTANTIATIONS` CMake option that reduces + the binary code size at the cost of some integer formatting + performance. This can be useful for extremely memory-constrained + embedded systems + (https://github.com/fmtlib/fmt/issues/1778, + https://github.com/fmtlib/fmt/pull/1781). Thanks @kammce. + +- Added the `FMT_USE_INLINE_NAMESPACES` macro to control usage of + inline namespaces + (https://github.com/fmtlib/fmt/pull/1945). Thanks @darklukee. + +- Improved build configuration + (https://github.com/fmtlib/fmt/pull/1760, + https://github.com/fmtlib/fmt/pull/1770, + https://github.com/fmtlib/fmt/issues/1779, + https://github.com/fmtlib/fmt/pull/1783, + https://github.com/fmtlib/fmt/pull/1823). + Thanks @dvetutnev, @xvitaly, @tambry, @medithe and @martinwuehrer. + +- Fixed various warnings and compilation issues + (https://github.com/fmtlib/fmt/pull/1790, + https://github.com/fmtlib/fmt/pull/1802, + https://github.com/fmtlib/fmt/pull/1808, + https://github.com/fmtlib/fmt/issues/1810, + https://github.com/fmtlib/fmt/issues/1811, + https://github.com/fmtlib/fmt/pull/1812, + https://github.com/fmtlib/fmt/pull/1814, + https://github.com/fmtlib/fmt/pull/1816, + https://github.com/fmtlib/fmt/pull/1817, + https://github.com/fmtlib/fmt/pull/1818, + https://github.com/fmtlib/fmt/issues/1825, + https://github.com/fmtlib/fmt/pull/1836, + https://github.com/fmtlib/fmt/pull/1855, + https://github.com/fmtlib/fmt/pull/1856, + https://github.com/fmtlib/fmt/pull/1860, + https://github.com/fmtlib/fmt/pull/1877, + https://github.com/fmtlib/fmt/pull/1879, + https://github.com/fmtlib/fmt/pull/1880, + https://github.com/fmtlib/fmt/issues/1896, + https://github.com/fmtlib/fmt/pull/1897, + https://github.com/fmtlib/fmt/pull/1898, + https://github.com/fmtlib/fmt/issues/1904, + https://github.com/fmtlib/fmt/pull/1908, + https://github.com/fmtlib/fmt/issues/1911, + https://github.com/fmtlib/fmt/issues/1912, + https://github.com/fmtlib/fmt/issues/1928, + https://github.com/fmtlib/fmt/pull/1929, + https://github.com/fmtlib/fmt/issues/1935, + https://github.com/fmtlib/fmt/pull/1937, + https://github.com/fmtlib/fmt/pull/1942, + https://github.com/fmtlib/fmt/issues/1949). + Thanks @TheQwertiest, @medithe, @martinwuehrer, @n16h7hunt3r, @Othereum, + @gsjaardema, @AlexanderLanin, @gcerretani, @chronoxor, @noizefloor, + @akohlmey, @jk-jeon, @rimathia, @rglarix, @moiwi, @heckad, @MarcDirven. + @BartSiwek and @darklukee. # 7.0.3 - 2020-08-06 -- Worked around broken `numeric_limits` for 128-bit integers - (https://github.com/fmtlib/fmt/issues/1787). -- Added error reporting on missing named arguments - (https://github.com/fmtlib/fmt/issues/1796). -- Stopped using 128-bit integers with clang-cl - (https://github.com/fmtlib/fmt/pull/1800). Thanks @Kingcom. -- Fixed issues in locale-specific integer formatting - (https://github.com/fmtlib/fmt/issues/1782, - https://github.com/fmtlib/fmt/issues/1801). +- Worked around broken `numeric_limits` for 128-bit integers + (https://github.com/fmtlib/fmt/issues/1787). +- Added error reporting on missing named arguments + (https://github.com/fmtlib/fmt/issues/1796). +- Stopped using 128-bit integers with clang-cl + (https://github.com/fmtlib/fmt/pull/1800). Thanks @Kingcom. +- Fixed issues in locale-specific integer formatting + (https://github.com/fmtlib/fmt/issues/1782, + https://github.com/fmtlib/fmt/issues/1801). # 7.0.2 - 2020-07-29 -- Worked around broken `numeric_limits` for 128-bit integers - (https://github.com/fmtlib/fmt/issues/1725). -- Fixed compatibility with CMake 3.4 - (https://github.com/fmtlib/fmt/issues/1779). -- Fixed handling of digit separators in locale-specific formatting - (https://github.com/fmtlib/fmt/issues/1782). +- Worked around broken `numeric_limits` for 128-bit integers + (https://github.com/fmtlib/fmt/issues/1725). +- Fixed compatibility with CMake 3.4 + (https://github.com/fmtlib/fmt/issues/1779). +- Fixed handling of digit separators in locale-specific formatting + (https://github.com/fmtlib/fmt/issues/1782). # 7.0.1 - 2020-07-07 -- Updated the inline version namespace name. -- Worked around a gcc bug in mangling of alias templates - (https://github.com/fmtlib/fmt/issues/1753). -- Fixed a linkage error on Windows - (https://github.com/fmtlib/fmt/issues/1757). Thanks @Kurkin. -- Fixed minor issues with the documentation. +- Updated the inline version namespace name. +- Worked around a gcc bug in mangling of alias templates + (https://github.com/fmtlib/fmt/issues/1753). +- Fixed a linkage error on Windows + (https://github.com/fmtlib/fmt/issues/1757). Thanks @Kurkin. +- Fixed minor issues with the documentation. # 7.0.0 - 2020-07-05 -- 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). +- 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): +- Added a simpler and more efficient [format string compilation + API](https://fmt.dev/7.0.0/api.html#compile-api): - ```c++ - #include + ```c++ + #include - // Converts 42 into std::string using the most efficient method and no - // runtime format string processing. - std::string s = fmt::format(FMT_COMPILE("{}"), 42); - ``` + // 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. + 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 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, +- Optimized handling of small format strings. For example, - ```c++ - fmt::format("Result: {}: ({},{},{},{})", str1, str2, str3, str4, str5) - ``` + ```c++ + fmt::format("Result: {}: ({},{},{},{})", str1, str2, str3, str4, str5) + ``` - is now \~40% faster - (https://github.com/fmtlib/fmt/issues/1685). + is now \~40% faster + (https://github.com/fmtlib/fmt/issues/1685). -- Applied extern templates to improve compile times when using the - core API and `fmt/format.h` - (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`). +- Applied extern templates to improve compile times when using the + core API and `fmt/format.h` + (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`): + 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 + % 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`): + 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 + % 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): + 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 + % 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): + 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 + % 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 for the suggestion. + It is still recommended to use `fmt/core.h` instead of + `fmt/format.h` but the compile time difference is now smaller. + Thanks @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 +- Named arguments are now stored on stack (no dynamic memory + allocations) and the compiled code is more compact and efficient. + For example - ```c++ - #include + ```c++ + #include - int main() { - fmt::print("The answer is {answer}\n", fmt::arg("answer", 42)); - } - ``` + int main() { + fmt::print("The answer is {answer}\n", fmt::arg("answer", 42)); + } + ``` - compiles to just ([godbolt](https://godbolt.org/z/NcfEp_)) + compiles to just ([godbolt](https://godbolt.org/z/NcfEp_)) - ```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, - fmt::v6::format_args) - xor eax, eax - add rsp, 56 - ret + ```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, + fmt::v6::format_args) + xor eax, eax + add rsp, 56 + ret - .L.str.1: - .asciz "answer" - ``` + .L.str.1: + .asciz "answer" + ``` -- Implemented compile-time checks for dynamic width and precision - (https://github.com/fmtlib/fmt/issues/1614): +- Implemented compile-time checks for dynamic width and precision + (https://github.com/fmtlib/fmt/issues/1614): - ```c++ - #include + ```c++ + #include - int main() { - fmt::print(FMT_STRING("{0:{1}}"), 42); - } - ``` + int main() { + fmt::print(FMT_STRING("{0:{1}}"), 42); + } + ``` - now gives a compilation error because argument 1 doesn\'t exist: + 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"); + 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` - (https://github.com/fmtlib/fmt/pull/1689) +- Added sentinel support to `fmt::join` + (https://github.com/fmtlib/fmt/pull/1689) - ```c++ - struct zstring_sentinel {}; - bool operator==(const char* p, zstring_sentinel) { return *p == '\0'; } - bool operator!=(const char* p, zstring_sentinel) { return *p != '\0'; } + ```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 {}; } - }; + 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" - ``` + auto s = fmt::format("{}", fmt::join(zstring{"hello"}, "_")); + // s == "h_e_l_l_o" + ``` - Thanks @BRevzin. + Thanks @BRevzin. -- Added support for named arguments, `clear` and `reserve` to - `dynamic_format_arg_store` - (https://github.com/fmtlib/fmt/issues/1655, - https://github.com/fmtlib/fmt/pull/1663, - https://github.com/fmtlib/fmt/pull/1674, - https://github.com/fmtlib/fmt/pull/1677). Thanks @vsolontsov-ll. +- Added support for named arguments, `clear` and `reserve` to + `dynamic_format_arg_store` + (https://github.com/fmtlib/fmt/issues/1655, + https://github.com/fmtlib/fmt/pull/1663, + https://github.com/fmtlib/fmt/pull/1674, + https://github.com/fmtlib/fmt/pull/1677). Thanks @vsolontsov-ll. -- Added support for the `'c'` format specifier to integral types for - compatibility with `std::format` - (https://github.com/fmtlib/fmt/issues/1652). +- Added support for the `'c'` format specifier to integral types for + compatibility with `std::format` + (https://github.com/fmtlib/fmt/issues/1652). -- Replaced the `'n'` format specifier with `'L'` for compatibility - with `std::format` - (https://github.com/fmtlib/fmt/issues/1624). The `'n'` - specifier can be enabled via the `FMT_DEPRECATED_N_SPECIFIER` macro. +- Replaced the `'n'` format specifier with `'L'` for compatibility + with `std::format` + (https://github.com/fmtlib/fmt/issues/1624). The `'n'` + specifier can be enabled via the `FMT_DEPRECATED_N_SPECIFIER` macro. -- The `'='` format specifier is now disabled by default for - compatibility with `std::format`. It can be enabled via the - `FMT_DEPRECATED_NUMERIC_ALIGN` macro. +- 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: +- 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 + - `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` - (https://github.com/fmtlib/fmt/issues/1538). The former is - still provided as an alias if the `FMT_USE_INTERNAL` macro is - defined. +- Renamed the `internal` namespace to `detail` + (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 - (https://github.com/fmtlib/fmt/issues/1595, - https://github.com/fmtlib/fmt/pull/1682, - https://github.com/fmtlib/fmt/pull/1683, - https://github.com/fmtlib/fmt/pull/1687, - https://github.com/fmtlib/fmt/pull/1699). Thanks @rimathia. +- Improved compatibility between `fmt::printf` with the standard specs + (https://github.com/fmtlib/fmt/issues/1595, + https://github.com/fmtlib/fmt/pull/1682, + https://github.com/fmtlib/fmt/pull/1683, + https://github.com/fmtlib/fmt/pull/1687, + https://github.com/fmtlib/fmt/pull/1699). Thanks @rimathia. -- Fixed handling of `operator<<` overloads that use `copyfmt` - (https://github.com/fmtlib/fmt/issues/1666). +- Fixed handling of `operator<<` overloads that use `copyfmt` + (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 - (https://github.com/fmtlib/fmt/issues/1654, - https://github.com/fmtlib/fmt/pull/1656). Thanks @kwesolowski. +- Added the `FMT_OS` CMake option to control inclusion of OS-specific + APIs in the fmt target. This can be useful for embedded platforms + (https://github.com/fmtlib/fmt/issues/1654, + https://github.com/fmtlib/fmt/pull/1656). Thanks @kwesolowski. -- Replaced `FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION` with the - `FMT_FUZZ` macro to prevent interfering with fuzzing of projects - using {fmt} (https://github.com/fmtlib/fmt/pull/1650). - Thanks @asraa. +- Replaced `FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION` with the + `FMT_FUZZ` macro to prevent interfering with fuzzing of projects + using {fmt} (https://github.com/fmtlib/fmt/pull/1650). + Thanks @asraa. -- Fixed compatibility with emscripten - (https://github.com/fmtlib/fmt/issues/1636, - https://github.com/fmtlib/fmt/pull/1637). Thanks @ArthurSonzogni. +- Fixed compatibility with emscripten + (https://github.com/fmtlib/fmt/issues/1636, + https://github.com/fmtlib/fmt/pull/1637). Thanks @ArthurSonzogni. -- Improved documentation - (https://github.com/fmtlib/fmt/issues/704, - https://github.com/fmtlib/fmt/pull/1643, - https://github.com/fmtlib/fmt/pull/1660, - https://github.com/fmtlib/fmt/pull/1681, - https://github.com/fmtlib/fmt/pull/1691, - https://github.com/fmtlib/fmt/pull/1706, - https://github.com/fmtlib/fmt/pull/1714, - https://github.com/fmtlib/fmt/pull/1721, - https://github.com/fmtlib/fmt/pull/1739, - https://github.com/fmtlib/fmt/pull/1740, - https://github.com/fmtlib/fmt/pull/1741, - https://github.com/fmtlib/fmt/pull/1751). - Thanks @senior7515, @lsr0, @puetzk, @fpelliccioni, Alexey Kuzmenko, @jelly, - @claremacrae, @jiapengwen, @gsjaardema and @alexey-milovidov. +- Improved documentation + (https://github.com/fmtlib/fmt/issues/704, + https://github.com/fmtlib/fmt/pull/1643, + https://github.com/fmtlib/fmt/pull/1660, + https://github.com/fmtlib/fmt/pull/1681, + https://github.com/fmtlib/fmt/pull/1691, + https://github.com/fmtlib/fmt/pull/1706, + https://github.com/fmtlib/fmt/pull/1714, + https://github.com/fmtlib/fmt/pull/1721, + https://github.com/fmtlib/fmt/pull/1739, + https://github.com/fmtlib/fmt/pull/1740, + https://github.com/fmtlib/fmt/pull/1741, + https://github.com/fmtlib/fmt/pull/1751). + Thanks @senior7515, @lsr0, @puetzk, @fpelliccioni, Alexey Kuzmenko, @jelly, + @claremacrae, @jiapengwen, @gsjaardema and @alexey-milovidov. -- Implemented various build configuration fixes and improvements - (https://github.com/fmtlib/fmt/pull/1603, - https://github.com/fmtlib/fmt/pull/1657, - https://github.com/fmtlib/fmt/pull/1702, - https://github.com/fmtlib/fmt/pull/1728). - Thanks @scramsby, @jtojnar, @orivej and @flagarde. +- Implemented various build configuration fixes and improvements + (https://github.com/fmtlib/fmt/pull/1603, + https://github.com/fmtlib/fmt/pull/1657, + https://github.com/fmtlib/fmt/pull/1702, + https://github.com/fmtlib/fmt/pull/1728). + Thanks @scramsby, @jtojnar, @orivej and @flagarde. -- Fixed various warnings and compilation issues - (https://github.com/fmtlib/fmt/pull/1616, - https://github.com/fmtlib/fmt/issues/1620, - https://github.com/fmtlib/fmt/issues/1622, - https://github.com/fmtlib/fmt/issues/1625, - https://github.com/fmtlib/fmt/pull/1627, - https://github.com/fmtlib/fmt/issues/1628, - https://github.com/fmtlib/fmt/pull/1629, - https://github.com/fmtlib/fmt/issues/1631, - https://github.com/fmtlib/fmt/pull/1633, - https://github.com/fmtlib/fmt/pull/1649, - https://github.com/fmtlib/fmt/issues/1658, - https://github.com/fmtlib/fmt/pull/1661, - https://github.com/fmtlib/fmt/pull/1667, - https://github.com/fmtlib/fmt/issues/1668, - https://github.com/fmtlib/fmt/pull/1669, - https://github.com/fmtlib/fmt/issues/1692, - https://github.com/fmtlib/fmt/pull/1696, - https://github.com/fmtlib/fmt/pull/1697, - https://github.com/fmtlib/fmt/issues/1707, - https://github.com/fmtlib/fmt/pull/1712, - https://github.com/fmtlib/fmt/pull/1716, - https://github.com/fmtlib/fmt/pull/1722, - https://github.com/fmtlib/fmt/issues/1724, - https://github.com/fmtlib/fmt/pull/1729, - https://github.com/fmtlib/fmt/pull/1738, - https://github.com/fmtlib/fmt/issues/1742, - https://github.com/fmtlib/fmt/issues/1743, - https://github.com/fmtlib/fmt/pull/1744, - https://github.com/fmtlib/fmt/issues/1747, - https://github.com/fmtlib/fmt/pull/1750). - Thanks @gsjaardema, @gabime, @johnor, @Kurkin, @invexed, @peterbell10, - @daixtrose, @petrutlucian94, @Neargye, @ambitslix, @gabime, @erthink, - @tohammer and @0x8000-0000. +- Fixed various warnings and compilation issues + (https://github.com/fmtlib/fmt/pull/1616, + https://github.com/fmtlib/fmt/issues/1620, + https://github.com/fmtlib/fmt/issues/1622, + https://github.com/fmtlib/fmt/issues/1625, + https://github.com/fmtlib/fmt/pull/1627, + https://github.com/fmtlib/fmt/issues/1628, + https://github.com/fmtlib/fmt/pull/1629, + https://github.com/fmtlib/fmt/issues/1631, + https://github.com/fmtlib/fmt/pull/1633, + https://github.com/fmtlib/fmt/pull/1649, + https://github.com/fmtlib/fmt/issues/1658, + https://github.com/fmtlib/fmt/pull/1661, + https://github.com/fmtlib/fmt/pull/1667, + https://github.com/fmtlib/fmt/issues/1668, + https://github.com/fmtlib/fmt/pull/1669, + https://github.com/fmtlib/fmt/issues/1692, + https://github.com/fmtlib/fmt/pull/1696, + https://github.com/fmtlib/fmt/pull/1697, + https://github.com/fmtlib/fmt/issues/1707, + https://github.com/fmtlib/fmt/pull/1712, + https://github.com/fmtlib/fmt/pull/1716, + https://github.com/fmtlib/fmt/pull/1722, + https://github.com/fmtlib/fmt/issues/1724, + https://github.com/fmtlib/fmt/pull/1729, + https://github.com/fmtlib/fmt/pull/1738, + https://github.com/fmtlib/fmt/issues/1742, + https://github.com/fmtlib/fmt/issues/1743, + https://github.com/fmtlib/fmt/pull/1744, + https://github.com/fmtlib/fmt/issues/1747, + https://github.com/fmtlib/fmt/pull/1750). + Thanks @gsjaardema, @gabime, @johnor, @Kurkin, @invexed, @peterbell10, + @daixtrose, @petrutlucian94, @Neargye, @ambitslix, @gabime, @erthink, + @tohammer and @0x8000-0000. # 6.2.1 - 2020-05-09 -- Fixed ostream support in `sprintf` - (https://github.com/fmtlib/fmt/issues/1631). -- Fixed type detection when using implicit conversion to `string_view` - and ostream `operator<<` inconsistently - (https://github.com/fmtlib/fmt/issues/1662). +- Fixed ostream support in `sprintf` + (https://github.com/fmtlib/fmt/issues/1631). +- Fixed type detection when using implicit conversion to `string_view` + and ostream `operator<<` inconsistently + (https://github.com/fmtlib/fmt/issues/1662). # 6.2.0 - 2020-04-05 -- Improved error reporting when trying to format an object of a - non-formattable type: +- Improved error reporting when trying to format an object of a + non-formattable type: - ```c++ - fmt::format("{}", S()); - ``` + ```c++ + fmt::format("{}", S()); + ``` - now gives: + 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 specialization: - https://fmt.dev/latest/api.html#formatting-user-defined-types" - static_assert( - ^ - ... - note: in instantiation of function template specialization - 'fmt::v6::format' requested here - fmt::format("{}", S()); - ^ + 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 specialization: + https://fmt.dev/latest/api.html#formatting-user-defined-types" + static_assert( + ^ + ... + note: in instantiation of function template specialization + 'fmt::v6::format' requested here + fmt::format("{}", S()); + ^ - if `S` is not formattable. + if `S` is not formattable. -- Reduced the library size by \~10%. +- Reduced the library size by \~10%. -- Always print decimal point if `#` is specified - (https://github.com/fmtlib/fmt/issues/1476, - https://github.com/fmtlib/fmt/issues/1498): +- Always print decimal point if `#` is specified + (https://github.com/fmtlib/fmt/issues/1476, + https://github.com/fmtlib/fmt/issues/1498): - ```c++ - fmt::print("{:#.0f}", 42.0); - ``` + ```c++ + fmt::print("{:#.0f}", 42.0); + ``` - now prints `42.` + 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. +- 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. +- 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. +- Added precision overflow detection in floating-point formatting. -- Implemented detection of invalid use of `fmt::arg`. +- Implemented detection of invalid use of `fmt::arg`. -- Used `type_identity` to block unnecessary template argument - deduction. Thanks Tim Song. +- Used `type_identity` to block unnecessary template argument + deduction. Thanks Tim Song. -- Improved UTF-8 handling - (https://github.com/fmtlib/fmt/issues/1109): +- Improved UTF-8 handling + (https://github.com/fmtlib/fmt/issues/1109): - ```c++ - fmt::print("┌{0:─^{2}}┐\n" - "│{1: ^{2}}│\n" - "└{0:─^{2}}┘\n", "", "Привет, мир!", 20); - ``` + ```c++ + fmt::print("┌{0:─^{2}}┐\n" + "│{1: ^{2}}│\n" + "└{0:─^{2}}┘\n", "", "Привет, мир!", 20); + ``` - now prints: + now prints: - ┌────────────────────┐ - │ Привет, мир! │ - └────────────────────┘ + ┌────────────────────┐ + │ Привет, мир! │ + └────────────────────┘ - on systems that support Unicode. + on systems that support Unicode. -- Added experimental dynamic argument storage - (https://github.com/fmtlib/fmt/issues/1170, - https://github.com/fmtlib/fmt/pull/1584): +- Added experimental dynamic argument storage + (https://github.com/fmtlib/fmt/issues/1170, + https://github.com/fmtlib/fmt/pull/1584): - ```c++ - fmt::dynamic_format_arg_store store; - store.push_back("answer"); - store.push_back(42); - fmt::vprint("The {} is {}.\n", store); - ``` + ```c++ + fmt::dynamic_format_arg_store store; + store.push_back("answer"); + store.push_back(42); + fmt::vprint("The {} is {}.\n", store); + ``` - prints: + prints: - The answer is 42. + The answer is 42. - Thanks @vsolontsov-ll. + Thanks @vsolontsov-ll. -- Made `fmt::join` accept `initializer_list` - (https://github.com/fmtlib/fmt/pull/1591). Thanks @Rapotkinnik. +- Made `fmt::join` accept `initializer_list` + (https://github.com/fmtlib/fmt/pull/1591). Thanks @Rapotkinnik. -- Fixed handling of empty tuples - (https://github.com/fmtlib/fmt/issues/1588). +- Fixed handling of empty tuples + (https://github.com/fmtlib/fmt/issues/1588). -- Fixed handling of output iterators in `format_to_n` - (https://github.com/fmtlib/fmt/issues/1506). +- Fixed handling of output iterators in `format_to_n` + (https://github.com/fmtlib/fmt/issues/1506). -- Fixed formatting of `std::chrono::duration` types to wide output - (https://github.com/fmtlib/fmt/pull/1533). Thanks @zeffy. +- Fixed formatting of `std::chrono::duration` types to wide output + (https://github.com/fmtlib/fmt/pull/1533). Thanks @zeffy. -- Added const `begin` and `end` overload to buffers - (https://github.com/fmtlib/fmt/pull/1553). Thanks @dominicpoeschko. +- Added const `begin` and `end` overload to buffers + (https://github.com/fmtlib/fmt/pull/1553). Thanks @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 - (https://github.com/fmtlib/fmt/pull/1590). Thanks @albaguirre. +- 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 + (https://github.com/fmtlib/fmt/pull/1590). Thanks @albaguirre. -- Made `FMT_STRING` work with `constexpr` `string_view` - (https://github.com/fmtlib/fmt/pull/1589). Thanks @scramsby. +- Made `FMT_STRING` work with `constexpr` `string_view` + (https://github.com/fmtlib/fmt/pull/1589). Thanks @scramsby. -- Implemented a minor optimization in the format string parser - (https://github.com/fmtlib/fmt/pull/1560). Thanks @IkarusDeveloper. +- Implemented a minor optimization in the format string parser + (https://github.com/fmtlib/fmt/pull/1560). Thanks @IkarusDeveloper. -- Improved attribute detection - (https://github.com/fmtlib/fmt/pull/1469, - https://github.com/fmtlib/fmt/pull/1475, - https://github.com/fmtlib/fmt/pull/1576). - Thanks @federico-busato, @chronoxor and @refnum. +- Improved attribute detection + (https://github.com/fmtlib/fmt/pull/1469, + https://github.com/fmtlib/fmt/pull/1475, + https://github.com/fmtlib/fmt/pull/1576). + Thanks @federico-busato, @chronoxor and @refnum. -- Improved documentation - (https://github.com/fmtlib/fmt/pull/1481, - https://github.com/fmtlib/fmt/pull/1523). - Thanks @JackBoosY and @imba-tjd. +- Improved documentation + (https://github.com/fmtlib/fmt/pull/1481, + https://github.com/fmtlib/fmt/pull/1523). + Thanks @JackBoosY and @imba-tjd. -- Fixed symbol visibility on Linux when compiling with - `-fvisibility=hidden` - (https://github.com/fmtlib/fmt/pull/1535). Thanks @milianw. +- Fixed symbol visibility on Linux when compiling with + `-fvisibility=hidden` + (https://github.com/fmtlib/fmt/pull/1535). Thanks @milianw. -- Implemented various build configuration fixes and improvements - (https://github.com/fmtlib/fmt/issues/1264, - https://github.com/fmtlib/fmt/issues/1460, - https://github.com/fmtlib/fmt/pull/1534, - https://github.com/fmtlib/fmt/issues/1536, - https://github.com/fmtlib/fmt/issues/1545, - https://github.com/fmtlib/fmt/pull/1546, - https://github.com/fmtlib/fmt/issues/1566, - https://github.com/fmtlib/fmt/pull/1582, - https://github.com/fmtlib/fmt/issues/1597, - https://github.com/fmtlib/fmt/pull/1598). - Thanks @ambitslix, @jwillikers and @stac47. +- Implemented various build configuration fixes and improvements + (https://github.com/fmtlib/fmt/issues/1264, + https://github.com/fmtlib/fmt/issues/1460, + https://github.com/fmtlib/fmt/pull/1534, + https://github.com/fmtlib/fmt/issues/1536, + https://github.com/fmtlib/fmt/issues/1545, + https://github.com/fmtlib/fmt/pull/1546, + https://github.com/fmtlib/fmt/issues/1566, + https://github.com/fmtlib/fmt/pull/1582, + https://github.com/fmtlib/fmt/issues/1597, + https://github.com/fmtlib/fmt/pull/1598). + Thanks @ambitslix, @jwillikers and @stac47. -- Fixed various warnings and compilation issues - (https://github.com/fmtlib/fmt/pull/1433, - https://github.com/fmtlib/fmt/issues/1461, - https://github.com/fmtlib/fmt/pull/1470, - https://github.com/fmtlib/fmt/pull/1480, - https://github.com/fmtlib/fmt/pull/1485, - https://github.com/fmtlib/fmt/pull/1492, - https://github.com/fmtlib/fmt/issues/1493, - https://github.com/fmtlib/fmt/issues/1504, - https://github.com/fmtlib/fmt/pull/1505, - https://github.com/fmtlib/fmt/pull/1512, - https://github.com/fmtlib/fmt/issues/1515, - https://github.com/fmtlib/fmt/pull/1516, - https://github.com/fmtlib/fmt/pull/1518, - https://github.com/fmtlib/fmt/pull/1519, - https://github.com/fmtlib/fmt/pull/1520, - https://github.com/fmtlib/fmt/pull/1521, - https://github.com/fmtlib/fmt/pull/1522, - https://github.com/fmtlib/fmt/issues/1524, - https://github.com/fmtlib/fmt/pull/1530, - https://github.com/fmtlib/fmt/issues/1531, - https://github.com/fmtlib/fmt/pull/1532, - https://github.com/fmtlib/fmt/issues/1539, - https://github.com/fmtlib/fmt/issues/1547, - https://github.com/fmtlib/fmt/issues/1548, - https://github.com/fmtlib/fmt/pull/1554, - https://github.com/fmtlib/fmt/issues/1567, - https://github.com/fmtlib/fmt/pull/1568, - https://github.com/fmtlib/fmt/pull/1569, - https://github.com/fmtlib/fmt/pull/1571, - https://github.com/fmtlib/fmt/pull/1573, - https://github.com/fmtlib/fmt/pull/1575, - https://github.com/fmtlib/fmt/pull/1581, - https://github.com/fmtlib/fmt/issues/1583, - https://github.com/fmtlib/fmt/issues/1586, - https://github.com/fmtlib/fmt/issues/1587, - https://github.com/fmtlib/fmt/issues/1594, - https://github.com/fmtlib/fmt/pull/1596, - https://github.com/fmtlib/fmt/issues/1604, - https://github.com/fmtlib/fmt/pull/1606, - https://github.com/fmtlib/fmt/issues/1607, - https://github.com/fmtlib/fmt/issues/1609). - Thanks @marti4d, @iPherian, @parkertomatoes, @gsjaardema, @chronoxor, - @DanielaE, @torsten48, @tohammer, @lefticus, @ryusakki, @adnsv, @fghzxm, - @refnum, @pramodk, @Spirrwell and @scramsby. +- Fixed various warnings and compilation issues + (https://github.com/fmtlib/fmt/pull/1433, + https://github.com/fmtlib/fmt/issues/1461, + https://github.com/fmtlib/fmt/pull/1470, + https://github.com/fmtlib/fmt/pull/1480, + https://github.com/fmtlib/fmt/pull/1485, + https://github.com/fmtlib/fmt/pull/1492, + https://github.com/fmtlib/fmt/issues/1493, + https://github.com/fmtlib/fmt/issues/1504, + https://github.com/fmtlib/fmt/pull/1505, + https://github.com/fmtlib/fmt/pull/1512, + https://github.com/fmtlib/fmt/issues/1515, + https://github.com/fmtlib/fmt/pull/1516, + https://github.com/fmtlib/fmt/pull/1518, + https://github.com/fmtlib/fmt/pull/1519, + https://github.com/fmtlib/fmt/pull/1520, + https://github.com/fmtlib/fmt/pull/1521, + https://github.com/fmtlib/fmt/pull/1522, + https://github.com/fmtlib/fmt/issues/1524, + https://github.com/fmtlib/fmt/pull/1530, + https://github.com/fmtlib/fmt/issues/1531, + https://github.com/fmtlib/fmt/pull/1532, + https://github.com/fmtlib/fmt/issues/1539, + https://github.com/fmtlib/fmt/issues/1547, + https://github.com/fmtlib/fmt/issues/1548, + https://github.com/fmtlib/fmt/pull/1554, + https://github.com/fmtlib/fmt/issues/1567, + https://github.com/fmtlib/fmt/pull/1568, + https://github.com/fmtlib/fmt/pull/1569, + https://github.com/fmtlib/fmt/pull/1571, + https://github.com/fmtlib/fmt/pull/1573, + https://github.com/fmtlib/fmt/pull/1575, + https://github.com/fmtlib/fmt/pull/1581, + https://github.com/fmtlib/fmt/issues/1583, + https://github.com/fmtlib/fmt/issues/1586, + https://github.com/fmtlib/fmt/issues/1587, + https://github.com/fmtlib/fmt/issues/1594, + https://github.com/fmtlib/fmt/pull/1596, + https://github.com/fmtlib/fmt/issues/1604, + https://github.com/fmtlib/fmt/pull/1606, + https://github.com/fmtlib/fmt/issues/1607, + https://github.com/fmtlib/fmt/issues/1609). + Thanks @marti4d, @iPherian, @parkertomatoes, @gsjaardema, @chronoxor, + @DanielaE, @torsten48, @tohammer, @lefticus, @ryusakki, @adnsv, @fghzxm, + @refnum, @pramodk, @Spirrwell and @scramsby. # 6.1.2 - 2019-12-11 -- Fixed ABI compatibility with `libfmt.so.6.0.0` - (https://github.com/fmtlib/fmt/issues/1471). -- Fixed handling types convertible to `std::string_view` - (https://github.com/fmtlib/fmt/pull/1451). Thanks @denizevrenci. -- Made CUDA test an opt-in enabled via the `FMT_CUDA_TEST` CMake - option. -- Fixed sign conversion warnings - (https://github.com/fmtlib/fmt/pull/1440). Thanks @0x8000-0000. +- Fixed ABI compatibility with `libfmt.so.6.0.0` + (https://github.com/fmtlib/fmt/issues/1471). +- Fixed handling types convertible to `std::string_view` + (https://github.com/fmtlib/fmt/pull/1451). Thanks @denizevrenci. +- Made CUDA test an opt-in enabled via the `FMT_CUDA_TEST` CMake + option. +- Fixed sign conversion warnings + (https://github.com/fmtlib/fmt/pull/1440). Thanks @0x8000-0000. # 6.1.1 - 2019-12-04 -- Fixed shared library build on Windows - (https://github.com/fmtlib/fmt/pull/1443, - https://github.com/fmtlib/fmt/issues/1445, - https://github.com/fmtlib/fmt/pull/1446, - https://github.com/fmtlib/fmt/issues/1450). - Thanks @egorpugin and @bbolli. -- Added a missing decimal point in exponent notation with trailing - zeros. -- Removed deprecated `format_arg_store::TYPES`. +- Fixed shared library build on Windows + (https://github.com/fmtlib/fmt/pull/1443, + https://github.com/fmtlib/fmt/issues/1445, + https://github.com/fmtlib/fmt/pull/1446, + https://github.com/fmtlib/fmt/issues/1450). + Thanks @egorpugin and @bbolli. +- Added a missing decimal point in exponent notation with trailing + zeros. +- Removed deprecated `format_arg_store::TYPES`. # 6.1.0 - 2019-12-01 -- {fmt} now formats IEEE 754 `float` and `double` using the shortest - decimal representation with correct rounding by default: +- {fmt} now formats IEEE 754 `float` and `double` using the shortest + decimal representation with correct rounding by default: - ```c++ - #include - #include + ```c++ + #include + #include - int main() { - fmt::print("{}", M_PI); - } - ``` + int main() { + fmt::print("{}", M_PI); + } + ``` - prints `3.141592653589793`. + prints `3.141592653589793`. -- 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): +- 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 | + | 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 | - ![](https://user-images.githubusercontent.com/576385/69767160-cdaca400-112f-11ea-9fc5-347c9f83caad.png) + ![](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 - (https://github.com/fmtlib/fmt/issues/1336, - https://github.com/fmtlib/fmt/issues/1353, - https://github.com/fmtlib/fmt/pull/1360, - https://github.com/fmtlib/fmt/pull/1361): +- {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 + (https://github.com/fmtlib/fmt/issues/1336, + https://github.com/fmtlib/fmt/issues/1353, + https://github.com/fmtlib/fmt/pull/1360, + https://github.com/fmtlib/fmt/pull/1361): - ```c++ - fmt::print("{}", 0.1f); - ``` + ```c++ + fmt::print("{}", 0.1f); + ``` - prints `0.1` instead of `0.10000000149011612`. + prints `0.1` instead of `0.10000000149011612`. - Thanks @orivej. + Thanks @orivej. -- Made floating-point formatting output consistent with - `printf`/iostreams - (https://github.com/fmtlib/fmt/issues/1376, - https://github.com/fmtlib/fmt/issues/1417). +- Made floating-point formatting output consistent with + `printf`/iostreams + (https://github.com/fmtlib/fmt/issues/1376, + https://github.com/fmtlib/fmt/issues/1417). -- Added support for 128-bit integers - (https://github.com/fmtlib/fmt/pull/1287): +- Added support for 128-bit integers + (https://github.com/fmtlib/fmt/pull/1287): - ```c++ - fmt::print("{}", std::numeric_limits<__int128_t>::max()); - ``` + ```c++ + fmt::print("{}", std::numeric_limits<__int128_t>::max()); + ``` - prints `170141183460469231731687303715884105727`. + prints `170141183460469231731687303715884105727`. - Thanks @denizevrenci. + Thanks @denizevrenci. -- The overload of `print` that takes `text_style` is now atomic, i.e. - the output from different threads doesn\'t interleave - (https://github.com/fmtlib/fmt/pull/1351). Thanks @tankiJong. +- The overload of `print` that takes `text_style` is now atomic, i.e. + the output from different threads doesn\'t interleave + (https://github.com/fmtlib/fmt/pull/1351). Thanks @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`. +- 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 - (https://github.com/fmtlib/fmt/issues/1322, - https://github.com/fmtlib/fmt/pull/1330): +- Added an overload of `fmt::join` that works with tuples + (https://github.com/fmtlib/fmt/issues/1322, + https://github.com/fmtlib/fmt/pull/1330): - ```c++ - #include - #include + ```c++ + #include + #include - int main() { - std::tuple t{'a', 1, 2.0f}; - fmt::print("{}", t); - } - ``` + int main() { + std::tuple t{'a', 1, 2.0f}; + fmt::print("{}", t); + } + ``` - prints `('a', 1, 2.0)`. + prints `('a', 1, 2.0)`. - Thanks @jeremyong. + Thanks @jeremyong. -- Changed formatting of octal zero with prefix from \"00\" to \"0\": +- Changed formatting of octal zero with prefix from \"00\" to \"0\": - ```c++ - fmt::print("{:#o}", 0); - ``` + ```c++ + fmt::print("{:#o}", 0); + ``` - prints `0`. + prints `0`. -- The locale is now passed to ostream insertion (`<<`) operators - (https://github.com/fmtlib/fmt/pull/1406): +- The locale is now passed to ostream insertion (`<<`) operators + (https://github.com/fmtlib/fmt/pull/1406): - ```c++ - #include - #include + ```c++ + #include + #include - struct S { - double value; - }; + struct S { + double value; + }; - std::ostream& operator<<(std::ostream& os, S s) { - return os << s.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" - } - ``` + int main() { + auto s = fmt::format(std::locale("fr_FR.UTF-8"), "{}", S{0.42}); + // s == "0,42" + } + ``` - Thanks @dlaugt. + Thanks @dlaugt. -- Locale-specific number formatting now uses grouping - (https://github.com/fmtlib/fmt/issues/1393, - https://github.com/fmtlib/fmt/pull/1394). Thanks @skrdaniel. +- Locale-specific number formatting now uses grouping + (https://github.com/fmtlib/fmt/issues/1393, + https://github.com/fmtlib/fmt/pull/1394). Thanks @skrdaniel. -- Fixed handling of types with deleted implicit rvalue conversion to - `const char**` (https://github.com/fmtlib/fmt/issues/1421): +- Fixed handling of types with deleted implicit rvalue conversion to + `const char**` (https://github.com/fmtlib/fmt/issues/1421): - ```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 - ``` + ```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` - (https://github.com/fmtlib/fmt/pull/1286). Thanks @agmt. +- Enums are now mapped to correct underlying types instead of `int` + (https://github.com/fmtlib/fmt/pull/1286). Thanks @agmt. -- Enum classes are no longer implicitly converted to `int` - (https://github.com/fmtlib/fmt/issues/1424). +- Enum classes are no longer implicitly converted to `int` + (https://github.com/fmtlib/fmt/issues/1424). -- Added `basic_format_parse_context` for consistency with C++20 - `std::format` and deprecated `basic_parse_context`. +- Added `basic_format_parse_context` for consistency with C++20 + `std::format` and deprecated `basic_parse_context`. -- Fixed handling of UTF-8 in precision - (https://github.com/fmtlib/fmt/issues/1389, - https://github.com/fmtlib/fmt/pull/1390). Thanks @tajtiattila. +- Fixed handling of UTF-8 in precision + (https://github.com/fmtlib/fmt/issues/1389, + https://github.com/fmtlib/fmt/pull/1390). Thanks @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) - (https://github.com/fmtlib/fmt/pull/1410): +- {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) + (https://github.com/fmtlib/fmt/pull/1410): - conda install -c conda-forge fmt + conda install -c conda-forge fmt - Thanks @tdegeus. + Thanks @tdegeus. -- Added a CUDA test (https://github.com/fmtlib/fmt/pull/1285, - https://github.com/fmtlib/fmt/pull/1317). - Thanks @luncliff and @risa2000. +- Added a CUDA test (https://github.com/fmtlib/fmt/pull/1285, + https://github.com/fmtlib/fmt/pull/1317). + Thanks @luncliff and @risa2000. -- Improved documentation - (https://github.com/fmtlib/fmt/pull/1276, - https://github.com/fmtlib/fmt/issues/1291, - https://github.com/fmtlib/fmt/issues/1296, - https://github.com/fmtlib/fmt/pull/1315, - https://github.com/fmtlib/fmt/pull/1332, - https://github.com/fmtlib/fmt/pull/1337, - https://github.com/fmtlib/fmt/issues/1395 - https://github.com/fmtlib/fmt/pull/1418). - Thanks @waywardmonkeys, @pauldreik and @jackoalan. +- Improved documentation + (https://github.com/fmtlib/fmt/pull/1276, + https://github.com/fmtlib/fmt/issues/1291, + https://github.com/fmtlib/fmt/issues/1296, + https://github.com/fmtlib/fmt/pull/1315, + https://github.com/fmtlib/fmt/pull/1332, + https://github.com/fmtlib/fmt/pull/1337, + https://github.com/fmtlib/fmt/issues/1395 + https://github.com/fmtlib/fmt/pull/1418). + Thanks @waywardmonkeys, @pauldreik and @jackoalan. -- Various code improvements - (https://github.com/fmtlib/fmt/pull/1358, - https://github.com/fmtlib/fmt/pull/1407). - Thanks @orivej and @dpacbach. +- Various code improvements + (https://github.com/fmtlib/fmt/pull/1358, + https://github.com/fmtlib/fmt/pull/1407). + Thanks @orivej and @dpacbach. -- Fixed compile-time format string checks for user-defined types - (https://github.com/fmtlib/fmt/issues/1292). +- Fixed compile-time format string checks for user-defined types + (https://github.com/fmtlib/fmt/issues/1292). -- Worked around a false positive in `unsigned-integer-overflow` sanitizer - (https://github.com/fmtlib/fmt/issues/1377). +- Worked around a false positive in `unsigned-integer-overflow` sanitizer + (https://github.com/fmtlib/fmt/issues/1377). -- Fixed various warnings and compilation issues - (https://github.com/fmtlib/fmt/issues/1273, - https://github.com/fmtlib/fmt/pull/1278, - https://github.com/fmtlib/fmt/pull/1280, - https://github.com/fmtlib/fmt/issues/1281, - https://github.com/fmtlib/fmt/issues/1288, - https://github.com/fmtlib/fmt/pull/1290, - https://github.com/fmtlib/fmt/pull/1301, - https://github.com/fmtlib/fmt/issues/1305, - https://github.com/fmtlib/fmt/issues/1306, - https://github.com/fmtlib/fmt/issues/1309, - https://github.com/fmtlib/fmt/pull/1312, - https://github.com/fmtlib/fmt/issues/1313, - https://github.com/fmtlib/fmt/issues/1316, - https://github.com/fmtlib/fmt/issues/1319, - https://github.com/fmtlib/fmt/pull/1320, - https://github.com/fmtlib/fmt/pull/1326, - https://github.com/fmtlib/fmt/pull/1328, - https://github.com/fmtlib/fmt/issues/1344, - https://github.com/fmtlib/fmt/pull/1345, - https://github.com/fmtlib/fmt/pull/1347, - https://github.com/fmtlib/fmt/pull/1349, - https://github.com/fmtlib/fmt/issues/1354, - https://github.com/fmtlib/fmt/issues/1362, - https://github.com/fmtlib/fmt/issues/1366, - https://github.com/fmtlib/fmt/pull/1364, - https://github.com/fmtlib/fmt/pull/1370, - https://github.com/fmtlib/fmt/pull/1371, - https://github.com/fmtlib/fmt/issues/1385, - https://github.com/fmtlib/fmt/issues/1388, - https://github.com/fmtlib/fmt/pull/1397, - https://github.com/fmtlib/fmt/pull/1414, - https://github.com/fmtlib/fmt/pull/1416, - https://github.com/fmtlib/fmt/issues/1422 - https://github.com/fmtlib/fmt/pull/1427, - https://github.com/fmtlib/fmt/issues/1431, - https://github.com/fmtlib/fmt/pull/1433). - Thanks @hhb, @gsjaardema, @gabime, @neheb, @vedranmiletic, @dkavolis, - @mwinterb, @orivej, @denizevrenci, @leonklingele, @chronoxor, @kent-tri, - @0x8000-0000 and @marti4d. +- Fixed various warnings and compilation issues + (https://github.com/fmtlib/fmt/issues/1273, + https://github.com/fmtlib/fmt/pull/1278, + https://github.com/fmtlib/fmt/pull/1280, + https://github.com/fmtlib/fmt/issues/1281, + https://github.com/fmtlib/fmt/issues/1288, + https://github.com/fmtlib/fmt/pull/1290, + https://github.com/fmtlib/fmt/pull/1301, + https://github.com/fmtlib/fmt/issues/1305, + https://github.com/fmtlib/fmt/issues/1306, + https://github.com/fmtlib/fmt/issues/1309, + https://github.com/fmtlib/fmt/pull/1312, + https://github.com/fmtlib/fmt/issues/1313, + https://github.com/fmtlib/fmt/issues/1316, + https://github.com/fmtlib/fmt/issues/1319, + https://github.com/fmtlib/fmt/pull/1320, + https://github.com/fmtlib/fmt/pull/1326, + https://github.com/fmtlib/fmt/pull/1328, + https://github.com/fmtlib/fmt/issues/1344, + https://github.com/fmtlib/fmt/pull/1345, + https://github.com/fmtlib/fmt/pull/1347, + https://github.com/fmtlib/fmt/pull/1349, + https://github.com/fmtlib/fmt/issues/1354, + https://github.com/fmtlib/fmt/issues/1362, + https://github.com/fmtlib/fmt/issues/1366, + https://github.com/fmtlib/fmt/pull/1364, + https://github.com/fmtlib/fmt/pull/1370, + https://github.com/fmtlib/fmt/pull/1371, + https://github.com/fmtlib/fmt/issues/1385, + https://github.com/fmtlib/fmt/issues/1388, + https://github.com/fmtlib/fmt/pull/1397, + https://github.com/fmtlib/fmt/pull/1414, + https://github.com/fmtlib/fmt/pull/1416, + https://github.com/fmtlib/fmt/issues/1422 + https://github.com/fmtlib/fmt/pull/1427, + https://github.com/fmtlib/fmt/issues/1431, + https://github.com/fmtlib/fmt/pull/1433). + Thanks @hhb, @gsjaardema, @gabime, @neheb, @vedranmiletic, @dkavolis, + @mwinterb, @orivej, @denizevrenci, @leonklingele, @chronoxor, @kent-tri, + @0x8000-0000 and @marti4d. # 6.0.0 - 2019-08-26 -- 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. +- 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. -- Floating-point formatting is now locale-independent by default: +- Floating-point formatting is now locale-independent by default: - ```c++ - #include - #include + ```c++ + #include + #include - 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: - - ```c++ + int main() { std::locale::global(std::locale("ru_RU.UTF-8")); - fmt::print("value = {:n}", 4.2); - ``` + fmt::print("value = {}", 4.2); + } + ``` - prints \"value = 4,2\". + prints \"value = 4.2\" regardless of the locale. -- 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: + For locale-specific formatting use the `n` specifier: - ```c++ - #define FMT_USE_GRISU 1 - #include + ```c++ + std::locale::global(std::locale("ru_RU.UTF-8")); + fmt::print("value = {:n}", 4.2); + ``` - auto s = fmt::format("{}", 4.2); // formats 4.2 using Grisu - ``` + prints \"value = 4,2\". - 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)): +- 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: - ![](https://user-images.githubusercontent.com/576385/54883977-9fe8c000-4e28-11e9-8bde-272d122e7c52.jpg) + ```c++ + #define FMT_USE_GRISU 1 + #include -- 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. + auto s = fmt::format("{}", 4.2); // formats 4.2 using Grisu + ``` -- Added [oss-fuzz](https://github.com/google/oss-fuzz) support - (https://github.com/fmtlib/fmt/pull/1199). Thanks @pauldreik. + 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)): -- `formatter` specializations now always take precedence over - `operator<<` (https://github.com/fmtlib/fmt/issues/952): + ![](https://user-images.githubusercontent.com/576385/54883977-9fe8c000-4e28-11e9-8bde-272d122e7c52.jpg) - ```c++ - #include - #include +- 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. - struct S {}; +- Added [oss-fuzz](https://github.com/google/oss-fuzz) support + (https://github.com/fmtlib/fmt/pull/1199). Thanks @pauldreik. - std::ostream& operator<<(std::ostream& os, S) { - return os << 1; +- `formatter` specializations now always take precedence over + `operator<<` (https://github.com/fmtlib/fmt/issues/952): + + ```c++ + #include + #include + + struct S {}; + + std::ostream& operator<<(std::ostream& os, S) { + return os << 1; + } + + template <> + struct fmt::formatter : fmt::formatter { + auto format(S, format_context& ctx) { + return formatter::format(2, ctx); } + }; - template <> - struct fmt::formatter : fmt::formatter { - auto format(S, format_context& ctx) { - return formatter::format(2, ctx); - } - }; + int main() { + std::cout << S() << "\n"; // prints 1 using operator<< + fmt::print("{}\n", S()); // prints 2 using formatter + } + ``` - 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 + (https://github.com/fmtlib/fmt/issues/618, + https://github.com/fmtlib/fmt/issues/1169, + https://github.com/fmtlib/fmt/pull/1171): -- Introduced the experimental `fmt::compile` function that does format - string compilation - (https://github.com/fmtlib/fmt/issues/618, - https://github.com/fmtlib/fmt/issues/1169, - https://github.com/fmtlib/fmt/pull/1171): + ```c++ + #include - ```c++ - #include + auto f = fmt::compile("{}"); + std::string s = fmt::format(f, 42); // can be called multiple times to + // format different values + // s == "42" + ``` - auto f = fmt::compile("{}"); - 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. - 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. +- Added experimental `%` format specifier that formats floating-point + values as percentages + (https://github.com/fmtlib/fmt/pull/1060, + https://github.com/fmtlib/fmt/pull/1069, + https://github.com/fmtlib/fmt/pull/1071): -- Added experimental `%` format specifier that formats floating-point - values as percentages - (https://github.com/fmtlib/fmt/pull/1060, - https://github.com/fmtlib/fmt/pull/1069, - https://github.com/fmtlib/fmt/pull/1071): + ```c++ + auto s = fmt::format("{:.1%}", 0.42); // s == "42.0%" + ``` - ```c++ - auto s = fmt::format("{:.1%}", 0.42); // s == "42.0%" - ``` + Thanks @gawain-bolton. - Thanks @gawain-bolton. +- Implemented precision for floating-point durations + (https://github.com/fmtlib/fmt/issues/1004, + https://github.com/fmtlib/fmt/pull/1012): -- Implemented precision for floating-point durations - (https://github.com/fmtlib/fmt/issues/1004, - https://github.com/fmtlib/fmt/pull/1012): + ```c++ + auto s = fmt::format("{:.1}", std::chrono::duration(1.234)); + // s == 1.2s + ``` - ```c++ - auto s = fmt::format("{:.1}", std::chrono::duration(1.234)); - // s == 1.2s - ``` + Thanks @DanielaE. - Thanks @DanielaE. +- Implemented `chrono` format specifiers `%Q` and `%q` that give the + value and the unit respectively + (https://github.com/fmtlib/fmt/pull/1019): -- Implemented `chrono` format specifiers `%Q` and `%q` that give the - value and the unit respectively - (https://github.com/fmtlib/fmt/pull/1019): + ```c++ + auto value = fmt::format("{:%Q}", 42s); // value == "42" + auto unit = fmt::format("{:%q}", 42s); // unit == "s" + ``` - ```c++ - auto value = fmt::format("{:%Q}", 42s); // value == "42" - auto unit = fmt::format("{:%q}", 42s); // unit == "s" - ``` + Thanks @DanielaE. - Thanks @DanielaE. +- Fixed handling of dynamic width in chrono formatter: -- Fixed handling of dynamic width in chrono formatter: + ```c++ + auto s = fmt::format("{0:{1}%H:%M:%S}", std::chrono::seconds(12345), 12); + // ^ width argument index ^ width + // s == "03:25:45 " + ``` - ```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. - Thanks Howard Hinnant. +- Removed deprecated `fmt/time.h`. Use `fmt/chrono.h` instead. -- Removed deprecated `fmt/time.h`. Use `fmt/chrono.h` instead. +- Added `fmt::format` and `fmt::vformat` overloads that take + `text_style` (https://github.com/fmtlib/fmt/issues/993, + https://github.com/fmtlib/fmt/pull/994): -- Added `fmt::format` and `fmt::vformat` overloads that take - `text_style` (https://github.com/fmtlib/fmt/issues/993, - https://github.com/fmtlib/fmt/pull/994): + ```c++ + #include - ```c++ - #include + std::string message = fmt::format(fmt::emphasis::bold | fg(fmt::color::red), + "The answer is {}.", 42); + ``` - std::string message = fmt::format(fmt::emphasis::bold | fg(fmt::color::red), - "The answer is {}.", 42); - ``` + Thanks @Naios. - Thanks @Naios. +- Removed the deprecated color API (`print_colored`). Use the new API, + namely `print` overloads that take `text_style` instead. -- 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` (https://github.com/fmtlib/fmt/pull/1121): -- Made `std::unique_ptr` and `std::shared_ptr` formattable as pointers - via `fmt::ptr` (https://github.com/fmtlib/fmt/pull/1121): + ```c++ + std::unique_ptr p = ...; + fmt::print("{}", fmt::ptr(p)); // prints p as a pointer + ``` - ```c++ - std::unique_ptr p = ...; - fmt::print("{}", fmt::ptr(p)); // prints p as a pointer - ``` + Thanks @sighingnow. - Thanks @sighingnow. +- Made `print` and `vprint` report I/O errors + (https://github.com/fmtlib/fmt/issues/1098, + https://github.com/fmtlib/fmt/pull/1099). Thanks @BillyDonahue. -- Made `print` and `vprint` report I/O errors - (https://github.com/fmtlib/fmt/issues/1098, - https://github.com/fmtlib/fmt/pull/1099). Thanks @BillyDonahue. +- Marked deprecated APIs with the `[[deprecated]]` attribute and + removed internal uses of deprecated APIs + (https://github.com/fmtlib/fmt/pull/1022). Thanks @eliaskosunen. -- Marked deprecated APIs with the `[[deprecated]]` attribute and - removed internal uses of deprecated APIs - (https://github.com/fmtlib/fmt/pull/1022). Thanks @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` instead of + `buffer_context::type`. These features require GCC 4.8 or later. -- Modernized the codebase using more C++11 features and removing - workarounds. Most importantly, `buffer_context` is now an alias - template, so use `buffer_context` instead of - `buffer_context::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. -- `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. -- Moved the undocumented `basic_writer`, `writer`, and `wwriter` types - to the `internal` namespace. +- Removed deprecated `basic_format_context::begin()`. Use `out()` + instead. -- Removed deprecated `basic_format_context::begin()`. Use `out()` - instead. +- Disallowed passing the result of `join` as an lvalue to prevent + misuse. -- 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. -- 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. -- 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 + (https://github.com/fmtlib/fmt/issues/1229, + https://github.com/fmtlib/fmt/pull/1243). Thanks @jackoalan. -- Switched to `fputws` for writing wide strings so that it\'s no - longer required to call `_setmode` on Windows - (https://github.com/fmtlib/fmt/issues/1229, - https://github.com/fmtlib/fmt/pull/1243). Thanks @jackoalan. +- Improved literal-based API + (https://github.com/fmtlib/fmt/pull/1254). Thanks @sylveon. -- Improved literal-based API - (https://github.com/fmtlib/fmt/pull/1254). Thanks @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 + (https://github.com/fmtlib/fmt/issues/1059). -- Added support for exotic platforms without `uintptr_t` such as IBM i - (AS/400) which has 128-bit pointers and only 64-bit integers - (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) + (https://github.com/fmtlib/fmt/issues/1037). Thanks @Kronuz. -- Added [Sublime Text syntax highlighting config]( - https://github.com/fmtlib/fmt/blob/master/support/C%2B%2B.sublime-syntax) - (https://github.com/fmtlib/fmt/issues/1037). Thanks @Kronuz. +- Added the `FMT_ENFORCE_COMPILE_STRING` macro to enforce the use of + compile-time format strings + (https://github.com/fmtlib/fmt/pull/1231). Thanks @jackoalan. -- Added the `FMT_ENFORCE_COMPILE_STRING` macro to enforce the use of - compile-time format strings - (https://github.com/fmtlib/fmt/pull/1231). Thanks @jackoalan. +- Stopped setting `CMAKE_BUILD_TYPE` if {fmt} is a subproject + (https://github.com/fmtlib/fmt/issues/1081). -- Stopped setting `CMAKE_BUILD_TYPE` if {fmt} is a subproject - (https://github.com/fmtlib/fmt/issues/1081). +- Various build improvements + (https://github.com/fmtlib/fmt/pull/1039, + https://github.com/fmtlib/fmt/pull/1078, + https://github.com/fmtlib/fmt/pull/1091, + https://github.com/fmtlib/fmt/pull/1103, + https://github.com/fmtlib/fmt/pull/1177). + Thanks @luncliff, @jasonszang, @olafhering, @Lecetem and @pauldreik. -- Various build improvements - (https://github.com/fmtlib/fmt/pull/1039, - https://github.com/fmtlib/fmt/pull/1078, - https://github.com/fmtlib/fmt/pull/1091, - https://github.com/fmtlib/fmt/pull/1103, - https://github.com/fmtlib/fmt/pull/1177). - Thanks @luncliff, @jasonszang, @olafhering, @Lecetem and @pauldreik. +- Improved documentation + (https://github.com/fmtlib/fmt/issues/1049, + https://github.com/fmtlib/fmt/pull/1051, + https://github.com/fmtlib/fmt/pull/1083, + https://github.com/fmtlib/fmt/pull/1113, + https://github.com/fmtlib/fmt/pull/1114, + https://github.com/fmtlib/fmt/issues/1146, + https://github.com/fmtlib/fmt/issues/1180, + https://github.com/fmtlib/fmt/pull/1250, + https://github.com/fmtlib/fmt/pull/1252, + https://github.com/fmtlib/fmt/pull/1265). + Thanks @mikelui, @foonathan, @BillyDonahue, @jwakely, @kaisbe and + @sdebionne. -- Improved documentation - (https://github.com/fmtlib/fmt/issues/1049, - https://github.com/fmtlib/fmt/pull/1051, - https://github.com/fmtlib/fmt/pull/1083, - https://github.com/fmtlib/fmt/pull/1113, - https://github.com/fmtlib/fmt/pull/1114, - https://github.com/fmtlib/fmt/issues/1146, - https://github.com/fmtlib/fmt/issues/1180, - https://github.com/fmtlib/fmt/pull/1250, - https://github.com/fmtlib/fmt/pull/1252, - https://github.com/fmtlib/fmt/pull/1265). - Thanks @mikelui, @foonathan, @BillyDonahue, @jwakely, @kaisbe and - @sdebionne. +- Fixed ambiguous formatter specialization in `fmt/ranges.h` + (https://github.com/fmtlib/fmt/issues/1123). -- Fixed ambiguous formatter specialization in `fmt/ranges.h` - (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 + (https://github.com/fmtlib/fmt/issues/1268). -- Fixed formatting of a non-empty `std::filesystem::path` which is an - infinitely deep range of its components - (https://github.com/fmtlib/fmt/issues/1268). +- Fixed handling of general output iterators when formatting + characters (https://github.com/fmtlib/fmt/issues/1056, + https://github.com/fmtlib/fmt/pull/1058). Thanks @abolz. -- Fixed handling of general output iterators when formatting - characters (https://github.com/fmtlib/fmt/issues/1056, - https://github.com/fmtlib/fmt/pull/1058). Thanks @abolz. +- Fixed handling of output iterators in `formatter` specialization for + ranges (https://github.com/fmtlib/fmt/issues/1064). -- Fixed handling of output iterators in `formatter` specialization for - ranges (https://github.com/fmtlib/fmt/issues/1064). +- Fixed handling of exotic character types + (https://github.com/fmtlib/fmt/issues/1188). -- Fixed handling of exotic character types - (https://github.com/fmtlib/fmt/issues/1188). +- Made chrono formatting work with exceptions disabled + (https://github.com/fmtlib/fmt/issues/1062). -- Made chrono formatting work with exceptions disabled - (https://github.com/fmtlib/fmt/issues/1062). +- Fixed DLL visibility issues + (https://github.com/fmtlib/fmt/pull/1134, + https://github.com/fmtlib/fmt/pull/1147). Thanks @denchat. -- Fixed DLL visibility issues - (https://github.com/fmtlib/fmt/pull/1134, - https://github.com/fmtlib/fmt/pull/1147). Thanks @denchat. +- Disabled the use of UDL template extension on GCC 9 + (https://github.com/fmtlib/fmt/issues/1148). -- Disabled the use of UDL template extension on GCC 9 - (https://github.com/fmtlib/fmt/issues/1148). +- Removed misplaced `format` compile-time checks from `printf` + (https://github.com/fmtlib/fmt/issues/1173). -- Removed misplaced `format` compile-time checks from `printf` - (https://github.com/fmtlib/fmt/issues/1173). +- Fixed issues in the experimental floating-point formatter + (https://github.com/fmtlib/fmt/issues/1072, + https://github.com/fmtlib/fmt/issues/1129, + https://github.com/fmtlib/fmt/issues/1153, + https://github.com/fmtlib/fmt/pull/1155, + https://github.com/fmtlib/fmt/issues/1210, + https://github.com/fmtlib/fmt/issues/1222). Thanks @alabuzhev. -- Fixed issues in the experimental floating-point formatter - (https://github.com/fmtlib/fmt/issues/1072, - https://github.com/fmtlib/fmt/issues/1129, - https://github.com/fmtlib/fmt/issues/1153, - https://github.com/fmtlib/fmt/pull/1155, - https://github.com/fmtlib/fmt/issues/1210, - https://github.com/fmtlib/fmt/issues/1222). Thanks @alabuzhev. +- Fixed bugs discovered by fuzzing or during fuzzing integration + (https://github.com/fmtlib/fmt/issues/1124, + https://github.com/fmtlib/fmt/issues/1127, + https://github.com/fmtlib/fmt/issues/1132, + https://github.com/fmtlib/fmt/pull/1135, + https://github.com/fmtlib/fmt/issues/1136, + https://github.com/fmtlib/fmt/issues/1141, + https://github.com/fmtlib/fmt/issues/1142, + https://github.com/fmtlib/fmt/issues/1178, + https://github.com/fmtlib/fmt/issues/1179, + https://github.com/fmtlib/fmt/issues/1194). Thanks @pauldreik. -- Fixed bugs discovered by fuzzing or during fuzzing integration - (https://github.com/fmtlib/fmt/issues/1124, - https://github.com/fmtlib/fmt/issues/1127, - https://github.com/fmtlib/fmt/issues/1132, - https://github.com/fmtlib/fmt/pull/1135, - https://github.com/fmtlib/fmt/issues/1136, - https://github.com/fmtlib/fmt/issues/1141, - https://github.com/fmtlib/fmt/issues/1142, - https://github.com/fmtlib/fmt/issues/1178, - https://github.com/fmtlib/fmt/issues/1179, - https://github.com/fmtlib/fmt/issues/1194). Thanks @pauldreik. +- Fixed building tests on FreeBSD and Hurd + (https://github.com/fmtlib/fmt/issues/1043). Thanks @jackyf. -- Fixed building tests on FreeBSD and Hurd - (https://github.com/fmtlib/fmt/issues/1043). Thanks @jackyf. - -- Fixed various warnings and compilation issues - (https://github.com/fmtlib/fmt/pull/998, - https://github.com/fmtlib/fmt/pull/1006, - https://github.com/fmtlib/fmt/issues/1008, - https://github.com/fmtlib/fmt/issues/1011, - https://github.com/fmtlib/fmt/issues/1025, - https://github.com/fmtlib/fmt/pull/1027, - https://github.com/fmtlib/fmt/pull/1028, - https://github.com/fmtlib/fmt/pull/1029, - https://github.com/fmtlib/fmt/pull/1030, - https://github.com/fmtlib/fmt/pull/1031, - https://github.com/fmtlib/fmt/pull/1054, - https://github.com/fmtlib/fmt/issues/1063, - https://github.com/fmtlib/fmt/pull/1068, - https://github.com/fmtlib/fmt/pull/1074, - https://github.com/fmtlib/fmt/pull/1075, - https://github.com/fmtlib/fmt/pull/1079, - https://github.com/fmtlib/fmt/pull/1086, - https://github.com/fmtlib/fmt/issues/1088, - https://github.com/fmtlib/fmt/pull/1089, - https://github.com/fmtlib/fmt/pull/1094, - https://github.com/fmtlib/fmt/issues/1101, - https://github.com/fmtlib/fmt/pull/1102, - https://github.com/fmtlib/fmt/issues/1105, - https://github.com/fmtlib/fmt/pull/1107, - https://github.com/fmtlib/fmt/issues/1115, - https://github.com/fmtlib/fmt/issues/1117, - https://github.com/fmtlib/fmt/issues/1118, - https://github.com/fmtlib/fmt/issues/1120, - https://github.com/fmtlib/fmt/issues/1123, - https://github.com/fmtlib/fmt/pull/1139, - https://github.com/fmtlib/fmt/issues/1140, - https://github.com/fmtlib/fmt/issues/1143, - https://github.com/fmtlib/fmt/pull/1144, - https://github.com/fmtlib/fmt/pull/1150, - https://github.com/fmtlib/fmt/pull/1151, - https://github.com/fmtlib/fmt/issues/1152, - https://github.com/fmtlib/fmt/issues/1154, - https://github.com/fmtlib/fmt/issues/1156, - https://github.com/fmtlib/fmt/pull/1159, - https://github.com/fmtlib/fmt/issues/1175, - https://github.com/fmtlib/fmt/issues/1181, - https://github.com/fmtlib/fmt/issues/1186, - https://github.com/fmtlib/fmt/pull/1187, - https://github.com/fmtlib/fmt/pull/1191, - https://github.com/fmtlib/fmt/issues/1197, - https://github.com/fmtlib/fmt/issues/1200, - https://github.com/fmtlib/fmt/issues/1203, - https://github.com/fmtlib/fmt/issues/1205, - https://github.com/fmtlib/fmt/pull/1206, - https://github.com/fmtlib/fmt/issues/1213, - https://github.com/fmtlib/fmt/issues/1214, - https://github.com/fmtlib/fmt/pull/1217, - https://github.com/fmtlib/fmt/issues/1228, - https://github.com/fmtlib/fmt/pull/1230, - https://github.com/fmtlib/fmt/issues/1232, - https://github.com/fmtlib/fmt/pull/1235, - https://github.com/fmtlib/fmt/pull/1236, - https://github.com/fmtlib/fmt/issues/1240). - Thanks @DanielaE, @mwinterb, @eliaskosunen, @morinmorin, @ricco19, - @waywardmonkeys, @chronoxor, @remyabel, @pauldreik, @gsjaardema, @rcane, - @mocabe, @denchat, @cjdb, @HazardyKnusperkeks, @vedranmiletic, @jackoalan, - @DaanDeMeyer and @starkmapper. +- Fixed various warnings and compilation issues + (https://github.com/fmtlib/fmt/pull/998, + https://github.com/fmtlib/fmt/pull/1006, + https://github.com/fmtlib/fmt/issues/1008, + https://github.com/fmtlib/fmt/issues/1011, + https://github.com/fmtlib/fmt/issues/1025, + https://github.com/fmtlib/fmt/pull/1027, + https://github.com/fmtlib/fmt/pull/1028, + https://github.com/fmtlib/fmt/pull/1029, + https://github.com/fmtlib/fmt/pull/1030, + https://github.com/fmtlib/fmt/pull/1031, + https://github.com/fmtlib/fmt/pull/1054, + https://github.com/fmtlib/fmt/issues/1063, + https://github.com/fmtlib/fmt/pull/1068, + https://github.com/fmtlib/fmt/pull/1074, + https://github.com/fmtlib/fmt/pull/1075, + https://github.com/fmtlib/fmt/pull/1079, + https://github.com/fmtlib/fmt/pull/1086, + https://github.com/fmtlib/fmt/issues/1088, + https://github.com/fmtlib/fmt/pull/1089, + https://github.com/fmtlib/fmt/pull/1094, + https://github.com/fmtlib/fmt/issues/1101, + https://github.com/fmtlib/fmt/pull/1102, + https://github.com/fmtlib/fmt/issues/1105, + https://github.com/fmtlib/fmt/pull/1107, + https://github.com/fmtlib/fmt/issues/1115, + https://github.com/fmtlib/fmt/issues/1117, + https://github.com/fmtlib/fmt/issues/1118, + https://github.com/fmtlib/fmt/issues/1120, + https://github.com/fmtlib/fmt/issues/1123, + https://github.com/fmtlib/fmt/pull/1139, + https://github.com/fmtlib/fmt/issues/1140, + https://github.com/fmtlib/fmt/issues/1143, + https://github.com/fmtlib/fmt/pull/1144, + https://github.com/fmtlib/fmt/pull/1150, + https://github.com/fmtlib/fmt/pull/1151, + https://github.com/fmtlib/fmt/issues/1152, + https://github.com/fmtlib/fmt/issues/1154, + https://github.com/fmtlib/fmt/issues/1156, + https://github.com/fmtlib/fmt/pull/1159, + https://github.com/fmtlib/fmt/issues/1175, + https://github.com/fmtlib/fmt/issues/1181, + https://github.com/fmtlib/fmt/issues/1186, + https://github.com/fmtlib/fmt/pull/1187, + https://github.com/fmtlib/fmt/pull/1191, + https://github.com/fmtlib/fmt/issues/1197, + https://github.com/fmtlib/fmt/issues/1200, + https://github.com/fmtlib/fmt/issues/1203, + https://github.com/fmtlib/fmt/issues/1205, + https://github.com/fmtlib/fmt/pull/1206, + https://github.com/fmtlib/fmt/issues/1213, + https://github.com/fmtlib/fmt/issues/1214, + https://github.com/fmtlib/fmt/pull/1217, + https://github.com/fmtlib/fmt/issues/1228, + https://github.com/fmtlib/fmt/pull/1230, + https://github.com/fmtlib/fmt/issues/1232, + https://github.com/fmtlib/fmt/pull/1235, + https://github.com/fmtlib/fmt/pull/1236, + https://github.com/fmtlib/fmt/issues/1240). + Thanks @DanielaE, @mwinterb, @eliaskosunen, @morinmorin, @ricco19, + @waywardmonkeys, @chronoxor, @remyabel, @pauldreik, @gsjaardema, @rcane, + @mocabe, @denchat, @cjdb, @HazardyKnusperkeks, @vedranmiletic, @jackoalan, + @DaanDeMeyer and @starkmapper. # 5.3.0 - 2018-12-28 -- Introduced experimental chrono formatting support: +- Introduced experimental chrono formatting support: - ```c++ - #include + ```c++ + #include - 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); - } - ``` + 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: + prints: - Default format: 42s 100ms - strftime-like format: 03:15:30 + 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 - (https://github.com/fmtlib/fmt/pull/961, - https://github.com/fmtlib/fmt/pull/967, - https://github.com/fmtlib/fmt/pull/973): +- Added experimental support for emphasis (bold, italic, underline, + strikethrough), colored output to a file stream, and improved + colored formatting API + (https://github.com/fmtlib/fmt/pull/961, + https://github.com/fmtlib/fmt/pull/967, + https://github.com/fmtlib/fmt/pull/973): - ```c++ - #include + ```c++ + #include - 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", "世界"); - } - ``` + 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: + prints the following on modern terminals with RGB color support: - ![](https://user-images.githubusercontent.com/576385/50405788-b66e7500-076e-11e9-9592-7324d1f951d8.png) + ![](https://user-images.githubusercontent.com/576385/50405788-b66e7500-076e-11e9-9592-7324d1f951d8.png) - Thanks @Rakete1111. + Thanks @Rakete1111. -- Added support for 4-bit terminal colors - (https://github.com/fmtlib/fmt/issues/968, - https://github.com/fmtlib/fmt/pull/974) +- Added support for 4-bit terminal colors + (https://github.com/fmtlib/fmt/issues/968, + https://github.com/fmtlib/fmt/pull/974) - ```c++ - #include + ```c++ + #include - int main() { - print(fg(fmt::terminal_color::red), "stop\n"); - } - ``` + int main() { + print(fg(fmt::terminal_color::red), "stop\n"); + } + ``` - Note that these colors vary by terminal: + Note that these colors vary by terminal: - ![](https://user-images.githubusercontent.com/576385/50405925-dbfc7e00-0770-11e9-9b85-333fab0af9ac.png) + ![](https://user-images.githubusercontent.com/576385/50405925-dbfc7e00-0770-11e9-9b85-333fab0af9ac.png) - Thanks @Rakete1111. + Thanks @Rakete1111. -- Parameterized formatting functions on the type of the format string - (https://github.com/fmtlib/fmt/issues/880, - https://github.com/fmtlib/fmt/pull/881, - https://github.com/fmtlib/fmt/pull/883, - https://github.com/fmtlib/fmt/pull/885, - https://github.com/fmtlib/fmt/pull/897, - https://github.com/fmtlib/fmt/issues/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: +- Parameterized formatting functions on the type of the format string + (https://github.com/fmtlib/fmt/issues/880, + https://github.com/fmtlib/fmt/pull/881, + https://github.com/fmtlib/fmt/pull/883, + https://github.com/fmtlib/fmt/pull/885, + https://github.com/fmtlib/fmt/pull/897, + https://github.com/fmtlib/fmt/issues/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: - ```c++ - namespace my_ns { - inline string_view to_string_view(const my_string& s) { - return {s.data(), s.length()}; - } - } + ```c++ + 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); - ``` + std::string message = fmt::format(my_string("The answer is {}."), 42); + ``` - Thanks @DanielaE. + Thanks @DanielaE. -- Made `std::string_view` work as a format string - (https://github.com/fmtlib/fmt/pull/898): +- Made `std::string_view` work as a format string + (https://github.com/fmtlib/fmt/pull/898): - ```c++ - auto message = fmt::format(std::string_view("The answer is {}."), 42); - ``` + ```c++ + auto message = fmt::format(std::string_view("The answer is {}."), 42); + ``` - Thanks @DanielaE. + Thanks @DanielaE. -- Added wide string support to compile-time format string checks - (https://github.com/fmtlib/fmt/pull/924): +- Added wide string support to compile-time format string checks + (https://github.com/fmtlib/fmt/pull/924): - ```c++ - print(fmt(L"{:f}"), 42); // compile-time error: invalid type specifier - ``` + ```c++ + print(fmt(L"{:f}"), 42); // compile-time error: invalid type specifier + ``` - Thanks @XZiar. + Thanks @XZiar. -- Made colored print functions work with wide strings - (https://github.com/fmtlib/fmt/pull/867): +- Made colored print functions work with wide strings + (https://github.com/fmtlib/fmt/pull/867): - ```c++ - #include + ```c++ + #include - int main() { - print(fg(fmt::color::red), L"{}\n", 42); - } - ``` + int main() { + print(fg(fmt::color::red), L"{}\n", 42); + } + ``` - Thanks @DanielaE. + Thanks @DanielaE. -- Introduced experimental Unicode support - (https://github.com/fmtlib/fmt/issues/628, - https://github.com/fmtlib/fmt/pull/891): +- Introduced experimental Unicode support + (https://github.com/fmtlib/fmt/issues/628, + https://github.com/fmtlib/fmt/pull/891): - ```c++ - using namespace fmt::literals; - auto s = fmt::format("{:*^5}"_u, "🤡"_u); // s == "**🤡**"_u - ``` + ```c++ + using namespace fmt::literals; + auto s = fmt::format("{:*^5}"_u, "🤡"_u); // s == "**🤡**"_u + ``` -- Improved locale support: +- Improved locale support: - ```c++ - #include + ```c++ + #include - struct numpunct : std::numpunct { - protected: - char do_thousands_sep() const override { return '~'; } - }; + struct numpunct : std::numpunct { + 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" - ``` + 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 - (https://github.com/fmtlib/fmt/pull/921). Thanks @DanielaE. +- Constrained formatting functions on proper iterator types + (https://github.com/fmtlib/fmt/pull/921). Thanks @DanielaE. -- Added `make_printf_args` and `make_wprintf_args` functions - (https://github.com/fmtlib/fmt/pull/934). Thanks @tnovotny. +- Added `make_printf_args` and `make_wprintf_args` functions + (https://github.com/fmtlib/fmt/pull/934). Thanks @tnovotny. -- Deprecated `fmt::visit`, `parse_context`, and `wparse_context`. Use - `fmt::visit_format_arg`, `format_parse_context`, and - `wformat_parse_context` instead. +- 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 - (https://github.com/fmtlib/fmt/issues/873, - https://github.com/fmtlib/fmt/pull/902). Thanks @superfunc. +- Removed undocumented `basic_fixed_buffer` which has been superseded + by the iterator-based API + (https://github.com/fmtlib/fmt/issues/873, + https://github.com/fmtlib/fmt/pull/902). Thanks @superfunc. -- Disallowed repeated leading zeros in an argument ID: +- Disallowed repeated leading zeros in an argument ID: - ```c++ - fmt::print("{000}", 42); // error - ``` + ```c++ + fmt::print("{000}", 42); // error + ``` -- Reintroduced support for gcc 4.4. +- Reintroduced support for gcc 4.4. -- Fixed compilation on platforms with exotic `double` - (https://github.com/fmtlib/fmt/issues/878). +- Fixed compilation on platforms with exotic `double` + (https://github.com/fmtlib/fmt/issues/878). -- Improved documentation - (https://github.com/fmtlib/fmt/issues/164, - https://github.com/fmtlib/fmt/issues/877, - https://github.com/fmtlib/fmt/pull/901, - https://github.com/fmtlib/fmt/pull/906, - https://github.com/fmtlib/fmt/pull/979). - Thanks @kookjr, @DarkDimius and @HecticSerenity. +- Improved documentation + (https://github.com/fmtlib/fmt/issues/164, + https://github.com/fmtlib/fmt/issues/877, + https://github.com/fmtlib/fmt/pull/901, + https://github.com/fmtlib/fmt/pull/906, + https://github.com/fmtlib/fmt/pull/979). + Thanks @kookjr, @DarkDimius and @HecticSerenity. -- Added pkgconfig support which makes it easier to consume the library - from meson and other build systems - (https://github.com/fmtlib/fmt/pull/916). Thanks @colemickens. +- Added pkgconfig support which makes it easier to consume the library + from meson and other build systems + (https://github.com/fmtlib/fmt/pull/916). Thanks @colemickens. -- Various build improvements - (https://github.com/fmtlib/fmt/pull/909, - https://github.com/fmtlib/fmt/pull/926, - https://github.com/fmtlib/fmt/pull/937, - https://github.com/fmtlib/fmt/pull/953, - https://github.com/fmtlib/fmt/pull/959). - Thanks @tchaikov, @luncliff, @AndreasSchoenle, @hotwatermorning and @Zefz. +- Various build improvements + (https://github.com/fmtlib/fmt/pull/909, + https://github.com/fmtlib/fmt/pull/926, + https://github.com/fmtlib/fmt/pull/937, + https://github.com/fmtlib/fmt/pull/953, + https://github.com/fmtlib/fmt/pull/959). + Thanks @tchaikov, @luncliff, @AndreasSchoenle, @hotwatermorning and @Zefz. -- Improved `string_view` construction performance - (https://github.com/fmtlib/fmt/pull/914). Thanks @gabime. +- Improved `string_view` construction performance + (https://github.com/fmtlib/fmt/pull/914). Thanks @gabime. -- Fixed non-matching char types - (https://github.com/fmtlib/fmt/pull/895). Thanks @DanielaE. +- Fixed non-matching char types + (https://github.com/fmtlib/fmt/pull/895). Thanks @DanielaE. -- Fixed `format_to_n` with `std::back_insert_iterator` - (https://github.com/fmtlib/fmt/pull/913). Thanks @DanielaE. +- Fixed `format_to_n` with `std::back_insert_iterator` + (https://github.com/fmtlib/fmt/pull/913). Thanks @DanielaE. -- Fixed locale-dependent formatting - (https://github.com/fmtlib/fmt/issues/905). +- Fixed locale-dependent formatting + (https://github.com/fmtlib/fmt/issues/905). -- Fixed various compiler warnings and errors - (https://github.com/fmtlib/fmt/pull/882, - https://github.com/fmtlib/fmt/pull/886, - https://github.com/fmtlib/fmt/pull/933, - https://github.com/fmtlib/fmt/pull/941, - https://github.com/fmtlib/fmt/issues/931, - https://github.com/fmtlib/fmt/pull/943, - https://github.com/fmtlib/fmt/pull/954, - https://github.com/fmtlib/fmt/pull/956, - https://github.com/fmtlib/fmt/pull/962, - https://github.com/fmtlib/fmt/issues/965, - https://github.com/fmtlib/fmt/issues/977, - https://github.com/fmtlib/fmt/pull/983, - https://github.com/fmtlib/fmt/pull/989). - Thanks @Luthaf, @stevenhoving, @christinaa, @lgritz, @DanielaE, - @0x8000-0000 and @liuping1997. +- Fixed various compiler warnings and errors + (https://github.com/fmtlib/fmt/pull/882, + https://github.com/fmtlib/fmt/pull/886, + https://github.com/fmtlib/fmt/pull/933, + https://github.com/fmtlib/fmt/pull/941, + https://github.com/fmtlib/fmt/issues/931, + https://github.com/fmtlib/fmt/pull/943, + https://github.com/fmtlib/fmt/pull/954, + https://github.com/fmtlib/fmt/pull/956, + https://github.com/fmtlib/fmt/pull/962, + https://github.com/fmtlib/fmt/issues/965, + https://github.com/fmtlib/fmt/issues/977, + https://github.com/fmtlib/fmt/pull/983, + https://github.com/fmtlib/fmt/pull/989). + Thanks @Luthaf, @stevenhoving, @christinaa, @lgritz, @DanielaE, + @0x8000-0000 and @liuping1997. # 5.2.1 - 2018-09-21 -- Fixed `visit` lookup issues on gcc 7 & 8 - (https://github.com/fmtlib/fmt/pull/870). Thanks @medithe. -- Fixed linkage errors on older gcc. -- Prevented `fmt/range.h` from specializing `fmt::basic_string_view` - (https://github.com/fmtlib/fmt/issues/865, - https://github.com/fmtlib/fmt/pull/868). Thanks @hhggit. -- Improved error message when formatting unknown types - (https://github.com/fmtlib/fmt/pull/872). Thanks @foonathan. -- Disabled templated user-defined literals when compiled under nvcc - (https://github.com/fmtlib/fmt/pull/875). Thanks @CandyGumdrop. -- Fixed `format_to` formatting to `wmemory_buffer` - (https://github.com/fmtlib/fmt/issues/874). +- Fixed `visit` lookup issues on gcc 7 & 8 + (https://github.com/fmtlib/fmt/pull/870). Thanks @medithe. +- Fixed linkage errors on older gcc. +- Prevented `fmt/range.h` from specializing `fmt::basic_string_view` + (https://github.com/fmtlib/fmt/issues/865, + https://github.com/fmtlib/fmt/pull/868). Thanks @hhggit. +- Improved error message when formatting unknown types + (https://github.com/fmtlib/fmt/pull/872). Thanks @foonathan. +- Disabled templated user-defined literals when compiled under nvcc + (https://github.com/fmtlib/fmt/pull/875). Thanks @CandyGumdrop. +- Fixed `format_to` formatting to `wmemory_buffer` + (https://github.com/fmtlib/fmt/issues/874). # 5.2.0 - 2018-09-13 -- 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): +- 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 | | + | 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`: +- 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`: - ```c++ - #define FMT_STRING_ALIAS 1 - #include - std::string answer = format(fmt("{}"), 42); - ``` + ```c++ + #define FMT_STRING_ALIAS 1 + #include + std::string answer = format(fmt("{}"), 42); + ``` -- Added compile-time format string checks to `format_to` overload that - takes `fmt::memory_buffer` - (https://github.com/fmtlib/fmt/issues/783): +- Added compile-time format string checks to `format_to` overload that + takes `fmt::memory_buffer` + (https://github.com/fmtlib/fmt/issues/783): - ```c++ - fmt::memory_buffer buf; - // Compile-time error: invalid type specifier. - fmt::format_to(buf, fmt("{:d}"), "foo"); - ``` + ```c++ + 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. +- 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`: +- Added formatting support for types explicitly convertible to + `fmt::string_view`: - ```c++ - struct foo { - explicit operator fmt::string_view() const { return "foo"; } - }; - auto s = format("{}", foo()); - ``` + ```c++ + struct foo { + explicit operator fmt::string_view() const { return "foo"; } + }; + auto s = format("{}", foo()); + ``` - In particular, this makes formatting function work with - `folly::StringPiece`. + 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. +- 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 - (https://github.com/fmtlib/fmt/issues/814, - https://github.com/fmtlib/fmt/pull/819). Thanks @MikePopoloski. +- Added support for dynamic argument lists + (https://github.com/fmtlib/fmt/issues/814, + https://github.com/fmtlib/fmt/pull/819). Thanks @MikePopoloski. -- Reduced executable size overhead for embedded targets using newlib - nano by making locale dependency optional - (https://github.com/fmtlib/fmt/pull/839). Thanks @teajay-fr. +- Reduced executable size overhead for embedded targets using newlib + nano by making locale dependency optional + (https://github.com/fmtlib/fmt/pull/839). Thanks @teajay-fr. -- Keep `noexcept` specifier when exceptions are disabled - (https://github.com/fmtlib/fmt/issues/801, - https://github.com/fmtlib/fmt/pull/810). Thanks @qis. +- Keep `noexcept` specifier when exceptions are disabled + (https://github.com/fmtlib/fmt/issues/801, + https://github.com/fmtlib/fmt/pull/810). Thanks @qis. -- Fixed formatting of user-defined types providing `operator<<` with - `format_to_n` (https://github.com/fmtlib/fmt/pull/806). - Thanks @mkurdej. +- Fixed formatting of user-defined types providing `operator<<` with + `format_to_n` (https://github.com/fmtlib/fmt/pull/806). + Thanks @mkurdej. -- Fixed dynamic linkage of new symbols - (https://github.com/fmtlib/fmt/issues/808). +- Fixed dynamic linkage of new symbols + (https://github.com/fmtlib/fmt/issues/808). -- Fixed global initialization issue - (https://github.com/fmtlib/fmt/issues/807): +- Fixed global initialization issue + (https://github.com/fmtlib/fmt/issues/807): - ```c++ - // This works on compilers with constexpr support. - static const std::string answer = fmt::format("{}", 42); - ``` + ```c++ + // This works on compilers with constexpr support. + static const std::string answer = fmt::format("{}", 42); + ``` -- Fixed various compiler warnings and errors - (https://github.com/fmtlib/fmt/pull/804, - https://github.com/fmtlib/fmt/issues/809, - https://github.com/fmtlib/fmt/pull/811, - https://github.com/fmtlib/fmt/issues/822, - https://github.com/fmtlib/fmt/pull/827, - https://github.com/fmtlib/fmt/issues/830, - https://github.com/fmtlib/fmt/pull/838, - https://github.com/fmtlib/fmt/issues/843, - https://github.com/fmtlib/fmt/pull/844, - https://github.com/fmtlib/fmt/issues/851, - https://github.com/fmtlib/fmt/pull/852, - https://github.com/fmtlib/fmt/pull/854). - Thanks @henryiii, @medithe, and @eliasdaler. +- Fixed various compiler warnings and errors + (https://github.com/fmtlib/fmt/pull/804, + https://github.com/fmtlib/fmt/issues/809, + https://github.com/fmtlib/fmt/pull/811, + https://github.com/fmtlib/fmt/issues/822, + https://github.com/fmtlib/fmt/pull/827, + https://github.com/fmtlib/fmt/issues/830, + https://github.com/fmtlib/fmt/pull/838, + https://github.com/fmtlib/fmt/issues/843, + https://github.com/fmtlib/fmt/pull/844, + https://github.com/fmtlib/fmt/issues/851, + https://github.com/fmtlib/fmt/pull/852, + https://github.com/fmtlib/fmt/pull/854). + Thanks @henryiii, @medithe, and @eliasdaler. # 5.1.0 - 2018-07-05 -- Added experimental support for RGB color output enabled with the - `FMT_EXTENDED_COLORS` macro: +- Added experimental support for RGB color output enabled with the + `FMT_EXTENDED_COLORS` macro: - ```c++ - #define FMT_EXTENDED_COLORS - #define FMT_HEADER_ONLY // or compile fmt with FMT_EXTENDED_COLORS defined - #include + ```c++ + #define FMT_EXTENDED_COLORS + #define FMT_HEADER_ONLY // or compile fmt with FMT_EXTENDED_COLORS defined + #include - fmt::print(fmt::color::steel_blue, "Some beautiful text"); - ``` + 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. - (https://github.com/fmtlib/fmt/issues/762 - https://github.com/fmtlib/fmt/pull/767). thanks @Remotion. + The old API (the `print_colored` and `vprint_colored` functions and + the `color` enum) is now deprecated. + (https://github.com/fmtlib/fmt/issues/762 + https://github.com/fmtlib/fmt/pull/767). thanks @Remotion. -- Added quotes to strings in ranges and tuples - (https://github.com/fmtlib/fmt/pull/766). Thanks @Remotion. +- Added quotes to strings in ranges and tuples + (https://github.com/fmtlib/fmt/pull/766). Thanks @Remotion. -- Made `format_to` work with `basic_memory_buffer` - (https://github.com/fmtlib/fmt/issues/776). +- Made `format_to` work with `basic_memory_buffer` + (https://github.com/fmtlib/fmt/issues/776). -- Added `vformat_to_n` and `wchar_t` overload of `format_to_n` - (https://github.com/fmtlib/fmt/issues/764, - https://github.com/fmtlib/fmt/issues/769). +- Added `vformat_to_n` and `wchar_t` overload of `format_to_n` + (https://github.com/fmtlib/fmt/issues/764, + https://github.com/fmtlib/fmt/issues/769). -- Made `is_range` and `is_tuple_like` part of public (experimental) - API to allow specialization for user-defined types - (https://github.com/fmtlib/fmt/issues/751, - https://github.com/fmtlib/fmt/pull/759). Thanks @drrlvn. +- Made `is_range` and `is_tuple_like` part of public (experimental) + API to allow specialization for user-defined types + (https://github.com/fmtlib/fmt/issues/751, + https://github.com/fmtlib/fmt/pull/759). Thanks @drrlvn. -- Added more compilers to continuous integration and increased - `FMT_PEDANTIC` warning levels - (https://github.com/fmtlib/fmt/pull/736). Thanks @eliaskosunen. +- Added more compilers to continuous integration and increased + `FMT_PEDANTIC` warning levels + (https://github.com/fmtlib/fmt/pull/736). Thanks @eliaskosunen. -- Fixed compilation with MSVC 2013. +- Fixed compilation with MSVC 2013. -- Fixed handling of user-defined types in `format_to` - (https://github.com/fmtlib/fmt/issues/793). +- Fixed handling of user-defined types in `format_to` + (https://github.com/fmtlib/fmt/issues/793). -- Forced linking of inline `vformat` functions into the library - (https://github.com/fmtlib/fmt/issues/795). +- Forced linking of inline `vformat` functions into the library + (https://github.com/fmtlib/fmt/issues/795). -- Fixed incorrect call to on_align in `'{:}='` - (https://github.com/fmtlib/fmt/issues/750). +- Fixed incorrect call to on_align in `'{:}='` + (https://github.com/fmtlib/fmt/issues/750). -- Fixed floating-point formatting to a non-back_insert_iterator with - sign & numeric alignment specified - (https://github.com/fmtlib/fmt/issues/756). +- Fixed floating-point formatting to a non-back_insert_iterator with + sign & numeric alignment specified + (https://github.com/fmtlib/fmt/issues/756). -- Fixed formatting to an array with `format_to_n` - (https://github.com/fmtlib/fmt/issues/778). +- Fixed formatting to an array with `format_to_n` + (https://github.com/fmtlib/fmt/issues/778). -- Fixed formatting of more than 15 named arguments - (https://github.com/fmtlib/fmt/issues/754). +- Fixed formatting of more than 15 named arguments + (https://github.com/fmtlib/fmt/issues/754). -- Fixed handling of compile-time strings when including - `fmt/ostream.h`. (https://github.com/fmtlib/fmt/issues/768). +- Fixed handling of compile-time strings when including + `fmt/ostream.h`. (https://github.com/fmtlib/fmt/issues/768). -- Fixed various compiler warnings and errors - (https://github.com/fmtlib/fmt/issues/742, - https://github.com/fmtlib/fmt/issues/748, - https://github.com/fmtlib/fmt/issues/752, - https://github.com/fmtlib/fmt/issues/770, - https://github.com/fmtlib/fmt/pull/775, - https://github.com/fmtlib/fmt/issues/779, - https://github.com/fmtlib/fmt/pull/780, - https://github.com/fmtlib/fmt/pull/790, - https://github.com/fmtlib/fmt/pull/792, - https://github.com/fmtlib/fmt/pull/800). - Thanks @Remotion, @gabime, @foonathan, @Dark-Passenger and @0x8000-0000. +- Fixed various compiler warnings and errors + (https://github.com/fmtlib/fmt/issues/742, + https://github.com/fmtlib/fmt/issues/748, + https://github.com/fmtlib/fmt/issues/752, + https://github.com/fmtlib/fmt/issues/770, + https://github.com/fmtlib/fmt/pull/775, + https://github.com/fmtlib/fmt/issues/779, + https://github.com/fmtlib/fmt/pull/780, + https://github.com/fmtlib/fmt/pull/790, + https://github.com/fmtlib/fmt/pull/792, + https://github.com/fmtlib/fmt/pull/800). + Thanks @Remotion, @gabime, @foonathan, @Dark-Passenger and @0x8000-0000. # 5.0.0 - 2018-05-21 -- Added a requirement for partial C++11 support, most importantly - variadic templates and type traits, and dropped `FMT_VARIADIC_*` - emulation macros. Variadic templates are available since GCC 4.4, - Clang 2.9 and MSVC 18.0 (2013). For older compilers use {fmt} - [version 4.x](https://github.com/fmtlib/fmt/releases/tag/4.1.0) - which continues to be maintained and works with C++98 compilers. +- Added a requirement for partial C++11 support, most importantly + variadic templates and type traits, and dropped `FMT_VARIADIC_*` + emulation macros. Variadic templates are available since GCC 4.4, + Clang 2.9 and MSVC 18.0 (2013). For older compilers use {fmt} + [version 4.x](https://github.com/fmtlib/fmt/releases/tag/4.1.0) + which continues to be maintained and works with C++98 compilers. -- Renamed symbols to follow standard C++ naming conventions and - proposed a subset of the library for standardization in [P0645R2 - Text Formatting](https://wg21.link/P0645). +- Renamed symbols to follow standard C++ naming conventions and + proposed a subset of the library for standardization in [P0645R2 + Text Formatting](https://wg21.link/P0645). -- Implemented `constexpr` parsing of format strings and [compile-time - format string - checks](https://fmt.dev/latest/api.html#compile-time-format-string-checks). - For example +- Implemented `constexpr` parsing of format strings and [compile-time + format string + checks](https://fmt.dev/latest/api.html#compile-time-format-string-checks). + For example - ```c++ - #include + ```c++ + #include - std::string s = format(fmt("{:d}"), "foo"); - ``` + std::string s = format(fmt("{:d}"), "foo"); + ``` - gives a compile-time error because `d` is an invalid specifier for - strings ([godbolt](https://godbolt.org/g/rnCy9Q)): + gives a compile-time error because `d` is an invalid specifier for + strings ([godbolt](https://godbolt.org/g/rnCy9Q)): - ... - :4:19: note: in instantiation of function template specialization 'fmt::v5::format' requested here - std::string s = format(fmt("{:d}"), "foo"); - ^ - format.h:1337:13: note: non-constexpr function 'on_error' cannot be used in a constant expression - handler.on_error("invalid type specifier"); + ... + :4:19: note: in instantiation of function template specialization 'fmt::v5::format' requested here + std::string s = format(fmt("{:d}"), "foo"); + ^ + format.h:1337:13: note: non-constexpr function 'on_error' cannot be used in a constant expression + handler.on_error("invalid type specifier"); - Compile-time checks require relaxed `constexpr` (C++14 feature) - support. If the latter is not available, checks will be performed at - runtime. + Compile-time checks require relaxed `constexpr` (C++14 feature) + support. If the latter is not available, checks will be performed at + runtime. -- Separated format string parsing and formatting in the extension API - to enable compile-time format string processing. For example +- Separated format string parsing and formatting in the extension API + to enable compile-time format string processing. For example - ```c++ - struct Answer {}; + ```c++ + struct Answer {}; - namespace fmt { - template <> - struct formatter { - constexpr auto parse(parse_context& ctx) { - auto it = ctx.begin(); - spec = *it; - if (spec != 'd' && spec != 's') - throw format_error("invalid specifier"); - return ++it; - } - - template - auto format(Answer, FormatContext& ctx) { - return spec == 's' ? - format_to(ctx.begin(), "{}", "fourty-two") : - format_to(ctx.begin(), "{}", 42); - } - - char spec = 0; - }; + namespace fmt { + template <> + struct formatter { + constexpr auto parse(parse_context& ctx) { + auto it = ctx.begin(); + spec = *it; + if (spec != 'd' && spec != 's') + throw format_error("invalid specifier"); + return ++it; } - std::string s = format(fmt("{:x}"), Answer()); - ``` - - gives a compile-time error due to invalid format specifier - ([godbolt](https://godbolt.org/g/2jQ1Dv)): - - ... - :12:45: error: expression '' is not a constant expression - throw format_error("invalid specifier"); - -- Added [iterator - support](https://fmt.dev/latest/api.html#output-iterator-support): - - ```c++ - #include - #include - - std::vector out; - fmt::format_to(std::back_inserter(out), "{}", 42); - ``` - -- Added the - [format_to_n](https://fmt.dev/latest/api.html#_CPPv2N3fmt11format_to_nE8OutputItNSt6size_tE11string_viewDpRK4Args) - function that restricts the output to the specified number of - characters (https://github.com/fmtlib/fmt/issues/298): - - ```c++ - char out[4]; - fmt::format_to_n(out, sizeof(out), "{}", 12345); - // out == "1234" (without terminating '\0') - ``` - -- Added the [formatted_size]( - https://fmt.dev/latest/api.html#_CPPv2N3fmt14formatted_sizeE11string_viewDpRK4Args) - function for computing the output size: - - ```c++ - #include - - auto size = fmt::formatted_size("{}", 12345); // size == 5 - ``` - -- Improved compile times by reducing dependencies on standard headers - and providing a lightweight [core - API](https://fmt.dev/latest/api.html#core-api): - - ```c++ - #include - - fmt::print("The answer is {}.", 42); - ``` - - See [Compile time and code - bloat](https://github.com/fmtlib/fmt#compile-time-and-code-bloat). - -- Added the [make_format_args]( - https://fmt.dev/latest/api.html#_CPPv2N3fmt16make_format_argsEDpRK4Args) - function for capturing formatting arguments: - - ```c++ - // Prints formatted error message. - void vreport_error(const char *format, fmt::format_args args) { - fmt::print("Error: "); - fmt::vprint(format, args); + template + auto format(Answer, FormatContext& ctx) { + return spec == 's' ? + format_to(ctx.begin(), "{}", "fourty-two") : + format_to(ctx.begin(), "{}", 42); } - template - void report_error(const char *format, const Args & ... args) { - vreport_error(format, fmt::make_format_args(args...)); - } - ``` -- Added the `make_printf_args` function for capturing `printf` - arguments (https://github.com/fmtlib/fmt/issues/687, - https://github.com/fmtlib/fmt/pull/694). Thanks @Kronuz. + char spec = 0; + }; + } -- Added prefix `v` to non-variadic functions taking `format_args` to - distinguish them from variadic ones: + std::string s = format(fmt("{:x}"), Answer()); + ``` - ```c++ - std::string vformat(string_view format_str, format_args args); + gives a compile-time error due to invalid format specifier + ([godbolt](https://godbolt.org/g/2jQ1Dv)): - template - std::string format(string_view format_str, const Args & ... args); - ``` + ... + :12:45: error: expression '' is not a constant expression + throw format_error("invalid specifier"); -- Added experimental support for formatting ranges, containers and - tuple-like types in `fmt/ranges.h` - (https://github.com/fmtlib/fmt/pull/735): +- Added [iterator + support](https://fmt.dev/latest/api.html#output-iterator-support): - ```c++ - #include + ```c++ + #include + #include - std::vector v = {1, 2, 3}; - fmt::print("{}", v); // prints {1, 2, 3} - ``` + std::vector out; + fmt::format_to(std::back_inserter(out), "{}", 42); + ``` - Thanks @Remotion. +- Added the + [format_to_n](https://fmt.dev/latest/api.html#_CPPv2N3fmt11format_to_nE8OutputItNSt6size_tE11string_viewDpRK4Args) + function that restricts the output to the specified number of + characters (https://github.com/fmtlib/fmt/issues/298): -- Implemented `wchar_t` date and time formatting - (https://github.com/fmtlib/fmt/pull/712): + ```c++ + char out[4]; + fmt::format_to_n(out, sizeof(out), "{}", 12345); + // out == "1234" (without terminating '\0') + ``` - ```c++ - #include +- Added the [formatted_size]( + https://fmt.dev/latest/api.html#_CPPv2N3fmt14formatted_sizeE11string_viewDpRK4Args) + function for computing the output size: - std::time_t t = std::time(nullptr); - auto s = fmt::format(L"The date is {:%Y-%m-%d}.", *std::localtime(&t)); - ``` + ```c++ + #include - Thanks @DanielaE. + auto size = fmt::formatted_size("{}", 12345); // size == 5 + ``` -- Provided more wide string overloads - (https://github.com/fmtlib/fmt/pull/724). Thanks @DanielaE. +- Improved compile times by reducing dependencies on standard headers + and providing a lightweight [core + API](https://fmt.dev/latest/api.html#core-api): -- Switched from a custom null-terminated string view class to - `string_view` in the format API and provided `fmt::string_view` - which implements a subset of `std::string_view` API for pre-C++17 - systems. + ```c++ + #include -- Added support for `std::experimental::string_view` - (https://github.com/fmtlib/fmt/pull/607): + fmt::print("The answer is {}.", 42); + ``` - ```c++ - #include - #include + See [Compile time and code + bloat](https://github.com/fmtlib/fmt#compile-time-and-code-bloat). - fmt::print("{}", std::experimental::string_view("foo")); - ``` +- Added the [make_format_args]( + https://fmt.dev/latest/api.html#_CPPv2N3fmt16make_format_argsEDpRK4Args) + function for capturing formatting arguments: - Thanks @virgiliofornazin. + ```c++ + // Prints formatted error message. + void vreport_error(const char *format, fmt::format_args args) { + fmt::print("Error: "); + fmt::vprint(format, args); + } + template + void report_error(const char *format, const Args & ... args) { + vreport_error(format, fmt::make_format_args(args...)); + } + ``` -- Allowed mixing named and automatic arguments: +- Added the `make_printf_args` function for capturing `printf` + arguments (https://github.com/fmtlib/fmt/issues/687, + https://github.com/fmtlib/fmt/pull/694). Thanks @Kronuz. - ```c++ - fmt::format("{} {two}", 1, fmt::arg("two", 2)); - ``` +- Added prefix `v` to non-variadic functions taking `format_args` to + distinguish them from variadic ones: -- Removed the write API in favor of the [format - API](https://fmt.dev/latest/api.html#format-api) with compile-time - handling of format strings. + ```c++ + std::string vformat(string_view format_str, format_args args); -- Disallowed formatting of multibyte strings into a wide character - target (https://github.com/fmtlib/fmt/pull/606). + template + std::string format(string_view format_str, const Args & ... args); + ``` -- Improved documentation - (https://github.com/fmtlib/fmt/pull/515, - https://github.com/fmtlib/fmt/issues/614, - https://github.com/fmtlib/fmt/pull/617, - https://github.com/fmtlib/fmt/pull/661, - https://github.com/fmtlib/fmt/pull/680). - Thanks @ibell, @mihaitodor and @johnthagen. +- Added experimental support for formatting ranges, containers and + tuple-like types in `fmt/ranges.h` + (https://github.com/fmtlib/fmt/pull/735): -- Implemented more efficient handling of large number of format - arguments. + ```c++ + #include -- Introduced an inline namespace for symbol versioning. + std::vector v = {1, 2, 3}; + fmt::print("{}", v); // prints {1, 2, 3} + ``` -- Added debug postfix `d` to the `fmt` library name - (https://github.com/fmtlib/fmt/issues/636). + Thanks @Remotion. -- Removed unnecessary `fmt/` prefix in includes - (https://github.com/fmtlib/fmt/pull/397). Thanks @chronoxor. +- Implemented `wchar_t` date and time formatting + (https://github.com/fmtlib/fmt/pull/712): -- Moved `fmt/*.h` to `include/fmt/*.h` to prevent irrelevant files and - directories appearing on the include search paths when fmt is used - as a subproject and moved source files to the `src` directory. + ```c++ + #include -- Added qmake project file `support/fmt.pro` - (https://github.com/fmtlib/fmt/pull/641). Thanks @cowo78. + std::time_t t = std::time(nullptr); + auto s = fmt::format(L"The date is {:%Y-%m-%d}.", *std::localtime(&t)); + ``` -- Added Gradle build file `support/build.gradle` - (https://github.com/fmtlib/fmt/pull/649). Thanks @luncliff. + Thanks @DanielaE. -- Removed `FMT_CPPFORMAT` CMake option. +- Provided more wide string overloads + (https://github.com/fmtlib/fmt/pull/724). Thanks @DanielaE. -- Fixed a name conflict with the macro `CHAR_WIDTH` in glibc - (https://github.com/fmtlib/fmt/pull/616). Thanks @aroig. +- Switched from a custom null-terminated string view class to + `string_view` in the format API and provided `fmt::string_view` + which implements a subset of `std::string_view` API for pre-C++17 + systems. -- Fixed handling of nested braces in `fmt::join` - (https://github.com/fmtlib/fmt/issues/638). +- Added support for `std::experimental::string_view` + (https://github.com/fmtlib/fmt/pull/607): -- Added `SOURCELINK_SUFFIX` for compatibility with Sphinx 1.5 - (https://github.com/fmtlib/fmt/pull/497). Thanks @ginggs. + ```c++ + #include + #include -- Added a missing `inline` in the header-only mode - (https://github.com/fmtlib/fmt/pull/626). Thanks @aroig. + fmt::print("{}", std::experimental::string_view("foo")); + ``` -- Fixed various compiler warnings - (https://github.com/fmtlib/fmt/pull/640, - https://github.com/fmtlib/fmt/pull/656, - https://github.com/fmtlib/fmt/pull/679, - https://github.com/fmtlib/fmt/pull/681, - https://github.com/fmtlib/fmt/pull/705, - https://github.com/fmtlib/fmt/issues/715, - https://github.com/fmtlib/fmt/pull/717, - https://github.com/fmtlib/fmt/pull/720, - https://github.com/fmtlib/fmt/pull/723, - https://github.com/fmtlib/fmt/pull/726, - https://github.com/fmtlib/fmt/pull/730, - https://github.com/fmtlib/fmt/pull/739). - Thanks @peterbell10, @LarsGullik, @foonathan, @eliaskosunen, - @christianparpart, @DanielaE and @mwinterb. + Thanks @virgiliofornazin. -- Worked around an MSVC bug and fixed several warnings - (https://github.com/fmtlib/fmt/pull/653). Thanks @alabuzhev. +- Allowed mixing named and automatic arguments: -- Worked around GCC bug 67371 - (https://github.com/fmtlib/fmt/issues/682). + ```c++ + fmt::format("{} {two}", 1, fmt::arg("two", 2)); + ``` -- Fixed compilation with `-fno-exceptions` - (https://github.com/fmtlib/fmt/pull/655). Thanks @chenxiaolong. +- Removed the write API in favor of the [format + API](https://fmt.dev/latest/api.html#format-api) with compile-time + handling of format strings. -- Made `constexpr remove_prefix` gcc version check tighter - (https://github.com/fmtlib/fmt/issues/648). +- Disallowed formatting of multibyte strings into a wide character + target (https://github.com/fmtlib/fmt/pull/606). -- Renamed internal type enum constants to prevent collision with - poorly written C libraries - (https://github.com/fmtlib/fmt/issues/644). +- Improved documentation + (https://github.com/fmtlib/fmt/pull/515, + https://github.com/fmtlib/fmt/issues/614, + https://github.com/fmtlib/fmt/pull/617, + https://github.com/fmtlib/fmt/pull/661, + https://github.com/fmtlib/fmt/pull/680). + Thanks @ibell, @mihaitodor and @johnthagen. -- Added detection of `wostream operator<<` - (https://github.com/fmtlib/fmt/issues/650). +- Implemented more efficient handling of large number of format + arguments. -- Fixed compilation on OpenBSD - (https://github.com/fmtlib/fmt/pull/660). Thanks @hubslave. +- Introduced an inline namespace for symbol versioning. -- Fixed compilation on FreeBSD 12 - (https://github.com/fmtlib/fmt/pull/732). Thanks @dankm. +- Added debug postfix `d` to the `fmt` library name + (https://github.com/fmtlib/fmt/issues/636). -- Fixed compilation when there is a mismatch between `-std` options - between the library and user code - (https://github.com/fmtlib/fmt/issues/664). +- Removed unnecessary `fmt/` prefix in includes + (https://github.com/fmtlib/fmt/pull/397). Thanks @chronoxor. -- Fixed compilation with GCC 7 and `-std=c++11` - (https://github.com/fmtlib/fmt/issues/734). +- Moved `fmt/*.h` to `include/fmt/*.h` to prevent irrelevant files and + directories appearing on the include search paths when fmt is used + as a subproject and moved source files to the `src` directory. -- Improved generated binary code on GCC 7 and older - (https://github.com/fmtlib/fmt/issues/668). +- Added qmake project file `support/fmt.pro` + (https://github.com/fmtlib/fmt/pull/641). Thanks @cowo78. -- Fixed handling of numeric alignment with no width - (https://github.com/fmtlib/fmt/issues/675). +- Added Gradle build file `support/build.gradle` + (https://github.com/fmtlib/fmt/pull/649). Thanks @luncliff. -- Fixed handling of empty strings in UTF8/16 converters - (https://github.com/fmtlib/fmt/pull/676). Thanks @vgalka-sl. +- Removed `FMT_CPPFORMAT` CMake option. -- Fixed formatting of an empty `string_view` - (https://github.com/fmtlib/fmt/issues/689). +- Fixed a name conflict with the macro `CHAR_WIDTH` in glibc + (https://github.com/fmtlib/fmt/pull/616). Thanks @aroig. -- Fixed detection of `string_view` on libc++ - (https://github.com/fmtlib/fmt/issues/686). +- Fixed handling of nested braces in `fmt::join` + (https://github.com/fmtlib/fmt/issues/638). -- Fixed DLL issues (https://github.com/fmtlib/fmt/pull/696). - Thanks @sebkoenig. +- Added `SOURCELINK_SUFFIX` for compatibility with Sphinx 1.5 + (https://github.com/fmtlib/fmt/pull/497). Thanks @ginggs. -- Fixed compile checks for mixing narrow and wide strings - (https://github.com/fmtlib/fmt/issues/690). +- Added a missing `inline` in the header-only mode + (https://github.com/fmtlib/fmt/pull/626). Thanks @aroig. -- Disabled unsafe implicit conversion to `std::string` - (https://github.com/fmtlib/fmt/issues/729). +- Fixed various compiler warnings + (https://github.com/fmtlib/fmt/pull/640, + https://github.com/fmtlib/fmt/pull/656, + https://github.com/fmtlib/fmt/pull/679, + https://github.com/fmtlib/fmt/pull/681, + https://github.com/fmtlib/fmt/pull/705, + https://github.com/fmtlib/fmt/issues/715, + https://github.com/fmtlib/fmt/pull/717, + https://github.com/fmtlib/fmt/pull/720, + https://github.com/fmtlib/fmt/pull/723, + https://github.com/fmtlib/fmt/pull/726, + https://github.com/fmtlib/fmt/pull/730, + https://github.com/fmtlib/fmt/pull/739). + Thanks @peterbell10, @LarsGullik, @foonathan, @eliaskosunen, + @christianparpart, @DanielaE and @mwinterb. -- Fixed handling of reused format specs (as in `fmt::join`) for - pointers (https://github.com/fmtlib/fmt/pull/725). Thanks @mwinterb. +- Worked around an MSVC bug and fixed several warnings + (https://github.com/fmtlib/fmt/pull/653). Thanks @alabuzhev. -- Fixed installation of `fmt/ranges.h` - (https://github.com/fmtlib/fmt/pull/738). Thanks @sv1990. +- Worked around GCC bug 67371 + (https://github.com/fmtlib/fmt/issues/682). + +- Fixed compilation with `-fno-exceptions` + (https://github.com/fmtlib/fmt/pull/655). Thanks @chenxiaolong. + +- Made `constexpr remove_prefix` gcc version check tighter + (https://github.com/fmtlib/fmt/issues/648). + +- Renamed internal type enum constants to prevent collision with + poorly written C libraries + (https://github.com/fmtlib/fmt/issues/644). + +- Added detection of `wostream operator<<` + (https://github.com/fmtlib/fmt/issues/650). + +- Fixed compilation on OpenBSD + (https://github.com/fmtlib/fmt/pull/660). Thanks @hubslave. + +- Fixed compilation on FreeBSD 12 + (https://github.com/fmtlib/fmt/pull/732). Thanks @dankm. + +- Fixed compilation when there is a mismatch between `-std` options + between the library and user code + (https://github.com/fmtlib/fmt/issues/664). + +- Fixed compilation with GCC 7 and `-std=c++11` + (https://github.com/fmtlib/fmt/issues/734). + +- Improved generated binary code on GCC 7 and older + (https://github.com/fmtlib/fmt/issues/668). + +- Fixed handling of numeric alignment with no width + (https://github.com/fmtlib/fmt/issues/675). + +- Fixed handling of empty strings in UTF8/16 converters + (https://github.com/fmtlib/fmt/pull/676). Thanks @vgalka-sl. + +- Fixed formatting of an empty `string_view` + (https://github.com/fmtlib/fmt/issues/689). + +- Fixed detection of `string_view` on libc++ + (https://github.com/fmtlib/fmt/issues/686). + +- Fixed DLL issues (https://github.com/fmtlib/fmt/pull/696). + Thanks @sebkoenig. + +- Fixed compile checks for mixing narrow and wide strings + (https://github.com/fmtlib/fmt/issues/690). + +- Disabled unsafe implicit conversion to `std::string` + (https://github.com/fmtlib/fmt/issues/729). + +- Fixed handling of reused format specs (as in `fmt::join`) for + pointers (https://github.com/fmtlib/fmt/pull/725). Thanks @mwinterb. + +- Fixed installation of `fmt/ranges.h` + (https://github.com/fmtlib/fmt/pull/738). Thanks @sv1990. # 4.1.0 - 2017-12-20 -- Added `fmt::to_wstring()` in addition to `fmt::to_string()` - (https://github.com/fmtlib/fmt/pull/559). Thanks @alabuzhev. -- Added support for C++17 `std::string_view` - (https://github.com/fmtlib/fmt/pull/571 and - https://github.com/fmtlib/fmt/pull/578). - Thanks @thelostt and @mwinterb. -- Enabled stream exceptions to catch errors - (https://github.com/fmtlib/fmt/issues/581). Thanks @crusader-mike. -- Allowed formatting of class hierarchies with `fmt::format_arg()` - (https://github.com/fmtlib/fmt/pull/547). Thanks @rollbear. -- Removed limitations on character types - (https://github.com/fmtlib/fmt/pull/563). Thanks @Yelnats321. -- Conditionally enabled use of `std::allocator_traits` - (https://github.com/fmtlib/fmt/pull/583). Thanks @mwinterb. -- Added support for `const` variadic member function emulation with - `FMT_VARIADIC_CONST` - (https://github.com/fmtlib/fmt/pull/591). Thanks @ludekvodicka. -- Various bugfixes: bad overflow check, unsupported implicit type - conversion when determining formatting function, test segfaults - (https://github.com/fmtlib/fmt/issues/551), ill-formed - macros (https://github.com/fmtlib/fmt/pull/542) and - ambiguous overloads - (https://github.com/fmtlib/fmt/issues/580). Thanks @xylosper. -- Prevented warnings on MSVC - (https://github.com/fmtlib/fmt/pull/605, - https://github.com/fmtlib/fmt/pull/602, and - https://github.com/fmtlib/fmt/pull/545), clang - (https://github.com/fmtlib/fmt/pull/582), GCC - (https://github.com/fmtlib/fmt/issues/573), various - conversion warnings (https://github.com/fmtlib/fmt/pull/609, - https://github.com/fmtlib/fmt/pull/567, - https://github.com/fmtlib/fmt/pull/553 and - https://github.com/fmtlib/fmt/pull/553), and added - `override` and `[[noreturn]]` - (https://github.com/fmtlib/fmt/pull/549 and - https://github.com/fmtlib/fmt/issues/555). - Thanks @alabuzhev, @virgiliofornazin, @alexanderbock, @yumetodo, @VaderY, - @jpcima, @thelostt and @Manu343726. -- Improved CMake: Used `GNUInstallDirs` to set installation location - (https://github.com/fmtlib/fmt/pull/610) and fixed warnings - (https://github.com/fmtlib/fmt/pull/536 and - https://github.com/fmtlib/fmt/pull/556). - Thanks @mikecrowe, @evgen231 and @henryiii. +- Added `fmt::to_wstring()` in addition to `fmt::to_string()` + (https://github.com/fmtlib/fmt/pull/559). Thanks @alabuzhev. +- Added support for C++17 `std::string_view` + (https://github.com/fmtlib/fmt/pull/571 and + https://github.com/fmtlib/fmt/pull/578). + Thanks @thelostt and @mwinterb. +- Enabled stream exceptions to catch errors + (https://github.com/fmtlib/fmt/issues/581). Thanks @crusader-mike. +- Allowed formatting of class hierarchies with `fmt::format_arg()` + (https://github.com/fmtlib/fmt/pull/547). Thanks @rollbear. +- Removed limitations on character types + (https://github.com/fmtlib/fmt/pull/563). Thanks @Yelnats321. +- Conditionally enabled use of `std::allocator_traits` + (https://github.com/fmtlib/fmt/pull/583). Thanks @mwinterb. +- Added support for `const` variadic member function emulation with + `FMT_VARIADIC_CONST` + (https://github.com/fmtlib/fmt/pull/591). Thanks @ludekvodicka. +- Various bugfixes: bad overflow check, unsupported implicit type + conversion when determining formatting function, test segfaults + (https://github.com/fmtlib/fmt/issues/551), ill-formed + macros (https://github.com/fmtlib/fmt/pull/542) and + ambiguous overloads + (https://github.com/fmtlib/fmt/issues/580). Thanks @xylosper. +- Prevented warnings on MSVC + (https://github.com/fmtlib/fmt/pull/605, + https://github.com/fmtlib/fmt/pull/602, and + https://github.com/fmtlib/fmt/pull/545), clang + (https://github.com/fmtlib/fmt/pull/582), GCC + (https://github.com/fmtlib/fmt/issues/573), various + conversion warnings (https://github.com/fmtlib/fmt/pull/609, + https://github.com/fmtlib/fmt/pull/567, + https://github.com/fmtlib/fmt/pull/553 and + https://github.com/fmtlib/fmt/pull/553), and added + `override` and `[[noreturn]]` + (https://github.com/fmtlib/fmt/pull/549 and + https://github.com/fmtlib/fmt/issues/555). + Thanks @alabuzhev, @virgiliofornazin, @alexanderbock, @yumetodo, @VaderY, + @jpcima, @thelostt and @Manu343726. +- Improved CMake: Used `GNUInstallDirs` to set installation location + (https://github.com/fmtlib/fmt/pull/610) and fixed warnings + (https://github.com/fmtlib/fmt/pull/536 and + https://github.com/fmtlib/fmt/pull/556). + Thanks @mikecrowe, @evgen231 and @henryiii. # 4.0.0 - 2017-06-27 -- Removed old compatibility headers `cppformat/*.h` and CMake options - (https://github.com/fmtlib/fmt/pull/527). Thanks @maddinat0r. +- Removed old compatibility headers `cppformat/*.h` and CMake options + (https://github.com/fmtlib/fmt/pull/527). Thanks @maddinat0r. -- Added `string.h` containing `fmt::to_string()` as alternative to - `std::to_string()` as well as other string writer functionality - (https://github.com/fmtlib/fmt/issues/326 and - https://github.com/fmtlib/fmt/pull/441): +- Added `string.h` containing `fmt::to_string()` as alternative to + `std::to_string()` as well as other string writer functionality + (https://github.com/fmtlib/fmt/issues/326 and + https://github.com/fmtlib/fmt/pull/441): - ```c++ - #include "fmt/string.h" + ```c++ + #include "fmt/string.h" - std::string answer = fmt::to_string(42); - ``` + std::string answer = fmt::to_string(42); + ``` - Thanks @glebov-andrey. + Thanks @glebov-andrey. -- Moved `fmt::printf()` to new `printf.h` header and allowed `%s` as - generic specifier (https://github.com/fmtlib/fmt/pull/453), - made `%.f` more conformant to regular `printf()` - (https://github.com/fmtlib/fmt/pull/490), added custom - writer support (https://github.com/fmtlib/fmt/issues/476) - and implemented missing custom argument formatting - (https://github.com/fmtlib/fmt/pull/339 and - https://github.com/fmtlib/fmt/pull/340): +- Moved `fmt::printf()` to new `printf.h` header and allowed `%s` as + generic specifier (https://github.com/fmtlib/fmt/pull/453), + made `%.f` more conformant to regular `printf()` + (https://github.com/fmtlib/fmt/pull/490), added custom + writer support (https://github.com/fmtlib/fmt/issues/476) + and implemented missing custom argument formatting + (https://github.com/fmtlib/fmt/pull/339 and + https://github.com/fmtlib/fmt/pull/340): - ```c++ - #include "fmt/printf.h" + ```c++ + #include "fmt/printf.h" - // %s format specifier can be used with any argument type. - fmt::printf("%s", 42); - ``` + // %s format specifier can be used with any argument type. + fmt::printf("%s", 42); + ``` - Thanks @mojoBrendan, @manylegged and @spacemoose. - See also https://github.com/fmtlib/fmt/issues/360, - https://github.com/fmtlib/fmt/issues/335 and - https://github.com/fmtlib/fmt/issues/331. + Thanks @mojoBrendan, @manylegged and @spacemoose. + See also https://github.com/fmtlib/fmt/issues/360, + https://github.com/fmtlib/fmt/issues/335 and + https://github.com/fmtlib/fmt/issues/331. -- Added `container.h` containing a `BasicContainerWriter` to write to - containers like `std::vector` - (https://github.com/fmtlib/fmt/pull/450). Thanks @polyvertex. +- Added `container.h` containing a `BasicContainerWriter` to write to + containers like `std::vector` + (https://github.com/fmtlib/fmt/pull/450). Thanks @polyvertex. -- Added `fmt::join()` function that takes a range and formats its - elements separated by a given string - (https://github.com/fmtlib/fmt/pull/466): +- Added `fmt::join()` function that takes a range and formats its + elements separated by a given string + (https://github.com/fmtlib/fmt/pull/466): - ```c++ - #include "fmt/format.h" + ```c++ + #include "fmt/format.h" - std::vector v = {1.2, 3.4, 5.6}; - // Prints "(+01.20, +03.40, +05.60)". - fmt::print("({:+06.2f})", fmt::join(v.begin(), v.end(), ", ")); - ``` + std::vector v = {1.2, 3.4, 5.6}; + // Prints "(+01.20, +03.40, +05.60)". + fmt::print("({:+06.2f})", fmt::join(v.begin(), v.end(), ", ")); + ``` - Thanks @olivier80. + Thanks @olivier80. -- Added support for custom formatting specifications to simplify - customization of built-in formatting - (https://github.com/fmtlib/fmt/pull/444). Thanks @polyvertex. - See also https://github.com/fmtlib/fmt/issues/439. +- Added support for custom formatting specifications to simplify + customization of built-in formatting + (https://github.com/fmtlib/fmt/pull/444). Thanks @polyvertex. + See also https://github.com/fmtlib/fmt/issues/439. -- Added `fmt::format_system_error()` for error code formatting - (https://github.com/fmtlib/fmt/issues/323 and - https://github.com/fmtlib/fmt/pull/526). Thanks @maddinat0r. +- Added `fmt::format_system_error()` for error code formatting + (https://github.com/fmtlib/fmt/issues/323 and + https://github.com/fmtlib/fmt/pull/526). Thanks @maddinat0r. -- Added thread-safe `fmt::localtime()` and `fmt::gmtime()` as - replacement for the standard version to `time.h` - (https://github.com/fmtlib/fmt/pull/396). Thanks @codicodi. +- Added thread-safe `fmt::localtime()` and `fmt::gmtime()` as + replacement for the standard version to `time.h` + (https://github.com/fmtlib/fmt/pull/396). Thanks @codicodi. -- Internal improvements to `NamedArg` and `ArgLists` - (https://github.com/fmtlib/fmt/pull/389 and - https://github.com/fmtlib/fmt/pull/390). Thanks @chronoxor. +- Internal improvements to `NamedArg` and `ArgLists` + (https://github.com/fmtlib/fmt/pull/389 and + https://github.com/fmtlib/fmt/pull/390). Thanks @chronoxor. -- Fixed crash due to bug in `FormatBuf` - (https://github.com/fmtlib/fmt/pull/493). Thanks @effzeh. See also - https://github.com/fmtlib/fmt/issues/480 and - https://github.com/fmtlib/fmt/issues/491. +- Fixed crash due to bug in `FormatBuf` + (https://github.com/fmtlib/fmt/pull/493). Thanks @effzeh. See also + https://github.com/fmtlib/fmt/issues/480 and + https://github.com/fmtlib/fmt/issues/491. -- Fixed handling of wide strings in `fmt::StringWriter`. +- Fixed handling of wide strings in `fmt::StringWriter`. -- Improved compiler error messages - (https://github.com/fmtlib/fmt/issues/357). +- Improved compiler error messages + (https://github.com/fmtlib/fmt/issues/357). -- Fixed various warnings and issues with various compilers - (https://github.com/fmtlib/fmt/pull/494, - https://github.com/fmtlib/fmt/pull/499, - https://github.com/fmtlib/fmt/pull/483, - https://github.com/fmtlib/fmt/pull/485, - https://github.com/fmtlib/fmt/pull/482, - https://github.com/fmtlib/fmt/pull/475, - https://github.com/fmtlib/fmt/pull/473 and - https://github.com/fmtlib/fmt/pull/414). - Thanks @chronoxor, @zhaohuaxishi, @pkestene, @dschmidt and @0x414c. +- Fixed various warnings and issues with various compilers + (https://github.com/fmtlib/fmt/pull/494, + https://github.com/fmtlib/fmt/pull/499, + https://github.com/fmtlib/fmt/pull/483, + https://github.com/fmtlib/fmt/pull/485, + https://github.com/fmtlib/fmt/pull/482, + https://github.com/fmtlib/fmt/pull/475, + https://github.com/fmtlib/fmt/pull/473 and + https://github.com/fmtlib/fmt/pull/414). + Thanks @chronoxor, @zhaohuaxishi, @pkestene, @dschmidt and @0x414c. -- Improved CMake: targets are now namespaced - (https://github.com/fmtlib/fmt/pull/511 and - https://github.com/fmtlib/fmt/pull/513), supported - header-only `printf.h` - (https://github.com/fmtlib/fmt/pull/354), fixed issue with - minimal supported library subset - (https://github.com/fmtlib/fmt/issues/418, - https://github.com/fmtlib/fmt/pull/419 and - https://github.com/fmtlib/fmt/pull/420). - Thanks @bjoernthiel, @niosHD, @LogicalKnight and @alabuzhev. +- Improved CMake: targets are now namespaced + (https://github.com/fmtlib/fmt/pull/511 and + https://github.com/fmtlib/fmt/pull/513), supported + header-only `printf.h` + (https://github.com/fmtlib/fmt/pull/354), fixed issue with + minimal supported library subset + (https://github.com/fmtlib/fmt/issues/418, + https://github.com/fmtlib/fmt/pull/419 and + https://github.com/fmtlib/fmt/pull/420). + Thanks @bjoernthiel, @niosHD, @LogicalKnight and @alabuzhev. -- Improved documentation (https://github.com/fmtlib/fmt/pull/393). - Thanks @pwm1234. +- Improved documentation (https://github.com/fmtlib/fmt/pull/393). + Thanks @pwm1234. # 3.0.2 - 2017-06-14 -- Added `FMT_VERSION` macro - (https://github.com/fmtlib/fmt/issues/411). -- Used `FMT_NULL` instead of literal `0` - (https://github.com/fmtlib/fmt/pull/409). Thanks @alabuzhev. -- Added extern templates for `format_float` - (https://github.com/fmtlib/fmt/issues/413). -- Fixed implicit conversion issue - (https://github.com/fmtlib/fmt/issues/507). -- Fixed signbit detection - (https://github.com/fmtlib/fmt/issues/423). -- Fixed naming collision - (https://github.com/fmtlib/fmt/issues/425). -- Fixed missing intrinsic for C++/CLI - (https://github.com/fmtlib/fmt/pull/457). Thanks @calumr. -- Fixed Android detection - (https://github.com/fmtlib/fmt/pull/458). Thanks @Gachapen. -- Use lean `windows.h` if not in header-only mode - (https://github.com/fmtlib/fmt/pull/503). Thanks @Quentin01. -- Fixed issue with CMake exporting C++11 flag - (https://github.com/fmtlib/fmt/pull/455). Thanks @EricWF. -- Fixed issue with nvcc and MSVC compiler bug and MinGW - (https://github.com/fmtlib/fmt/issues/505). -- Fixed DLL issues (https://github.com/fmtlib/fmt/pull/469 and - https://github.com/fmtlib/fmt/pull/502). - Thanks @richardeakin and @AndreasSchoenle. -- Fixed test compilation under FreeBSD - (https://github.com/fmtlib/fmt/issues/433). -- Fixed various warnings - (https://github.com/fmtlib/fmt/pull/403, - https://github.com/fmtlib/fmt/pull/410 and - https://github.com/fmtlib/fmt/pull/510). - Thanks @Lecetem, @chenhayat and @trozen. -- Worked around a broken `__builtin_clz` in clang with MS codegen - (https://github.com/fmtlib/fmt/issues/519). -- Removed redundant include - (https://github.com/fmtlib/fmt/issues/479). -- Fixed documentation issues. +- Added `FMT_VERSION` macro + (https://github.com/fmtlib/fmt/issues/411). +- Used `FMT_NULL` instead of literal `0` + (https://github.com/fmtlib/fmt/pull/409). Thanks @alabuzhev. +- Added extern templates for `format_float` + (https://github.com/fmtlib/fmt/issues/413). +- Fixed implicit conversion issue + (https://github.com/fmtlib/fmt/issues/507). +- Fixed signbit detection + (https://github.com/fmtlib/fmt/issues/423). +- Fixed naming collision + (https://github.com/fmtlib/fmt/issues/425). +- Fixed missing intrinsic for C++/CLI + (https://github.com/fmtlib/fmt/pull/457). Thanks @calumr. +- Fixed Android detection + (https://github.com/fmtlib/fmt/pull/458). Thanks @Gachapen. +- Use lean `windows.h` if not in header-only mode + (https://github.com/fmtlib/fmt/pull/503). Thanks @Quentin01. +- Fixed issue with CMake exporting C++11 flag + (https://github.com/fmtlib/fmt/pull/455). Thanks @EricWF. +- Fixed issue with nvcc and MSVC compiler bug and MinGW + (https://github.com/fmtlib/fmt/issues/505). +- Fixed DLL issues (https://github.com/fmtlib/fmt/pull/469 and + https://github.com/fmtlib/fmt/pull/502). + Thanks @richardeakin and @AndreasSchoenle. +- Fixed test compilation under FreeBSD + (https://github.com/fmtlib/fmt/issues/433). +- Fixed various warnings + (https://github.com/fmtlib/fmt/pull/403, + https://github.com/fmtlib/fmt/pull/410 and + https://github.com/fmtlib/fmt/pull/510). + Thanks @Lecetem, @chenhayat and @trozen. +- Worked around a broken `__builtin_clz` in clang with MS codegen + (https://github.com/fmtlib/fmt/issues/519). +- Removed redundant include + (https://github.com/fmtlib/fmt/issues/479). +- Fixed documentation issues. # 3.0.1 - 2016-11-01 -- Fixed handling of thousands separator - (https://github.com/fmtlib/fmt/issues/353). -- Fixed handling of `unsigned char` strings - (https://github.com/fmtlib/fmt/issues/373). -- Corrected buffer growth when formatting time - (https://github.com/fmtlib/fmt/issues/367). -- Removed warnings under MSVC and clang - (https://github.com/fmtlib/fmt/issues/318, - https://github.com/fmtlib/fmt/issues/250, also merged - https://github.com/fmtlib/fmt/pull/385 and - https://github.com/fmtlib/fmt/pull/361). - Thanks @jcelerier and @nmoehrle. -- Fixed compilation issues under Android - (https://github.com/fmtlib/fmt/pull/327, - https://github.com/fmtlib/fmt/issues/345 and - https://github.com/fmtlib/fmt/pull/381), FreeBSD - (https://github.com/fmtlib/fmt/pull/358), Cygwin - (https://github.com/fmtlib/fmt/issues/388), MinGW - (https://github.com/fmtlib/fmt/issues/355) as well as other - issues (https://github.com/fmtlib/fmt/issues/350, - https://github.com/fmtlib/fmt/issues/355, - https://github.com/fmtlib/fmt/pull/348, - https://github.com/fmtlib/fmt/pull/402, - https://github.com/fmtlib/fmt/pull/405). - Thanks @dpantele, @hghwng, @arvedarved, @LogicalKnight and @JanHellwig. -- Fixed some documentation issues and extended specification - (https://github.com/fmtlib/fmt/issues/320, - https://github.com/fmtlib/fmt/pull/333, - https://github.com/fmtlib/fmt/issues/347, - https://github.com/fmtlib/fmt/pull/362). Thanks @smellman. +- Fixed handling of thousands separator + (https://github.com/fmtlib/fmt/issues/353). +- Fixed handling of `unsigned char` strings + (https://github.com/fmtlib/fmt/issues/373). +- Corrected buffer growth when formatting time + (https://github.com/fmtlib/fmt/issues/367). +- Removed warnings under MSVC and clang + (https://github.com/fmtlib/fmt/issues/318, + https://github.com/fmtlib/fmt/issues/250, also merged + https://github.com/fmtlib/fmt/pull/385 and + https://github.com/fmtlib/fmt/pull/361). + Thanks @jcelerier and @nmoehrle. +- Fixed compilation issues under Android + (https://github.com/fmtlib/fmt/pull/327, + https://github.com/fmtlib/fmt/issues/345 and + https://github.com/fmtlib/fmt/pull/381), FreeBSD + (https://github.com/fmtlib/fmt/pull/358), Cygwin + (https://github.com/fmtlib/fmt/issues/388), MinGW + (https://github.com/fmtlib/fmt/issues/355) as well as other + issues (https://github.com/fmtlib/fmt/issues/350, + https://github.com/fmtlib/fmt/issues/355, + https://github.com/fmtlib/fmt/pull/348, + https://github.com/fmtlib/fmt/pull/402, + https://github.com/fmtlib/fmt/pull/405). + Thanks @dpantele, @hghwng, @arvedarved, @LogicalKnight and @JanHellwig. +- Fixed some documentation issues and extended specification + (https://github.com/fmtlib/fmt/issues/320, + https://github.com/fmtlib/fmt/pull/333, + https://github.com/fmtlib/fmt/issues/347, + https://github.com/fmtlib/fmt/pull/362). Thanks @smellman. # 3.0.0 - 2016-05-07 -- The project has been renamed from C++ Format (cppformat) to fmt for - consistency with the used namespace and macro prefix - (https://github.com/fmtlib/fmt/issues/307). Library headers - are now located in the `fmt` directory: +- The project has been renamed from C++ Format (cppformat) to fmt for + consistency with the used namespace and macro prefix + (https://github.com/fmtlib/fmt/issues/307). Library headers + are now located in the `fmt` directory: - ```c++ - #include "fmt/format.h" - ``` + ```c++ + #include "fmt/format.h" + ``` - Including `format.h` from the `cppformat` directory is deprecated - but works via a proxy header which will be removed in the next major - version. + Including `format.h` from the `cppformat` directory is deprecated + but works via a proxy header which will be removed in the next major + version. - The documentation is now available at . + The documentation is now available at . -- Added support for - [strftime](http://en.cppreference.com/w/cpp/chrono/c/strftime)-like - [date and time - formatting](https://fmt.dev/3.0.0/api.html#date-and-time-formatting) - (https://github.com/fmtlib/fmt/issues/283): +- Added support for + [strftime](http://en.cppreference.com/w/cpp/chrono/c/strftime)-like + [date and time + formatting](https://fmt.dev/3.0.0/api.html#date-and-time-formatting) + (https://github.com/fmtlib/fmt/issues/283): - ```c++ - #include "fmt/time.h" + ```c++ + #include "fmt/time.h" - std::time_t t = std::time(nullptr); - // Prints "The date is 2016-04-29." (with the current date) - fmt::print("The date is {:%Y-%m-%d}.", *std::localtime(&t)); - ``` + std::time_t t = std::time(nullptr); + // Prints "The date is 2016-04-29." (with the current date) + fmt::print("The date is {:%Y-%m-%d}.", *std::localtime(&t)); + ``` -- `std::ostream` support including formatting of user-defined types - that provide overloaded `operator<<` has been moved to - `fmt/ostream.h`: +- `std::ostream` support including formatting of user-defined types + that provide overloaded `operator<<` has been moved to + `fmt/ostream.h`: - ```c++ - #include "fmt/ostream.h" + ```c++ + #include "fmt/ostream.h" - class Date { - int year_, month_, day_; - public: - Date(int year, int month, int day) : year_(year), month_(month), day_(day) {} + class Date { + int year_, month_, day_; + public: + Date(int year, int month, int day) : year_(year), month_(month), day_(day) {} - friend std::ostream &operator<<(std::ostream &os, const Date &d) { - return os << d.year_ << '-' << d.month_ << '-' << d.day_; - } - }; + friend std::ostream &operator<<(std::ostream &os, const Date &d) { + return os << d.year_ << '-' << d.month_ << '-' << d.day_; + } + }; - std::string s = fmt::format("The date is {}", Date(2012, 12, 9)); - // s == "The date is 2012-12-9" - ``` + std::string s = fmt::format("The date is {}", Date(2012, 12, 9)); + // s == "The date is 2012-12-9" + ``` -- Added support for [custom argument - formatters](https://fmt.dev/3.0.0/api.html#argument-formatters) - (https://github.com/fmtlib/fmt/issues/235). +- Added support for [custom argument + formatters](https://fmt.dev/3.0.0/api.html#argument-formatters) + (https://github.com/fmtlib/fmt/issues/235). -- Added support for locale-specific integer formatting with the `n` - specifier (https://github.com/fmtlib/fmt/issues/305): +- Added support for locale-specific integer formatting with the `n` + specifier (https://github.com/fmtlib/fmt/issues/305): - ```c++ - std::setlocale(LC_ALL, "en_US.utf8"); - fmt::print("cppformat: {:n}\n", 1234567); // prints 1,234,567 - ``` + ```c++ + std::setlocale(LC_ALL, "en_US.utf8"); + fmt::print("cppformat: {:n}\n", 1234567); // prints 1,234,567 + ``` -- Sign is now preserved when formatting an integer with an incorrect - `printf` format specifier - (https://github.com/fmtlib/fmt/issues/265): +- Sign is now preserved when formatting an integer with an incorrect + `printf` format specifier + (https://github.com/fmtlib/fmt/issues/265): - ```c++ - fmt::printf("%lld", -42); // prints -42 - ``` + ```c++ + fmt::printf("%lld", -42); // prints -42 + ``` - Note that it would be an undefined behavior in `std::printf`. + Note that it would be an undefined behavior in `std::printf`. -- Length modifiers such as `ll` are now optional in printf formatting - functions and the correct type is determined automatically - (https://github.com/fmtlib/fmt/issues/255): +- Length modifiers such as `ll` are now optional in printf formatting + functions and the correct type is determined automatically + (https://github.com/fmtlib/fmt/issues/255): - ```c++ - fmt::printf("%d", std::numeric_limits::max()); - ``` + ```c++ + fmt::printf("%d", std::numeric_limits::max()); + ``` - Note that it would be an undefined behavior in `std::printf`. + Note that it would be an undefined behavior in `std::printf`. -- Added initial support for custom formatters - (https://github.com/fmtlib/fmt/issues/231). +- Added initial support for custom formatters + (https://github.com/fmtlib/fmt/issues/231). -- Fixed detection of user-defined literal support on Intel C++ - compiler (https://github.com/fmtlib/fmt/issues/311, - https://github.com/fmtlib/fmt/pull/312). - Thanks @dean0x7d and @speth. +- Fixed detection of user-defined literal support on Intel C++ + compiler (https://github.com/fmtlib/fmt/issues/311, + https://github.com/fmtlib/fmt/pull/312). + Thanks @dean0x7d and @speth. -- Reduced compile time - (https://github.com/fmtlib/fmt/pull/243, - https://github.com/fmtlib/fmt/pull/249, - https://github.com/fmtlib/fmt/issues/317): +- Reduced compile time + (https://github.com/fmtlib/fmt/pull/243, + https://github.com/fmtlib/fmt/pull/249, + https://github.com/fmtlib/fmt/issues/317): - ![](https://cloud.githubusercontent.com/assets/4831417/11614060/b9e826d2-9c36-11e5-8666-d4131bf503ef.png) + ![](https://cloud.githubusercontent.com/assets/4831417/11614060/b9e826d2-9c36-11e5-8666-d4131bf503ef.png) - ![](https://cloud.githubusercontent.com/assets/4831417/11614080/6ac903cc-9c37-11e5-8165-26df6efae364.png) + ![](https://cloud.githubusercontent.com/assets/4831417/11614080/6ac903cc-9c37-11e5-8165-26df6efae364.png) - Thanks @dean0x7d. + Thanks @dean0x7d. -- Compile test fixes (https://github.com/fmtlib/fmt/pull/313). - Thanks @dean0x7d. +- Compile test fixes (https://github.com/fmtlib/fmt/pull/313). + Thanks @dean0x7d. -- Documentation fixes (https://github.com/fmtlib/fmt/pull/239, - https://github.com/fmtlib/fmt/issues/248, - https://github.com/fmtlib/fmt/issues/252, - https://github.com/fmtlib/fmt/pull/258, - https://github.com/fmtlib/fmt/issues/260, - https://github.com/fmtlib/fmt/issues/301, - https://github.com/fmtlib/fmt/pull/309). - Thanks @ReadmeCritic @Gachapen and @jwilk. +- Documentation fixes (https://github.com/fmtlib/fmt/pull/239, + https://github.com/fmtlib/fmt/issues/248, + https://github.com/fmtlib/fmt/issues/252, + https://github.com/fmtlib/fmt/pull/258, + https://github.com/fmtlib/fmt/issues/260, + https://github.com/fmtlib/fmt/issues/301, + https://github.com/fmtlib/fmt/pull/309). + Thanks @ReadmeCritic @Gachapen and @jwilk. -- Fixed compiler and sanitizer warnings - (https://github.com/fmtlib/fmt/issues/244, - https://github.com/fmtlib/fmt/pull/256, - https://github.com/fmtlib/fmt/pull/259, - https://github.com/fmtlib/fmt/issues/263, - https://github.com/fmtlib/fmt/issues/274, - https://github.com/fmtlib/fmt/pull/277, - https://github.com/fmtlib/fmt/pull/286, - https://github.com/fmtlib/fmt/issues/291, - https://github.com/fmtlib/fmt/issues/296, - https://github.com/fmtlib/fmt/issues/308). - Thanks @mwinterb, @pweiskircher and @Naios. +- Fixed compiler and sanitizer warnings + (https://github.com/fmtlib/fmt/issues/244, + https://github.com/fmtlib/fmt/pull/256, + https://github.com/fmtlib/fmt/pull/259, + https://github.com/fmtlib/fmt/issues/263, + https://github.com/fmtlib/fmt/issues/274, + https://github.com/fmtlib/fmt/pull/277, + https://github.com/fmtlib/fmt/pull/286, + https://github.com/fmtlib/fmt/issues/291, + https://github.com/fmtlib/fmt/issues/296, + https://github.com/fmtlib/fmt/issues/308). + Thanks @mwinterb, @pweiskircher and @Naios. -- Improved compatibility with Windows Store apps - (https://github.com/fmtlib/fmt/issues/280, - https://github.com/fmtlib/fmt/pull/285) Thanks @mwinterb. +- Improved compatibility with Windows Store apps + (https://github.com/fmtlib/fmt/issues/280, + https://github.com/fmtlib/fmt/pull/285) Thanks @mwinterb. -- Added tests of compatibility with older C++ standards - (https://github.com/fmtlib/fmt/pull/273). Thanks @niosHD. +- Added tests of compatibility with older C++ standards + (https://github.com/fmtlib/fmt/pull/273). Thanks @niosHD. -- Fixed Android build - (https://github.com/fmtlib/fmt/pull/271). Thanks @newnon. +- Fixed Android build + (https://github.com/fmtlib/fmt/pull/271). Thanks @newnon. -- Changed `ArgMap` to be backed by a vector instead of a map. - (https://github.com/fmtlib/fmt/issues/261, - https://github.com/fmtlib/fmt/pull/262). Thanks @mwinterb. +- Changed `ArgMap` to be backed by a vector instead of a map. + (https://github.com/fmtlib/fmt/issues/261, + https://github.com/fmtlib/fmt/pull/262). Thanks @mwinterb. -- Added `fprintf` overload that writes to a `std::ostream` - (https://github.com/fmtlib/fmt/pull/251). - Thanks @nickhutchinson. +- Added `fprintf` overload that writes to a `std::ostream` + (https://github.com/fmtlib/fmt/pull/251). + Thanks @nickhutchinson. -- Export symbols when building a Windows DLL - (https://github.com/fmtlib/fmt/pull/245). - Thanks @macdems. +- Export symbols when building a Windows DLL + (https://github.com/fmtlib/fmt/pull/245). + Thanks @macdems. -- Fixed compilation on Cygwin - (https://github.com/fmtlib/fmt/issues/304). +- Fixed compilation on Cygwin + (https://github.com/fmtlib/fmt/issues/304). -- Implemented a workaround for a bug in Apple LLVM version 4.2 of - clang (https://github.com/fmtlib/fmt/issues/276). +- Implemented a workaround for a bug in Apple LLVM version 4.2 of + clang (https://github.com/fmtlib/fmt/issues/276). -- Implemented a workaround for Google Test bug - https://github.com/google/googletest/issues/705 on gcc 6 - (https://github.com/fmtlib/fmt/issues/268). Thanks @octoploid. +- Implemented a workaround for Google Test bug + https://github.com/google/googletest/issues/705 on gcc 6 + (https://github.com/fmtlib/fmt/issues/268). Thanks @octoploid. -- Removed Biicode support because the latter has been discontinued. +- Removed Biicode support because the latter has been discontinued. # 2.1.1 - 2016-04-11 -- The install location for generated CMake files is now configurable - via the `FMT_CMAKE_DIR` CMake variable - (https://github.com/fmtlib/fmt/pull/299). Thanks @niosHD. -- Documentation fixes - (https://github.com/fmtlib/fmt/issues/252). +- The install location for generated CMake files is now configurable + via the `FMT_CMAKE_DIR` CMake variable + (https://github.com/fmtlib/fmt/pull/299). Thanks @niosHD. +- Documentation fixes + (https://github.com/fmtlib/fmt/issues/252). # 2.1.0 - 2016-03-21 -- Project layout and build system improvements - (https://github.com/fmtlib/fmt/pull/267): +- Project layout and build system improvements + (https://github.com/fmtlib/fmt/pull/267): - - The code have been moved to the `cppformat` directory. Including - `format.h` from the top-level directory is deprecated but works - via a proxy header which will be removed in the next major - version. - - C++ Format CMake targets now have proper interface definitions. - - Installed version of the library now supports the header-only - configuration. - - Targets `doc`, `install`, and `test` are now disabled if C++ - Format is included as a CMake subproject. They can be enabled by - setting `FMT_DOC`, `FMT_INSTALL`, and `FMT_TEST` in the parent - project. + - The code have been moved to the `cppformat` directory. Including + `format.h` from the top-level directory is deprecated but works + via a proxy header which will be removed in the next major + version. + - C++ Format CMake targets now have proper interface definitions. + - Installed version of the library now supports the header-only + configuration. + - Targets `doc`, `install`, and `test` are now disabled if C++ + Format is included as a CMake subproject. They can be enabled by + setting `FMT_DOC`, `FMT_INSTALL`, and `FMT_TEST` in the parent + project. - Thanks @niosHD. + Thanks @niosHD. # 2.0.1 - 2016-03-13 -- Improved CMake find and package support - (https://github.com/fmtlib/fmt/issues/264). Thanks @niosHD. -- Fix compile error with Android NDK and mingw32 - (https://github.com/fmtlib/fmt/issues/241). Thanks @Gachapen. -- Documentation fixes - (https://github.com/fmtlib/fmt/issues/248, - https://github.com/fmtlib/fmt/issues/260). +- Improved CMake find and package support + (https://github.com/fmtlib/fmt/issues/264). Thanks @niosHD. +- Fix compile error with Android NDK and mingw32 + (https://github.com/fmtlib/fmt/issues/241). Thanks @Gachapen. +- Documentation fixes + (https://github.com/fmtlib/fmt/issues/248, + https://github.com/fmtlib/fmt/issues/260). # 2.0.0 - 2015-12-01 ## General -- \[Breaking\] Named arguments - (https://github.com/fmtlib/fmt/pull/169, - https://github.com/fmtlib/fmt/pull/173, - https://github.com/fmtlib/fmt/pull/174): +- \[Breaking\] Named arguments + (https://github.com/fmtlib/fmt/pull/169, + https://github.com/fmtlib/fmt/pull/173, + https://github.com/fmtlib/fmt/pull/174): - ```c++ - fmt::print("The answer is {answer}.", fmt::arg("answer", 42)); - ``` + ```c++ + fmt::print("The answer is {answer}.", fmt::arg("answer", 42)); + ``` - Thanks @jamboree. + Thanks @jamboree. -- \[Experimental\] User-defined literals for format and named - arguments (https://github.com/fmtlib/fmt/pull/204, - https://github.com/fmtlib/fmt/pull/206, - https://github.com/fmtlib/fmt/pull/207): +- \[Experimental\] User-defined literals for format and named + arguments (https://github.com/fmtlib/fmt/pull/204, + https://github.com/fmtlib/fmt/pull/206, + https://github.com/fmtlib/fmt/pull/207): - ```c++ - using namespace fmt::literals; - fmt::print("The answer is {answer}.", "answer"_a=42); - ``` + ```c++ + using namespace fmt::literals; + fmt::print("The answer is {answer}.", "answer"_a=42); + ``` - Thanks @dean0x7d. + Thanks @dean0x7d. -- \[Breaking\] Formatting of more than 16 arguments is now supported - when using variadic templates - (https://github.com/fmtlib/fmt/issues/141). Thanks @Shauren. +- \[Breaking\] Formatting of more than 16 arguments is now supported + when using variadic templates + (https://github.com/fmtlib/fmt/issues/141). Thanks @Shauren. -- Runtime width specification - (https://github.com/fmtlib/fmt/pull/168): +- Runtime width specification + (https://github.com/fmtlib/fmt/pull/168): - ```c++ - fmt::format("{0:{1}}", 42, 5); // gives " 42" - ``` + ```c++ + fmt::format("{0:{1}}", 42, 5); // gives " 42" + ``` - Thanks @jamboree. + Thanks @jamboree. -- \[Breaking\] Enums are now formatted with an overloaded - `std::ostream` insertion operator (`operator<<`) if available - (https://github.com/fmtlib/fmt/issues/232). +- \[Breaking\] Enums are now formatted with an overloaded + `std::ostream` insertion operator (`operator<<`) if available + (https://github.com/fmtlib/fmt/issues/232). -- \[Breaking\] Changed default `bool` format to textual, \"true\" or - \"false\" (https://github.com/fmtlib/fmt/issues/170): +- \[Breaking\] Changed default `bool` format to textual, \"true\" or + \"false\" (https://github.com/fmtlib/fmt/issues/170): - ```c++ - fmt::print("{}", true); // prints "true" - ``` + ```c++ + fmt::print("{}", true); // prints "true" + ``` - To print `bool` as a number use numeric format specifier such as - `d`: + To print `bool` as a number use numeric format specifier such as + `d`: - ```c++ - fmt::print("{:d}", true); // prints "1" - ``` + ```c++ + fmt::print("{:d}", true); // prints "1" + ``` -- `fmt::printf` and `fmt::sprintf` now support formatting of `bool` - with the `%s` specifier giving textual output, \"true\" or \"false\" - (https://github.com/fmtlib/fmt/pull/223): +- `fmt::printf` and `fmt::sprintf` now support formatting of `bool` + with the `%s` specifier giving textual output, \"true\" or \"false\" + (https://github.com/fmtlib/fmt/pull/223): - ```c++ - fmt::printf("%s", true); // prints "true" - ``` + ```c++ + fmt::printf("%s", true); // prints "true" + ``` - Thanks @LarsGullik. + Thanks @LarsGullik. -- \[Breaking\] `signed char` and `unsigned char` are now formatted as - integers by default - (https://github.com/fmtlib/fmt/pull/217). +- \[Breaking\] `signed char` and `unsigned char` are now formatted as + integers by default + (https://github.com/fmtlib/fmt/pull/217). -- \[Breaking\] Pointers to C strings can now be formatted with the `p` - specifier (https://github.com/fmtlib/fmt/pull/223): +- \[Breaking\] Pointers to C strings can now be formatted with the `p` + specifier (https://github.com/fmtlib/fmt/pull/223): - ```c++ - fmt::print("{:p}", "test"); // prints pointer value - ``` + ```c++ + fmt::print("{:p}", "test"); // prints pointer value + ``` - Thanks @LarsGullik. + Thanks @LarsGullik. -- \[Breaking\] `fmt::printf` and `fmt::sprintf` now print null - pointers as `(nil)` and null strings as `(null)` for consistency - with glibc (https://github.com/fmtlib/fmt/pull/226). - Thanks @LarsGullik. +- \[Breaking\] `fmt::printf` and `fmt::sprintf` now print null + pointers as `(nil)` and null strings as `(null)` for consistency + with glibc (https://github.com/fmtlib/fmt/pull/226). + Thanks @LarsGullik. -- \[Breaking\] `fmt::(s)printf` now supports formatting of objects of - user-defined types that provide an overloaded `std::ostream` - insertion operator (`operator<<`) - (https://github.com/fmtlib/fmt/issues/201): +- \[Breaking\] `fmt::(s)printf` now supports formatting of objects of + user-defined types that provide an overloaded `std::ostream` + insertion operator (`operator<<`) + (https://github.com/fmtlib/fmt/issues/201): - ```c++ - fmt::printf("The date is %s", Date(2012, 12, 9)); - ``` + ```c++ + fmt::printf("The date is %s", Date(2012, 12, 9)); + ``` -- \[Breaking\] The `Buffer` template is now part of the public API and - can be used to implement custom memory buffers - (https://github.com/fmtlib/fmt/issues/140). Thanks @polyvertex. +- \[Breaking\] The `Buffer` template is now part of the public API and + can be used to implement custom memory buffers + (https://github.com/fmtlib/fmt/issues/140). Thanks @polyvertex. -- \[Breaking\] Improved compatibility between `BasicStringRef` and - [std::experimental::basic_string_view]( - http://en.cppreference.com/w/cpp/experimental/basic_string_view) - (https://github.com/fmtlib/fmt/issues/100, - https://github.com/fmtlib/fmt/issues/159, - https://github.com/fmtlib/fmt/issues/183): +- \[Breaking\] Improved compatibility between `BasicStringRef` and + [std::experimental::basic_string_view]( + http://en.cppreference.com/w/cpp/experimental/basic_string_view) + (https://github.com/fmtlib/fmt/issues/100, + https://github.com/fmtlib/fmt/issues/159, + https://github.com/fmtlib/fmt/issues/183): - - Comparison operators now compare string content, not pointers - - `BasicStringRef::c_str` replaced by `BasicStringRef::data` - - `BasicStringRef` is no longer assumed to be null-terminated + - Comparison operators now compare string content, not pointers + - `BasicStringRef::c_str` replaced by `BasicStringRef::data` + - `BasicStringRef` is no longer assumed to be null-terminated - References to null-terminated strings are now represented by a new - class, `BasicCStringRef`. + References to null-terminated strings are now represented by a new + class, `BasicCStringRef`. -- Dependency on pthreads introduced by Google Test is now optional - (https://github.com/fmtlib/fmt/issues/185). +- Dependency on pthreads introduced by Google Test is now optional + (https://github.com/fmtlib/fmt/issues/185). -- New CMake options `FMT_DOC`, `FMT_INSTALL` and `FMT_TEST` to control - generation of `doc`, `install` and `test` targets respectively, on - by default (https://github.com/fmtlib/fmt/issues/197, - https://github.com/fmtlib/fmt/issues/198, - https://github.com/fmtlib/fmt/issues/200). Thanks @maddinat0r. +- New CMake options `FMT_DOC`, `FMT_INSTALL` and `FMT_TEST` to control + generation of `doc`, `install` and `test` targets respectively, on + by default (https://github.com/fmtlib/fmt/issues/197, + https://github.com/fmtlib/fmt/issues/198, + https://github.com/fmtlib/fmt/issues/200). Thanks @maddinat0r. -- `noexcept` is now used when compiling with MSVC2015 - (https://github.com/fmtlib/fmt/pull/215). Thanks @dmkrepo. +- `noexcept` is now used when compiling with MSVC2015 + (https://github.com/fmtlib/fmt/pull/215). Thanks @dmkrepo. -- Added an option to disable use of `windows.h` when - `FMT_USE_WINDOWS_H` is defined as 0 before including `format.h` - (https://github.com/fmtlib/fmt/issues/171). Thanks @alfps. +- Added an option to disable use of `windows.h` when + `FMT_USE_WINDOWS_H` is defined as 0 before including `format.h` + (https://github.com/fmtlib/fmt/issues/171). Thanks @alfps. -- \[Breaking\] `windows.h` is now included with `NOMINMAX` unless - `FMT_WIN_MINMAX` is defined. This is done to prevent breaking code - using `std::min` and `std::max` and only affects the header-only - configuration (https://github.com/fmtlib/fmt/issues/152, - https://github.com/fmtlib/fmt/pull/153, - https://github.com/fmtlib/fmt/pull/154). Thanks @DevO2012. +- \[Breaking\] `windows.h` is now included with `NOMINMAX` unless + `FMT_WIN_MINMAX` is defined. This is done to prevent breaking code + using `std::min` and `std::max` and only affects the header-only + configuration (https://github.com/fmtlib/fmt/issues/152, + https://github.com/fmtlib/fmt/pull/153, + https://github.com/fmtlib/fmt/pull/154). Thanks @DevO2012. -- Improved support for custom character types - (https://github.com/fmtlib/fmt/issues/171). Thanks @alfps. +- Improved support for custom character types + (https://github.com/fmtlib/fmt/issues/171). Thanks @alfps. -- Added an option to disable use of IOStreams when `FMT_USE_IOSTREAMS` - is defined as 0 before including `format.h` - (https://github.com/fmtlib/fmt/issues/205, - https://github.com/fmtlib/fmt/pull/208). Thanks @JodiTheTigger. +- Added an option to disable use of IOStreams when `FMT_USE_IOSTREAMS` + is defined as 0 before including `format.h` + (https://github.com/fmtlib/fmt/issues/205, + https://github.com/fmtlib/fmt/pull/208). Thanks @JodiTheTigger. -- Improved detection of `isnan`, `isinf` and `signbit`. +- Improved detection of `isnan`, `isinf` and `signbit`. ## Optimization -- Made formatting of user-defined types more efficient with a custom - stream buffer (https://github.com/fmtlib/fmt/issues/92, - https://github.com/fmtlib/fmt/pull/230). Thanks @NotImplemented. -- Further improved performance of `fmt::Writer` on integer formatting - and fixed a minor regression. Now it is \~7% faster than - `karma::generate` on Karma\'s benchmark - (https://github.com/fmtlib/fmt/issues/186). -- \[Breaking\] Reduced [compiled code - size](https://github.com/fmtlib/fmt#compile-time-and-code-bloat) - (https://github.com/fmtlib/fmt/issues/143, - https://github.com/fmtlib/fmt/pull/149). +- Made formatting of user-defined types more efficient with a custom + stream buffer (https://github.com/fmtlib/fmt/issues/92, + https://github.com/fmtlib/fmt/pull/230). Thanks @NotImplemented. +- Further improved performance of `fmt::Writer` on integer formatting + and fixed a minor regression. Now it is \~7% faster than + `karma::generate` on Karma\'s benchmark + (https://github.com/fmtlib/fmt/issues/186). +- \[Breaking\] Reduced [compiled code + size](https://github.com/fmtlib/fmt#compile-time-and-code-bloat) + (https://github.com/fmtlib/fmt/issues/143, + https://github.com/fmtlib/fmt/pull/149). ## Distribution -- \[Breaking\] Headers are now installed in - `${CMAKE_INSTALL_PREFIX}/include/cppformat` - (https://github.com/fmtlib/fmt/issues/178). Thanks @jackyf. +- \[Breaking\] Headers are now installed in + `${CMAKE_INSTALL_PREFIX}/include/cppformat` + (https://github.com/fmtlib/fmt/issues/178). Thanks @jackyf. -- \[Breaking\] Changed the library name from `format` to `cppformat` - for consistency with the project name and to avoid potential - conflicts (https://github.com/fmtlib/fmt/issues/178). - Thanks @jackyf. +- \[Breaking\] Changed the library name from `format` to `cppformat` + for consistency with the project name and to avoid potential + conflicts (https://github.com/fmtlib/fmt/issues/178). + Thanks @jackyf. -- C++ Format is now available in [Debian](https://www.debian.org/) - GNU/Linux - ([stretch](https://packages.debian.org/source/stretch/cppformat), - [sid](https://packages.debian.org/source/sid/cppformat)) and derived - distributions such as - [Ubuntu](https://launchpad.net/ubuntu/+source/cppformat) 15.10 and - later (https://github.com/fmtlib/fmt/issues/155): +- C++ Format is now available in [Debian](https://www.debian.org/) + GNU/Linux + ([stretch](https://packages.debian.org/source/stretch/cppformat), + [sid](https://packages.debian.org/source/sid/cppformat)) and derived + distributions such as + [Ubuntu](https://launchpad.net/ubuntu/+source/cppformat) 15.10 and + later (https://github.com/fmtlib/fmt/issues/155): - $ sudo apt-get install libcppformat1-dev + $ sudo apt-get install libcppformat1-dev - Thanks @jackyf. + Thanks @jackyf. -- [Packages for Fedora and - RHEL](https://admin.fedoraproject.org/pkgdb/package/cppformat/) are - now available. Thanks Dave Johansen. +- [Packages for Fedora and + RHEL](https://admin.fedoraproject.org/pkgdb/package/cppformat/) are + now available. Thanks Dave Johansen. -- C++ Format can now be installed via [Homebrew](http://brew.sh/) on - OS X (https://github.com/fmtlib/fmt/issues/157): +- C++ Format can now be installed via [Homebrew](http://brew.sh/) on + OS X (https://github.com/fmtlib/fmt/issues/157): - $ brew install cppformat + $ brew install cppformat - Thanks @ortho and Anatoliy Bulukin. + Thanks @ortho and Anatoliy Bulukin. ## Documentation -- Migrated from ReadTheDocs to GitHub Pages for better responsiveness - and reliability (https://github.com/fmtlib/fmt/issues/128). - New documentation address is . -- Added [Building thedocumentation]( - https://fmt.dev/2.0.0/usage.html#building-the-documentation) - section to the documentation. -- Documentation build script is now compatible with Python 3 and newer - pip versions. (https://github.com/fmtlib/fmt/pull/189, - https://github.com/fmtlib/fmt/issues/209). - Thanks @JodiTheTigger and @xentec. -- Documentation fixes and improvements - (https://github.com/fmtlib/fmt/issues/36, - https://github.com/fmtlib/fmt/issues/75, - https://github.com/fmtlib/fmt/issues/125, - https://github.com/fmtlib/fmt/pull/160, - https://github.com/fmtlib/fmt/pull/161, - https://github.com/fmtlib/fmt/issues/162, - https://github.com/fmtlib/fmt/issues/165, - https://github.com/fmtlib/fmt/issues/210). - Thanks @syohex. -- Fixed out-of-tree documentation build - (https://github.com/fmtlib/fmt/issues/177). Thanks @jackyf. +- Migrated from ReadTheDocs to GitHub Pages for better responsiveness + and reliability (https://github.com/fmtlib/fmt/issues/128). + New documentation address is . +- Added [Building thedocumentation]( + https://fmt.dev/2.0.0/usage.html#building-the-documentation) + section to the documentation. +- Documentation build script is now compatible with Python 3 and newer + pip versions. (https://github.com/fmtlib/fmt/pull/189, + https://github.com/fmtlib/fmt/issues/209). + Thanks @JodiTheTigger and @xentec. +- Documentation fixes and improvements + (https://github.com/fmtlib/fmt/issues/36, + https://github.com/fmtlib/fmt/issues/75, + https://github.com/fmtlib/fmt/issues/125, + https://github.com/fmtlib/fmt/pull/160, + https://github.com/fmtlib/fmt/pull/161, + https://github.com/fmtlib/fmt/issues/162, + https://github.com/fmtlib/fmt/issues/165, + https://github.com/fmtlib/fmt/issues/210). + Thanks @syohex. +- Fixed out-of-tree documentation build + (https://github.com/fmtlib/fmt/issues/177). Thanks @jackyf. ## Fixes -- Fixed `initializer_list` detection - (https://github.com/fmtlib/fmt/issues/136). Thanks @Gachapen. +- Fixed `initializer_list` detection + (https://github.com/fmtlib/fmt/issues/136). Thanks @Gachapen. -- \[Breaking\] Fixed formatting of enums with numeric format - specifiers in `fmt::(s)printf` - (https://github.com/fmtlib/fmt/issues/131, - https://github.com/fmtlib/fmt/issues/139): +- \[Breaking\] Fixed formatting of enums with numeric format + specifiers in `fmt::(s)printf` + (https://github.com/fmtlib/fmt/issues/131, + https://github.com/fmtlib/fmt/issues/139): - ```c++ - enum { ANSWER = 42 }; - fmt::printf("%d", ANSWER); - ``` + ```c++ + enum { ANSWER = 42 }; + fmt::printf("%d", ANSWER); + ``` - Thanks @Naios. + Thanks @Naios. -- Improved compatibility with old versions of MinGW - (https://github.com/fmtlib/fmt/issues/129, - https://github.com/fmtlib/fmt/pull/130, - https://github.com/fmtlib/fmt/issues/132). Thanks @cstamford. +- Improved compatibility with old versions of MinGW + (https://github.com/fmtlib/fmt/issues/129, + https://github.com/fmtlib/fmt/pull/130, + https://github.com/fmtlib/fmt/issues/132). Thanks @cstamford. -- Fixed a compile error on MSVC with disabled exceptions - (https://github.com/fmtlib/fmt/issues/144). +- Fixed a compile error on MSVC with disabled exceptions + (https://github.com/fmtlib/fmt/issues/144). -- Added a workaround for broken implementation of variadic templates - in MSVC2012 (https://github.com/fmtlib/fmt/issues/148). +- Added a workaround for broken implementation of variadic templates + in MSVC2012 (https://github.com/fmtlib/fmt/issues/148). -- Placed the anonymous namespace within `fmt` namespace for the - header-only configuration (https://github.com/fmtlib/fmt/issues/171). - Thanks @alfps. +- Placed the anonymous namespace within `fmt` namespace for the + header-only configuration (https://github.com/fmtlib/fmt/issues/171). + Thanks @alfps. -- Fixed issues reported by Coverity Scan - (https://github.com/fmtlib/fmt/issues/187, - https://github.com/fmtlib/fmt/issues/192). +- Fixed issues reported by Coverity Scan + (https://github.com/fmtlib/fmt/issues/187, + https://github.com/fmtlib/fmt/issues/192). -- Implemented a workaround for a name lookup bug in MSVC2010 - (https://github.com/fmtlib/fmt/issues/188). +- Implemented a workaround for a name lookup bug in MSVC2010 + (https://github.com/fmtlib/fmt/issues/188). -- Fixed compiler warnings - (https://github.com/fmtlib/fmt/issues/95, - https://github.com/fmtlib/fmt/issues/96, - https://github.com/fmtlib/fmt/pull/114, - https://github.com/fmtlib/fmt/issues/135, - https://github.com/fmtlib/fmt/issues/142, - https://github.com/fmtlib/fmt/issues/145, - https://github.com/fmtlib/fmt/issues/146, - https://github.com/fmtlib/fmt/issues/158, - https://github.com/fmtlib/fmt/issues/163, - https://github.com/fmtlib/fmt/issues/175, - https://github.com/fmtlib/fmt/issues/190, - https://github.com/fmtlib/fmt/pull/191, - https://github.com/fmtlib/fmt/issues/194, - https://github.com/fmtlib/fmt/pull/196, - https://github.com/fmtlib/fmt/issues/216, - https://github.com/fmtlib/fmt/pull/218, - https://github.com/fmtlib/fmt/pull/220, - https://github.com/fmtlib/fmt/pull/229, - https://github.com/fmtlib/fmt/issues/233, - https://github.com/fmtlib/fmt/issues/234, - https://github.com/fmtlib/fmt/pull/236, - https://github.com/fmtlib/fmt/issues/281, - https://github.com/fmtlib/fmt/issues/289). - Thanks @seanmiddleditch, @dixlorenz, @CarterLi, @Naios, @fmatthew5876, - @LevskiWeng, @rpopescu, @gabime, @cubicool, @jkflying, @LogicalKnight, - @inguin and @Jopie64. +- Fixed compiler warnings + (https://github.com/fmtlib/fmt/issues/95, + https://github.com/fmtlib/fmt/issues/96, + https://github.com/fmtlib/fmt/pull/114, + https://github.com/fmtlib/fmt/issues/135, + https://github.com/fmtlib/fmt/issues/142, + https://github.com/fmtlib/fmt/issues/145, + https://github.com/fmtlib/fmt/issues/146, + https://github.com/fmtlib/fmt/issues/158, + https://github.com/fmtlib/fmt/issues/163, + https://github.com/fmtlib/fmt/issues/175, + https://github.com/fmtlib/fmt/issues/190, + https://github.com/fmtlib/fmt/pull/191, + https://github.com/fmtlib/fmt/issues/194, + https://github.com/fmtlib/fmt/pull/196, + https://github.com/fmtlib/fmt/issues/216, + https://github.com/fmtlib/fmt/pull/218, + https://github.com/fmtlib/fmt/pull/220, + https://github.com/fmtlib/fmt/pull/229, + https://github.com/fmtlib/fmt/issues/233, + https://github.com/fmtlib/fmt/issues/234, + https://github.com/fmtlib/fmt/pull/236, + https://github.com/fmtlib/fmt/issues/281, + https://github.com/fmtlib/fmt/issues/289). + Thanks @seanmiddleditch, @dixlorenz, @CarterLi, @Naios, @fmatthew5876, + @LevskiWeng, @rpopescu, @gabime, @cubicool, @jkflying, @LogicalKnight, + @inguin and @Jopie64. -- Fixed portability issues (mostly causing test failures) on ARM, - ppc64, ppc64le, s390x and SunOS 5.11 i386 - (https://github.com/fmtlib/fmt/issues/138, - https://github.com/fmtlib/fmt/issues/179, - https://github.com/fmtlib/fmt/issues/180, - https://github.com/fmtlib/fmt/issues/202, - https://github.com/fmtlib/fmt/issues/225, [Red Hat Bugzilla - Bug 1260297](https://bugzilla.redhat.com/show_bug.cgi?id=1260297)). - Thanks @Naios, @jackyf and Dave Johansen. +- Fixed portability issues (mostly causing test failures) on ARM, + ppc64, ppc64le, s390x and SunOS 5.11 i386 + (https://github.com/fmtlib/fmt/issues/138, + https://github.com/fmtlib/fmt/issues/179, + https://github.com/fmtlib/fmt/issues/180, + https://github.com/fmtlib/fmt/issues/202, + https://github.com/fmtlib/fmt/issues/225, [Red Hat Bugzilla + Bug 1260297](https://bugzilla.redhat.com/show_bug.cgi?id=1260297)). + Thanks @Naios, @jackyf and Dave Johansen. -- Fixed a name conflict with macro `free` defined in `crtdbg.h` when - `_CRTDBG_MAP_ALLOC` is set (https://github.com/fmtlib/fmt/issues/211). +- Fixed a name conflict with macro `free` defined in `crtdbg.h` when + `_CRTDBG_MAP_ALLOC` is set (https://github.com/fmtlib/fmt/issues/211). -- Fixed shared library build on OS X - (https://github.com/fmtlib/fmt/pull/212). Thanks @dean0x7d. +- Fixed shared library build on OS X + (https://github.com/fmtlib/fmt/pull/212). Thanks @dean0x7d. -- Fixed an overload conflict on MSVC when `/Zc:wchar_t-` option is - specified (https://github.com/fmtlib/fmt/pull/214). - Thanks @slavanap. +- Fixed an overload conflict on MSVC when `/Zc:wchar_t-` option is + specified (https://github.com/fmtlib/fmt/pull/214). + Thanks @slavanap. -- Improved compatibility with MSVC 2008 - (https://github.com/fmtlib/fmt/pull/236). Thanks @Jopie64. +- Improved compatibility with MSVC 2008 + (https://github.com/fmtlib/fmt/pull/236). Thanks @Jopie64. -- Improved compatibility with bcc32 - (https://github.com/fmtlib/fmt/issues/227). +- Improved compatibility with bcc32 + (https://github.com/fmtlib/fmt/issues/227). -- Fixed `static_assert` detection on Clang - (https://github.com/fmtlib/fmt/pull/228). Thanks @dean0x7d. +- Fixed `static_assert` detection on Clang + (https://github.com/fmtlib/fmt/pull/228). Thanks @dean0x7d. # 1.1.0 - 2015-03-06 -- Added `BasicArrayWriter`, a class template that provides operations - for formatting and writing data into a fixed-size array - (https://github.com/fmtlib/fmt/issues/105 and - https://github.com/fmtlib/fmt/issues/122): +- Added `BasicArrayWriter`, a class template that provides operations + for formatting and writing data into a fixed-size array + (https://github.com/fmtlib/fmt/issues/105 and + https://github.com/fmtlib/fmt/issues/122): - ```c++ - char buffer[100]; - fmt::ArrayWriter w(buffer); - w.write("The answer is {}", 42); - ``` + ```c++ + char buffer[100]; + fmt::ArrayWriter w(buffer); + w.write("The answer is {}", 42); + ``` -- Added [0 A.D.](http://play0ad.com/) and [PenUltima Online - (POL)](http://www.polserver.com/) to the list of notable projects - using C++ Format. +- Added [0 A.D.](http://play0ad.com/) and [PenUltima Online + (POL)](http://www.polserver.com/) to the list of notable projects + using C++ Format. -- C++ Format now uses MSVC intrinsics for better formatting performance - (https://github.com/fmtlib/fmt/pull/115, - https://github.com/fmtlib/fmt/pull/116, - https://github.com/fmtlib/fmt/pull/118 and - https://github.com/fmtlib/fmt/pull/121). Previously these - optimizations where only used on GCC and Clang. - Thanks @CarterLi and @objectx. +- C++ Format now uses MSVC intrinsics for better formatting performance + (https://github.com/fmtlib/fmt/pull/115, + https://github.com/fmtlib/fmt/pull/116, + https://github.com/fmtlib/fmt/pull/118 and + https://github.com/fmtlib/fmt/pull/121). Previously these + optimizations where only used on GCC and Clang. + Thanks @CarterLi and @objectx. -- CMake install target - (https://github.com/fmtlib/fmt/pull/119). Thanks @TrentHouliston. +- CMake install target + (https://github.com/fmtlib/fmt/pull/119). Thanks @TrentHouliston. - You can now install C++ Format with `make install` command. + You can now install C++ Format with `make install` command. -- Improved [Biicode](http://www.biicode.com/) support - (https://github.com/fmtlib/fmt/pull/98 and - https://github.com/fmtlib/fmt/pull/104). - Thanks @MariadeAnton and @franramirez688. +- Improved [Biicode](http://www.biicode.com/) support + (https://github.com/fmtlib/fmt/pull/98 and + https://github.com/fmtlib/fmt/pull/104). + Thanks @MariadeAnton and @franramirez688. -- Improved support for building with [Android NDK]( - https://developer.android.com/tools/sdk/ndk/index.html) - (https://github.com/fmtlib/fmt/pull/107). Thanks @newnon. +- Improved support for building with [Android NDK]( + https://developer.android.com/tools/sdk/ndk/index.html) + (https://github.com/fmtlib/fmt/pull/107). Thanks @newnon. - The [android-ndk-example](https://github.com/fmtlib/android-ndk-example) - repository provides and example of using C++ Format with Android NDK: + The [android-ndk-example](https://github.com/fmtlib/android-ndk-example) + repository provides and example of using C++ Format with Android NDK: - ![](https://raw.githubusercontent.com/fmtlib/android-ndk-example/master/screenshot.png) + ![](https://raw.githubusercontent.com/fmtlib/android-ndk-example/master/screenshot.png) -- Improved documentation of `SystemError` and `WindowsError` - (https://github.com/fmtlib/fmt/issues/54). +- Improved documentation of `SystemError` and `WindowsError` + (https://github.com/fmtlib/fmt/issues/54). -- Various code improvements - (https://github.com/fmtlib/fmt/pull/110, - https://github.com/fmtlib/fmt/pull/111 - https://github.com/fmtlib/fmt/pull/112). Thanks @CarterLi. +- Various code improvements + (https://github.com/fmtlib/fmt/pull/110, + https://github.com/fmtlib/fmt/pull/111 + https://github.com/fmtlib/fmt/pull/112). Thanks @CarterLi. -- Improved compile-time errors when formatting wide into narrow - strings (https://github.com/fmtlib/fmt/issues/117). +- Improved compile-time errors when formatting wide into narrow + strings (https://github.com/fmtlib/fmt/issues/117). -- Fixed `BasicWriter::write` without formatting arguments when C++11 - support is disabled - (https://github.com/fmtlib/fmt/issues/109). +- Fixed `BasicWriter::write` without formatting arguments when C++11 + support is disabled + (https://github.com/fmtlib/fmt/issues/109). -- Fixed header-only build on OS X with GCC 4.9 - (https://github.com/fmtlib/fmt/issues/124). +- Fixed header-only build on OS X with GCC 4.9 + (https://github.com/fmtlib/fmt/issues/124). -- Fixed packaging issues (https://github.com/fmtlib/fmt/issues/94). +- Fixed packaging issues (https://github.com/fmtlib/fmt/issues/94). -- Added [changelog](https://github.com/fmtlib/fmt/blob/master/ChangeLog.md) - (https://github.com/fmtlib/fmt/issues/103). +- Added [changelog](https://github.com/fmtlib/fmt/blob/master/ChangeLog.md) + (https://github.com/fmtlib/fmt/issues/103). # 1.0.0 - 2015-02-05 -- Add support for a header-only configuration when `FMT_HEADER_ONLY` - is defined before including `format.h`: +- Add support for a header-only configuration when `FMT_HEADER_ONLY` + is defined before including `format.h`: - ```c++ - #define FMT_HEADER_ONLY - #include "format.h" - ``` + ```c++ + #define FMT_HEADER_ONLY + #include "format.h" + ``` -- Compute string length in the constructor of `BasicStringRef` instead - of the `size` method - (https://github.com/fmtlib/fmt/issues/79). This eliminates - size computation for string literals on reasonable optimizing - compilers. +- Compute string length in the constructor of `BasicStringRef` instead + of the `size` method + (https://github.com/fmtlib/fmt/issues/79). This eliminates + size computation for string literals on reasonable optimizing + compilers. -- Fix formatting of types with overloaded `operator <<` for - `std::wostream` (https://github.com/fmtlib/fmt/issues/86): +- Fix formatting of types with overloaded `operator <<` for + `std::wostream` (https://github.com/fmtlib/fmt/issues/86): - ```c++ - fmt::format(L"The date is {0}", Date(2012, 12, 9)); - ``` + ```c++ + fmt::format(L"The date is {0}", Date(2012, 12, 9)); + ``` -- Fix linkage of tests on Arch Linux - (https://github.com/fmtlib/fmt/issues/89). +- Fix linkage of tests on Arch Linux + (https://github.com/fmtlib/fmt/issues/89). -- Allow precision specifier for non-float arguments - (https://github.com/fmtlib/fmt/issues/90): +- Allow precision specifier for non-float arguments + (https://github.com/fmtlib/fmt/issues/90): - ```c++ - fmt::print("{:.3}\n", "Carpet"); // prints "Car" - ``` + ```c++ + fmt::print("{:.3}\n", "Carpet"); // prints "Car" + ``` -- Fix build on Android NDK (https://github.com/fmtlib/fmt/issues/93). +- Fix build on Android NDK (https://github.com/fmtlib/fmt/issues/93). -- Improvements to documentation build procedure. +- Improvements to documentation build procedure. -- Remove `FMT_SHARED` CMake variable in favor of standard [BUILD_SHARED_LIBS]( - http://www.cmake.org/cmake/help/v3.0/variable/BUILD_SHARED_LIBS.html). +- Remove `FMT_SHARED` CMake variable in favor of standard [BUILD_SHARED_LIBS]( + http://www.cmake.org/cmake/help/v3.0/variable/BUILD_SHARED_LIBS.html). -- Fix error handling in `fmt::fprintf`. +- Fix error handling in `fmt::fprintf`. -- Fix a number of warnings. +- Fix a number of warnings. # 0.12.0 - 2014-10-25 -- \[Breaking\] Improved separation between formatting and buffer - management. `Writer` is now a base class that cannot be instantiated - directly. The new `MemoryWriter` class implements the default buffer - management with small allocations done on stack. So `fmt::Writer` - should be replaced with `fmt::MemoryWriter` in variable - declarations. +- \[Breaking\] Improved separation between formatting and buffer + management. `Writer` is now a base class that cannot be instantiated + directly. The new `MemoryWriter` class implements the default buffer + management with small allocations done on stack. So `fmt::Writer` + should be replaced with `fmt::MemoryWriter` in variable + declarations. - Old code: + Old code: - ```c++ - fmt::Writer w; - ``` + ```c++ + fmt::Writer w; + ``` - New code: + New code: - ```c++ - fmt::MemoryWriter w; - ``` + ```c++ + fmt::MemoryWriter w; + ``` - If you pass `fmt::Writer` by reference, you can continue to do so: + If you pass `fmt::Writer` by reference, you can continue to do so: - ```c++ - void f(fmt::Writer &w); - ``` + ```c++ + void f(fmt::Writer &w); + ``` - This doesn\'t affect the formatting API. + This doesn\'t affect the formatting API. -- Support for custom memory allocators - (https://github.com/fmtlib/fmt/issues/69) +- Support for custom memory allocators + (https://github.com/fmtlib/fmt/issues/69) -- Formatting functions now accept [signed char]{.title-ref} and - [unsigned char]{.title-ref} strings as arguments - (https://github.com/fmtlib/fmt/issues/73): +- Formatting functions now accept [signed char]{.title-ref} and + [unsigned char]{.title-ref} strings as arguments + (https://github.com/fmtlib/fmt/issues/73): - ```c++ - auto s = format("GLSL version: {}", glGetString(GL_VERSION)); - ``` + ```c++ + auto s = format("GLSL version: {}", glGetString(GL_VERSION)); + ``` -- Reduced code bloat. According to the new [benchmark - results](https://github.com/fmtlib/fmt#compile-time-and-code-bloat), - cppformat is close to `printf` and by the order of magnitude better - than Boost Format in terms of compiled code size. +- Reduced code bloat. According to the new [benchmark + results](https://github.com/fmtlib/fmt#compile-time-and-code-bloat), + cppformat is close to `printf` and by the order of magnitude better + than Boost Format in terms of compiled code size. -- Improved appearance of the documentation on mobile by using the - [Sphinx Bootstrap - theme](http://ryan-roemer.github.io/sphinx-bootstrap-theme/): +- Improved appearance of the documentation on mobile by using the + [Sphinx Bootstrap + theme](http://ryan-roemer.github.io/sphinx-bootstrap-theme/): - | Old | New | - | --- | --- | - | ![](https://cloud.githubusercontent.com/assets/576385/4792130/cd256436-5de3-11e4-9a62-c077d0c2b003.png) | ![](https://cloud.githubusercontent.com/assets/576385/4792131/cd29896c-5de3-11e4-8f59-cac952942bf0.png) | + | Old | New | + | --- | --- | + | ![](https://cloud.githubusercontent.com/assets/576385/4792130/cd256436-5de3-11e4-9a62-c077d0c2b003.png) | ![](https://cloud.githubusercontent.com/assets/576385/4792131/cd29896c-5de3-11e4-8f59-cac952942bf0.png) | # 0.11.0 - 2014-08-21 -- Safe printf implementation with a POSIX extension for positional - arguments: +- Safe printf implementation with a POSIX extension for positional + arguments: - ```c++ - fmt::printf("Elapsed time: %.2f seconds", 1.23); - fmt::printf("%1$s, %3$d %2$s", weekday, month, day); - ``` + ```c++ + fmt::printf("Elapsed time: %.2f seconds", 1.23); + fmt::printf("%1$s, %3$d %2$s", weekday, month, day); + ``` -- Arguments of `char` type can now be formatted as integers (Issue - https://github.com/fmtlib/fmt/issues/55): +- Arguments of `char` type can now be formatted as integers (Issue + https://github.com/fmtlib/fmt/issues/55): - ```c++ - fmt::format("0x{0:02X}", 'a'); - ``` + ```c++ + fmt::format("0x{0:02X}", 'a'); + ``` -- Deprecated parts of the API removed. +- Deprecated parts of the API removed. -- The library is now built and tested on MinGW with Appveyor in - addition to existing test platforms Linux/GCC, OS X/Clang, - Windows/MSVC. +- The library is now built and tested on MinGW with Appveyor in + addition to existing test platforms Linux/GCC, OS X/Clang, + Windows/MSVC. # 0.10.0 - 2014-07-01 **Improved API** -- All formatting methods are now implemented as variadic functions - instead of using `operator<<` for feeding arbitrary arguments into a - temporary formatter object. This works both with C++11 where - variadic templates are used and with older standards where variadic - functions are emulated by providing lightweight wrapper functions - defined with the `FMT_VARIADIC` macro. You can use this macro for - defining your own portable variadic functions: +- All formatting methods are now implemented as variadic functions + instead of using `operator<<` for feeding arbitrary arguments into a + temporary formatter object. This works both with C++11 where + variadic templates are used and with older standards where variadic + functions are emulated by providing lightweight wrapper functions + defined with the `FMT_VARIADIC` macro. You can use this macro for + defining your own portable variadic functions: - ```c++ - void report_error(const char *format, const fmt::ArgList &args) { - fmt::print("Error: {}"); - fmt::print(format, args); - } - FMT_VARIADIC(void, report_error, const char *) + ```c++ + void report_error(const char *format, const fmt::ArgList &args) { + fmt::print("Error: {}"); + fmt::print(format, args); + } + FMT_VARIADIC(void, report_error, const char *) - report_error("file not found: {}", path); - ``` + report_error("file not found: {}", path); + ``` - Apart from a more natural syntax, this also improves performance as - there is no need to construct temporary formatter objects and - control arguments\' lifetimes. Because the wrapper functions are - very lightweight, this doesn\'t cause code bloat even in pre-C++11 - mode. + Apart from a more natural syntax, this also improves performance as + there is no need to construct temporary formatter objects and + control arguments\' lifetimes. Because the wrapper functions are + very lightweight, this doesn\'t cause code bloat even in pre-C++11 + mode. -- Simplified common case of formatting an `std::string`. Now it - requires a single function call: +- Simplified common case of formatting an `std::string`. Now it + requires a single function call: - ```c++ - std::string s = format("The answer is {}.", 42); - ``` + ```c++ + std::string s = format("The answer is {}.", 42); + ``` - Previously it required 2 function calls: + Previously it required 2 function calls: - ```c++ - std::string s = str(Format("The answer is {}.") << 42); - ``` + ```c++ + std::string s = str(Format("The answer is {}.") << 42); + ``` - Instead of unsafe `c_str` function, `fmt::Writer` should be used - directly to bypass creation of `std::string`: + Instead of unsafe `c_str` function, `fmt::Writer` should be used + directly to bypass creation of `std::string`: - ```c++ - fmt::Writer w; - w.write("The answer is {}.", 42); - w.c_str(); // returns a C string - ``` + ```c++ + fmt::Writer w; + w.write("The answer is {}.", 42); + w.c_str(); // returns a C string + ``` - This doesn\'t do dynamic memory allocation for small strings and is - less error prone as the lifetime of the string is the same as for - `std::string::c_str` which is well understood (hopefully). + This doesn\'t do dynamic memory allocation for small strings and is + less error prone as the lifetime of the string is the same as for + `std::string::c_str` which is well understood (hopefully). -- Improved consistency in naming functions that are a part of the - public API. Now all public functions are lowercase following the - standard library conventions. Previously it was a combination of - lowercase and CapitalizedWords. Issue - https://github.com/fmtlib/fmt/issues/50. +- Improved consistency in naming functions that are a part of the + public API. Now all public functions are lowercase following the + standard library conventions. Previously it was a combination of + lowercase and CapitalizedWords. Issue + https://github.com/fmtlib/fmt/issues/50. -- Old functions are marked as deprecated and will be removed in the - next release. +- Old functions are marked as deprecated and will be removed in the + next release. **Other Changes** -- Experimental support for printf format specifications (work in - progress): +- Experimental support for printf format specifications (work in + progress): - ```c++ - fmt::printf("The answer is %d.", 42); - std::string s = fmt::sprintf("Look, a %s!", "string"); - ``` + ```c++ + fmt::printf("The answer is %d.", 42); + std::string s = fmt::sprintf("Look, a %s!", "string"); + ``` -- Support for hexadecimal floating point format specifiers `a` and - `A`: +- Support for hexadecimal floating point format specifiers `a` and + `A`: - ```c++ - print("{:a}", -42.0); // Prints -0x1.5p+5 - print("{:A}", -42.0); // Prints -0X1.5P+5 - ``` + ```c++ + print("{:a}", -42.0); // Prints -0x1.5p+5 + print("{:A}", -42.0); // Prints -0X1.5P+5 + ``` -- CMake option `FMT_SHARED` that specifies whether to build format as - a shared library (off by default). +- CMake option `FMT_SHARED` that specifies whether to build format as + a shared library (off by default). # 0.9.0 - 2014-05-13 -- More efficient implementation of variadic formatting functions. +- More efficient implementation of variadic formatting functions. -- `Writer::Format` now has a variadic overload: +- `Writer::Format` now has a variadic overload: - ```c++ - Writer out; - out.Format("Look, I'm {}!", "variadic"); - ``` + ```c++ + Writer out; + out.Format("Look, I'm {}!", "variadic"); + ``` -- For efficiency and consistency with other overloads, variadic - overload of the `Format` function now returns `Writer` instead of - `std::string`. Use the `str` function to convert it to - `std::string`: +- For efficiency and consistency with other overloads, variadic + overload of the `Format` function now returns `Writer` instead of + `std::string`. Use the `str` function to convert it to + `std::string`: - ```c++ - std::string s = str(Format("Look, I'm {}!", "variadic")); - ``` + ```c++ + std::string s = str(Format("Look, I'm {}!", "variadic")); + ``` -- Replaced formatter actions with output sinks: `NoAction` -\> - `NullSink`, `Write` -\> `FileSink`, `ColorWriter` -\> - `ANSITerminalSink`. This improves naming consistency and shouldn\'t - affect client code unless these classes are used directly which - should be rarely needed. +- Replaced formatter actions with output sinks: `NoAction` -\> + `NullSink`, `Write` -\> `FileSink`, `ColorWriter` -\> + `ANSITerminalSink`. This improves naming consistency and shouldn\'t + affect client code unless these classes are used directly which + should be rarely needed. -- Added `ThrowSystemError` function that formats a message and throws - `SystemError` containing the formatted message and system-specific - error description. For example, the following code +- Added `ThrowSystemError` function that formats a message and throws + `SystemError` containing the formatted message and system-specific + error description. For example, the following code - ```c++ - FILE *f = fopen(filename, "r"); - if (!f) - ThrowSystemError(errno, "Failed to open file '{}'") << filename; - ``` + ```c++ + FILE *f = fopen(filename, "r"); + if (!f) + ThrowSystemError(errno, "Failed to open file '{}'") << filename; + ``` - will throw `SystemError` exception with description \"Failed to open - file \'\\': No such file or directory\" if file doesn\'t - exist. + will throw `SystemError` exception with description \"Failed to open + file \'\\': No such file or directory\" if file doesn\'t + exist. -- Support for AppVeyor continuous integration platform. +- Support for AppVeyor continuous integration platform. -- `Format` now throws `SystemError` in case of I/O errors. +- `Format` now throws `SystemError` in case of I/O errors. -- Improve test infrastructure. Print functions are now tested by - redirecting the output to a pipe. +- Improve test infrastructure. Print functions are now tested by + redirecting the output to a pipe. # 0.8.0 - 2014-04-14 -- Initial release +- Initial release diff --git a/doc/index.md b/doc/index.md index a619df76..4eaf5eb1 100644 --- a/doc/index.md +++ b/doc/index.md @@ -52,7 +52,9 @@ hide: {fmt} can be anywhere from tens of percent to 20-30 times faster than iostreams and sprintf, especially for numeric formatting. + + The library minimizes dynamic memory allocations and can optionally compile format strings to optimal code. @@ -69,12 +71,12 @@ hide: >fmt::print("Слава Україні!"); will be printed correctly on Linux, macOS, and even Windows console, - regardless of the codepages. + irrespective of the codepages.

The default is locale-independent, but you can opt into localized - formatting and {fmt} makes it work with Unicode, working around problems in - the standard libary. + formatting and {fmt} makes it work with Unicode, addressing issues in the + standard libary.

@@ -91,7 +93,8 @@ hide: equivalent iostreams code, and while printf compiles faster still, the gap is narrowing.

- + → Learn more @@ -115,7 +118,7 @@ hide:

Portability

{fmt} has a small self-contained codebase with the core consisting of - just three header files and no external dependencies. + just three headers and no external dependencies.

The library is highly portable and requires only a minimal subset of @@ -138,8 +141,10 @@ hide: all-time contributors.

- The permissive MIT license - allows the use the library in both open-source and commercial projects. + The library is distributed under a permissive MIT + license and is + relied upon by many open-source projects, including PyTorch, Apple's + FoundationDB, Windows Terminal, MongoDB, and others.