| # 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 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 <fmt/chrono.h> | |
| 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 <source_location> | |
| #include <fmt/std.h> | |
| 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 <bitset> | |
| #include <fmt/std.h> | |
| 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 <fmt/format.h> | |
| struct point { | |
| double x, y; | |
| }; | |
| template <> | |
| struct fmt::formatter<point> : nested_formatter<double> { | |
| auto format(point p, format_context& ctx) const { | |
| return write_padded(ctx, [=](auto out) { | |
| return format_to(out, "({}, {})", nested(p.x), nested(p.y)); | |
| }); | |
| } | |
| }; | |
| int main() { | |
| fmt::print("[{:>20.2f}]", point{1, 2}); | |
| } | |
| ``` | |
| prints | |
| ``` | |
| [ (1.00, 2.00)] | |
| ``` | |
| - 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: | |
| ```c++ | |
| #include <filesystem> | |
| #include <fmt/std.h> | |
| int main() { | |
| fmt::print("{:g}\n", std::filesystem::path("C:\\foo")); | |
| } | |
| ``` | |
| prints `"C:/foo"` on Windows. | |
| Thanks @js324. | |
| - Made `format_as` work with references | |
| (https://github.com/fmtlib/fmt/pull/3739). Thanks @tchaikov. | |
| - Fixed formatting of invalid UTF-8 with precision | |
| (https://github.com/fmtlib/fmt/issues/3284). | |
| - Fixed an inconsistency between `fmt::to_string` and `fmt::format` | |
| (https://github.com/fmtlib/fmt/issues/3684). | |
| - 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). | |
| # 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<string>` | |
| 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). | |
| {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 | |
| {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 | |
| - 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<bool>` and `std::bitset<N>` | |
| (https://github.com/fmtlib/fmt/issues/3567, | |
| https://github.com/fmtlib/fmt/pull/3570). For example | |
| ([godbolt](https://godbolt.org/z/zYb79Pvn8)): | |
| ```c++ | |
| #include <vector> | |
| #include <fmt/std.h> | |
| int main() { | |
| auto v = std::vector<bool>{true}; | |
| fmt::print("{}", v[0]); | |
| } | |
| ``` | |
| 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 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 `{}` 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. | |
| - 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. | |
| - 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. | |
| - 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. | |
| - 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. | |
| - 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`. | |
| - Removed unused `basic_printf_parse_context`. | |
| - 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 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. | |
| - 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: | |
|  | |
| - Red: new algorithm | |
| - Green: new algorithm with `FMT_USE_FULL_CACHE_DRAGONBOX` defined | |
| to 1 | |
| - Blue: old algorithm | |
| 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. | |
| - 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`. | |
| - 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 | |
| - Made `format_as` work with any user-defined type and not just enums. | |
| For example ([godbolt](https://godbolt.org/z/b7rqhq5Kh)): | |
| ```c++ | |
| #include <fmt/format.h> | |
| struct floaty_mc_floatface { | |
| double 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" | |
| } | |
| ``` | |
| - 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 <fmt/chrono.h> | |
| 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 <fmt/chrono.h> | |
| 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 <fmt/chrono.h> | |
| 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 <fmt/std.h> | |
| #include <vector> | |
| int main() { | |
| try { | |
| std::vector<bool>().at(0); | |
| } catch(const std::exception& e) { | |
| fmt::print("{}", e); | |
| } | |
| } | |
| ``` | |
| prints: | |
| vector<bool>::_M_range_check: __n (which is 0) >= this->size() (which is 0) | |
| on libstdc++. Thanks @zach2good and @phprus. | |
| - Moved `std::error_code` formatter from `fmt/os.h` to `fmt/std.h`. | |
| (https://github.com/fmtlib/fmt/pull/3125). 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)): | |
| ```c++ | |
| #include <fmt/ranges.h> | |
| #include <stack> | |
| #include <vector> | |
| int main() { | |
| auto s = std::stack<bool, std::vector<bool>>(); | |
| for (auto b: {true, false, true}) s.push(b); | |
| fmt::print("{}\n", s); // prints [true, false, true] | |
| } | |
| ``` | |
| Thanks @ShawnZhong. | |
| - 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. | |
| - Fixed formatting of valueless by exception variants | |
| (https://github.com/fmtlib/fmt/pull/3347). Thanks @TheOmegaCarrot. | |
| - Made `fmt::ptr` accept `unique_ptr` with a custom deleter | |
| (https://github.com/fmtlib/fmt/pull/3177). Thanks @hmbj. | |
| - 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 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<std::locale>("’")); | |
| 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. | |
| # 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)): | |
| ```c++ | |
| #include <fmt/compile.h> | |
| int main() { | |
| using namespace fmt::literals; | |
| constexpr size_t n = fmt::formatted_size("{}"_cf, 42); | |
| fmt::print("{}\n", n); // prints 2 | |
| } | |
| ``` | |
| 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. | |
| - 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). | |
| - 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)): | |
| ```c++ | |
| #include <fmt/ranges.h> | |
| #include <vector> | |
| int main() { | |
| auto v = std::vector{1, 2, 3}; | |
| fmt::print("{:n}\n", v); // prints 1, 2, 3 | |
| } | |
| ``` | |
| 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. | |
| - 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 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. | |
| - 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 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. | |
| # 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. | |
| - Compile-time floating point formatting no longer requires the | |
| header-only mode. For example | |
| ([godbolt](https://godbolt.org/z/G37PTeG3b)): | |
| ```c++ | |
| #include <array> | |
| #include <fmt/compile.h> | |
| consteval auto compile_time_dtoa(double value) -> std::array<char, 10> { | |
| auto result = std::array<char, 10>(); | |
| 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 <fmt/ostream.h> | |
| struct date { | |
| int year, month, day; | |
| friend std::ostream& operator<<(std::ostream& os, const date& d) { | |
| return os << d.year << '-' << d.month << '-' << d.day; | |
| } | |
| }; | |
| template <> struct fmt::formatter<date> : ostream_formatter {}; | |
| std::string s = fmt::format("The date is {}", date{2012, 12, 9}); | |
| // s == "The date is 2012-12-9" | |
| ``` | |
| - Added the `fmt::streamed` function that takes an object and formats | |
| it via `std::ostream`. For example | |
| ([godbolt](https://godbolt.org/z/5G3346G1f)): | |
| ```c++ | |
| #include <thread> | |
| #include <fmt/ostream.h> | |
| int main() { | |
| fmt::print("Current thread id: {}\n", | |
| fmt::streamed(std::this_thread::get_id())); | |
| } | |
| ``` | |
| Note that `fmt/std.h` provides a `formatter` specialization for | |
| `std::thread::id` so you don\'t need to format it via | |
| `std::ostream`. | |
| - Deprecated implicit conversions of unscoped enums to integers for | |
| consistency with scoped enums. | |
| - Added an argument-dependent lookup based `format_as` extension API | |
| to simplify formatting of enums. | |
| - Added experimental `std::variant` formatting support | |
| (https://github.com/fmtlib/fmt/pull/2941). For example | |
| ([godbolt](https://godbolt.org/z/KG9z6cq68)): | |
| ```c++ | |
| #include <variant> | |
| #include <fmt/std.h> | |
| int main() { | |
| auto v = std::variant<int, std::string>(42); | |
| fmt::print("{}\n", v); | |
| } | |
| ``` | |
| prints: | |
| variant(42) | |
| Thanks @jehelset. | |
| - 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)): | |
| ```c++ | |
| #include <filesystem> | |
| #include <fmt/std.h> | |
| int main() { | |
| fmt::print("There is no place like {}.", std::filesystem::path("/home")); | |
| } | |
| ``` | |
| prints: | |
| There is no place like "/home". | |
| Thanks @phprus. | |
| - Added a `std::thread::id` formatter to `fmt/std.h`. For example | |
| ([godbolt](https://godbolt.org/z/j1azbYf3E)): | |
| ```c++ | |
| #include <thread> | |
| #include <fmt/std.h> | |
| int main() { | |
| fmt::print("Current thread id: {}\n", std::this_thread::get_id()); | |
| } | |
| ``` | |
| - 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 <fmt/chrono.h> | |
| #include <fmt/color.h> | |
| 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 | |
|  | |
| 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 <vector> | |
| #include <fmt/ranges.h> | |
| 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. | |
| # 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. | |
| # 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). | |
| 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 | |
| ---------------------------------------------------------------------------- | |
| 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)): | |
| ```c++ | |
| #include <fmt/chrono.h> | |
| int main() { | |
| fmt::print("{:%S}", std::chrono::milliseconds(1234)); | |
| } | |
| ``` | |
| prints \"01.234\". | |
| 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 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)): | |
| ```c++ | |
| #include <fmt/format.h> | |
| int main() { | |
| fmt::print("{} dollars", fmt::group_digits(1000000)); | |
| } | |
| ``` | |
| prints \"1,000,000 dollars\". | |
| - Added support for faint, conceal, reverse and blink text styles | |
| (https://github.com/fmtlib/fmt/pull/2394): | |
| <https://user-images.githubusercontent.com/576385/147710227-c68f5317-f8fa-42c3-9123-7c4ba3c398cb.mp4> | |
| 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 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 <fmt/format.h> | |
| 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. | |
| Thanks @alexezeder. | |
| - Implemented escaping of string range elements. For example | |
| ([godbolt](https://godbolt.org/z/rKvM1vKf3)): | |
| ```c++ | |
| #include <fmt/ranges.h> | |
| #include <vector> | |
| int main() { | |
| fmt::print("{}", std::vector<std::string>{"\naan"}); | |
| } | |
| ``` | |
| is now printed as: | |
| ["\naan"] | |
| instead of: | |
| [" | |
| aan"] | |
| - 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)): | |
| ```c++ | |
| #include <fmt/ranges.h> | |
| #include <map> | |
| int main() { | |
| fmt::print("{}", std::map<std::string, int>{{"answer", 42}}); | |
| } | |
| ``` | |
| is now printed as: | |
| {"answer": 42} | |
| - 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. | |
| - 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 `_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. | |
| - 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 non-`char` buffers | |
| (https://github.com/fmtlib/fmt/pull/2477). Thanks @Roman-Koshelev. | |
| - 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. | |
| - 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. | |
| - 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. | |
| - 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). | |
| - 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). | |
| - 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 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, | |
| - 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. | |
| - 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. | |
| # 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. | |
| # 8.0.0 - 2021-06-21 | |
| - Enabled compile-time format string checks by default. For example | |
| ([godbolt](https://godbolt.org/z/sMxcohGjz)): | |
| ```c++ | |
| #include <fmt/core.h> | |
| 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 <fmt/compile.h> | |
| consteval auto compile_time_itoa(int value) -> std::array<char, 10> { | |
| auto result = std::array<char, 10>(); | |
| 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 <fmt/compile.h> | |
| 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<my_type>: formatter<string_view> { | |
| template <typename FormatContext> | |
| 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 <fmt/compile.h> | |
| 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 <fmt/format.h> | |
| #include <cstddef> | |
| #include <vector> | |
| 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 <fmt/chrono.h> | |
| 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 <fmt/chrono.h> | |
| 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 `<locale>` 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 <fmt/chrono.h> | |
| 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\". | |
| - Formatting floating-point numbers no longer produces trailing zeros | |
| by default for consistency with `std::format`. For example: | |
| ```c++ | |
| #include <fmt/core.h> | |
| int main() { | |
| fmt::print("{0:.3}", 1.1); | |
| } | |
| ``` | |
| 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`. | |
| - The `'L'` specifier for locale-specific numeric formatting can now | |
| be combined with presentation specifiers as in `std::format`. For | |
| example: | |
| ```c++ | |
| #include <fmt/core.h> | |
| #include <locale> | |
| 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. | |
| - 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. | |
| - 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 `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. | |
| - 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: | |
| ```c++ | |
| #include <fmt/core.h> | |
| int main() { | |
| fmt::print("{:s}", true); | |
| } | |
| ``` | |
| prints \"true\". Thanks @powercoderlol. | |
| - Made `fmt::ptr` work with function pointers | |
| (https://github.com/fmtlib/fmt/pull/2131). For example: | |
| ```c++ | |
| #include <fmt/format.h> | |
| int main() { | |
| fmt::print("My main: {}\n", fmt::ptr(main)); | |
| } | |
| ``` | |
| Thanks @mikecrowe. | |
| - 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 handling of empty format strings during format string | |
| compilation (https://github.com/fmtlib/fmt/issues/2042): | |
| ```c++ | |
| auto s = fmt::format(FMT_COMPILE("")); | |
| ``` | |
| Thanks @alexezeder. | |
| - 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: | |
| ```c++ | |
| #include <fmt/core.h> | |
| int main() { | |
| fmt::print("{:-<10}{}\n", "你好", "世界"); | |
| fmt::print("{:-<10}{}\n", "hello", "world"); | |
| } | |
| ``` | |
| prints | |
|  | |
| 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: | |
| ```c++ | |
| #include <fmt/os.h> | |
| 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). | |
| # 7.1.2 - 2020-11-04 | |
| - 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. | |
| # 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ū: | |
|  | |
| 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 <fmt/os.h> | |
| int main() { | |
| auto f = fmt::output_file("guide"); | |
| f.print("The answer is {}.", 42); | |
| } | |
| ``` | |
| - Added a formatter for `std::chrono::time_point<system_clock>` | |
| (https://github.com/fmtlib/fmt/issues/1819, | |
| https://github.com/fmtlib/fmt/pull/1837). For example | |
| ([godbolt](https://godbolt.org/z/c4M6fh)): | |
| ```c++ | |
| #include <fmt/chrono.h> | |
| 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 <fmt/ranges.h> | |
| #include <range/v3/view/filter.hpp> | |
| 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 <fmt/compile.h> | |
| 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 <fmt/core.h> | |
| 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<how_about_no>()' "Cannot format an argument. To make type T formattable provide a formatter<T> 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 <typename S, typename... Args> | |
| void log(const char* file, int line, const S& format, Args&&... args) { | |
| vlog(file, line, format, | |
| fmt::make_args_checked<Args...>(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 <fmt/core.h> | |
| 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 <fmt/core.h> | |
| 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 <fmt/compile.h> | |
| 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 <fmt/color.h> | |
| 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 <fmt/core.h> | |
| 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). | |
| # 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). | |
| # 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. | |
| # 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). | |
| - Added a simpler and more efficient [format string compilation | |
| API](https://fmt.dev/7.0.0/api.html#compile-api): | |
| ```c++ | |
| #include <fmt/compile.h> | |
| // 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. | |
| - 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, | |
| ```c++ | |
| fmt::format("Result: {}: ({},{},{},{})", str1, str2, str3, str4, str5) | |
| ``` | |
| 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`). | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| ```c++ | |
| #include <fmt/core.h> | |
| int main() { | |
| fmt::print("The answer is {answer}\n", fmt::arg("answer", 42)); | |
| } | |
| ``` | |
| 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<char>, | |
| fmt::v6::format_args) | |
| xor eax, eax | |
| add rsp, 56 | |
| ret | |
| .L.str.1: | |
| .asciz "answer" | |
| ``` | |
| - Implemented compile-time checks for dynamic width and precision | |
| (https://github.com/fmtlib/fmt/issues/1614): | |
| ```c++ | |
| #include <fmt/format.h> | |
| int main() { | |
| fmt::print(FMT_STRING("{0:{1}}"), 42); | |
| } | |
| ``` | |
| 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"); | |
| ^ | |
| - 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'; } | |
| 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" | |
| ``` | |
| 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 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. | |
| - 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: | |
| - `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. | |
| - 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). | |
| - 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. | |
| - 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. | |
| - 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. | |
| # 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). | |
| # 6.2.0 - 2020-04-05 | |
| - Improved error reporting when trying to format an object of a | |
| non-formattable type: | |
| ```c++ | |
| fmt::format("{}", S()); | |
| ``` | |
| 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<T> specialization: | |
| https://fmt.dev/latest/api.html#formatting-user-defined-types" | |
| static_assert( | |
| ^ | |
| ... | |
| note: in instantiation of function template specialization | |
| 'fmt::v6::format<char [3], S, char>' requested here | |
| fmt::format("{}", S()); | |
| ^ | |
| if `S` is not formattable. | |
| - 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): | |
| ```c++ | |
| fmt::print("{:#.0f}", 42.0); | |
| ``` | |
| 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. | |
| - 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. | |
| - Implemented detection of invalid use of `fmt::arg`. | |
| - Used `type_identity` to block unnecessary template argument | |
| deduction. Thanks Tim Song. | |
| - Improved UTF-8 handling | |
| (https://github.com/fmtlib/fmt/issues/1109): | |
| ```c++ | |
| fmt::print("┌{0:─^{2}}┐\n" | |
| "│{1: ^{2}}│\n" | |
| "└{0:─^{2}}┘\n", "", "Привет, мир!", 20); | |
| ``` | |
| now prints: | |
| ┌────────────────────┐ | |
| │ Привет, мир! │ | |
| └────────────────────┘ | |
| on systems that support Unicode. | |
| - 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<fmt::format_context> store; | |
| store.push_back("answer"); | |
| store.push_back(42); | |
| fmt::vprint("The {} is {}.\n", store); | |
| ``` | |
| prints: | |
| The answer is 42. | |
| Thanks @vsolontsov-ll. | |
| - 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 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. | |
| - 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. | |
| - 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. | |
| - 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. | |
| - 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. | |
| - 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. | |
| # 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`. | |
| # 6.1.0 - 2019-12-01 | |
| - {fmt} now formats IEEE 754 `float` and `double` using the shortest | |
| decimal representation with correct rounding by default: | |
| ```c++ | |
| #include <cmath> | |
| #include <fmt/core.h> | |
| int main() { | |
| fmt::print("{}", M_PI); | |
| } | |
| ``` | |
| 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): | |
| | 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 | | |
|  | |
| - {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); | |
| ``` | |
| prints `0.1` instead of `0.10000000149011612`. | |
| 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). | |
| - Added support for 128-bit integers | |
| (https://github.com/fmtlib/fmt/pull/1287): | |
| ```c++ | |
| fmt::print("{}", std::numeric_limits<__int128_t>::max()); | |
| ``` | |
| prints `170141183460469231731687303715884105727`. | |
| 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. | |
| - 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): | |
| ```c++ | |
| #include <tuple> | |
| #include <fmt/ranges.h> | |
| int main() { | |
| std::tuple<char, int, float> t{'a', 1, 2.0f}; | |
| fmt::print("{}", t); | |
| } | |
| ``` | |
| prints `('a', 1, 2.0)`. | |
| Thanks @jeremyong. | |
| - Changed formatting of octal zero with prefix from \"00\" to \"0\": | |
| ```c++ | |
| fmt::print("{:#o}", 0); | |
| ``` | |
| prints `0`. | |
| - The locale is now passed to ostream insertion (`<<`) operators | |
| (https://github.com/fmtlib/fmt/pull/1406): | |
| ```c++ | |
| #include <fmt/locale.h> | |
| #include <fmt/ostream.h> | |
| struct S { | |
| double 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" | |
| } | |
| ``` | |
| 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. | |
| - 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 | |
| ``` | |
| - 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). | |
| - 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. | |
| - {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 | |
| Thanks @tdegeus. | |
| - 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. | |
| - 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). | |
| - 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. | |
| # 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. | |
| - Floating-point formatting is now locale-independent by default: | |
| ```c++ | |
| #include <locale> | |
| #include <fmt/core.h> | |
| 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++ | |
| std::locale::global(std::locale("ru_RU.UTF-8")); | |
| fmt::print("value = {:n}", 4.2); | |
| ``` | |
| prints \"value = 4,2\". | |
| - 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: | |
| ```c++ | |
| #define FMT_USE_GRISU 1 | |
| #include <fmt/format.h> | |
| auto s = fmt::format("{}", 4.2); // formats 4.2 using Grisu | |
| ``` | |
| 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)): | |
|  | |
| - 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. | |
| - Added [oss-fuzz](https://github.com/google/oss-fuzz) support | |
| (https://github.com/fmtlib/fmt/pull/1199). Thanks @pauldreik. | |
| - `formatter` specializations now always take precedence over | |
| `operator<<` (https://github.com/fmtlib/fmt/issues/952): | |
| ```c++ | |
| #include <iostream> | |
| #include <fmt/ostream.h> | |
| struct S {}; | |
| std::ostream& operator<<(std::ostream& os, S) { | |
| return os << 1; | |
| } | |
| template <> | |
| struct fmt::formatter<S> : fmt::formatter<int> { | |
| auto format(S, format_context& ctx) { | |
| return formatter<int>::format(2, ctx); | |
| } | |
| }; | |
| 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): | |
| ```c++ | |
| #include <fmt/compile.h> | |
| auto f = fmt::compile<int>("{}"); | |
| 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. | |
| - 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%" | |
| ``` | |
| Thanks @gawain-bolton. | |
| - 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<double>(1.234)); | |
| // s == 1.2s | |
| ``` | |
| Thanks @DanielaE. | |
| - 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" | |
| ``` | |
| Thanks @DanielaE. | |
| - 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 " | |
| ``` | |
| Thanks Howard Hinnant. | |
| - 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): | |
| ```c++ | |
| #include <fmt/color.h> | |
| std::string message = fmt::format(fmt::emphasis::bold | fg(fmt::color::red), | |
| "The answer is {}.", 42); | |
| ``` | |
| Thanks @Naios. | |
| - 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): | |
| ```c++ | |
| std::unique_ptr<int> p = ...; | |
| fmt::print("{}", fmt::ptr(p)); // prints p as a pointer | |
| ``` | |
| 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. | |
| - 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<T>` instead of | |
| `buffer_context<T>::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. | |
| - Moved the undocumented `basic_writer`, `writer`, and `wwriter` types | |
| to the `internal` namespace. | |
| - Removed deprecated `basic_format_context::begin()`. Use `out()` | |
| instead. | |
| - 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. | |
| - 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. | |
| - 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 [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. | |
| - 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. | |
| - 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 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 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). | |
| - 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. | |
| - 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). | |
| - 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 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. | |
| # 5.3.0 - 2018-12-28 | |
| - Introduced experimental chrono formatting support: | |
| ```c++ | |
| #include <fmt/chrono.h> | |
| int main() { | |
| using namespace std::literals::chrono_literals; | |
| fmt::print("Default format: {} {}\n", 42s, 100ms); | |
| fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s); | |
| } | |
| ``` | |
| prints: | |
| Default format: 42s 100ms | |
| strftime-like format: 03:15:30 | |
| - Added experimental support for emphasis (bold, italic, underline, | |
| strikethrough), colored output to a file stream, and improved | |
| colored formatting API | |
| (https://github.com/fmtlib/fmt/pull/961, | |
| https://github.com/fmtlib/fmt/pull/967, | |
| https://github.com/fmtlib/fmt/pull/973): | |
| ```c++ | |
| #include <fmt/color.h> | |
| int main() { | |
| print(fg(fmt::color::crimson) | fmt::emphasis::bold, | |
| "Hello, {}!\n", "world"); | |
| print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) | | |
| fmt::emphasis::underline, "Hello, {}!\n", "мир"); | |
| print(fg(fmt::color::steel_blue) | fmt::emphasis::italic, | |
| "Hello, {}!\n", "世界"); | |
| } | |
| ``` | |
| prints the following on modern terminals with RGB color support: | |
|  | |
| Thanks @Rakete1111. | |
| - Added support for 4-bit terminal colors | |
| (https://github.com/fmtlib/fmt/issues/968, | |
| https://github.com/fmtlib/fmt/pull/974) | |
| ```c++ | |
| #include <fmt/color.h> | |
| int main() { | |
| print(fg(fmt::terminal_color::red), "stop\n"); | |
| } | |
| ``` | |
| Note that these colors vary by terminal: | |
|  | |
| 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: | |
| ```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); | |
| ``` | |
| Thanks @DanielaE. | |
| - 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); | |
| ``` | |
| Thanks @DanielaE. | |
| - 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 | |
| ``` | |
| Thanks @XZiar. | |
| - Made colored print functions work with wide strings | |
| (https://github.com/fmtlib/fmt/pull/867): | |
| ```c++ | |
| #include <fmt/color.h> | |
| int main() { | |
| print(fg(fmt::color::red), L"{}\n", 42); | |
| } | |
| ``` | |
| Thanks @DanielaE. | |
| - 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 | |
| ``` | |
| - Improved locale support: | |
| ```c++ | |
| #include <fmt/locale.h> | |
| struct numpunct : std::numpunct<char> { | |
| protected: | |
| char do_thousands_sep() const override { return '~'; } | |
| }; | |
| std::locale loc; | |
| auto s = fmt::format(std::locale(loc, new numpunct()), "{:n}", 1234567); | |
| // s == "1~234~567" | |
| ``` | |
| - Constrained formatting functions on proper iterator types | |
| (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. | |
| - 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. | |
| - Disallowed repeated leading zeros in an argument ID: | |
| ```c++ | |
| fmt::print("{000}", 42); // error | |
| ``` | |
| - Reintroduced support for gcc 4.4. | |
| - 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. | |
| - 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. | |
| - 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 `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 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). | |
| # 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): | |
| | 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`: | |
| ```c++ | |
| #define FMT_STRING_ALIAS 1 | |
| #include <fmt/format.h> | |
| std::string answer = format(fmt("{}"), 42); | |
| ``` | |
| - Added compile-time format string checks to `format_to` overload that | |
| takes `fmt::memory_buffer` | |
| (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"); | |
| ``` | |
| - 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`: | |
| ```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`. | |
| - 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. | |
| - 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. | |
| - 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 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); | |
| ``` | |
| - 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: | |
| ```c++ | |
| #define FMT_EXTENDED_COLORS | |
| #define FMT_HEADER_ONLY // or compile fmt with FMT_EXTENDED_COLORS defined | |
| #include <fmt/format.h> | |
| fmt::print(fmt::color::steel_blue, "Some beautiful text"); | |
| ``` | |
| The old API (the `print_colored` and `vprint_colored` functions and | |
| the `color` enum) is now deprecated. | |
| (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. | |
| - 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). | |
| - 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. | |
| - Fixed compilation with MSVC 2013. | |
| - 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). | |
| - 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 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 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. | |
| # 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. | |
| - 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 | |
| ```c++ | |
| #include <fmt/format.h> | |
| 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)): | |
| ... | |
| <source>:4:19: note: in instantiation of function template specialization 'fmt::v5::format<S, char [4]>' 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. | |
| - Separated format string parsing and formatting in the extension API | |
| to enable compile-time format string processing. For example | |
| ```c++ | |
| struct Answer {}; | |
| namespace fmt { | |
| template <> | |
| struct formatter<Answer> { | |
| 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 <typename FormatContext> | |
| auto format(Answer, FormatContext& ctx) { | |
| return spec == 's' ? | |
| format_to(ctx.begin(), "{}", "fourty-two") : | |
| format_to(ctx.begin(), "{}", 42); | |
| } | |
| char spec = 0; | |
| }; | |
| } | |
| std::string s = format(fmt("{:x}"), Answer()); | |
| ``` | |
| gives a compile-time error due to invalid format specifier | |
| ([godbolt](https://godbolt.org/g/2jQ1Dv)): | |
| ... | |
| <source>:12:45: error: expression '<throw-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 <vector> | |
| #include <fmt/format.h> | |
| std::vector<char> 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 <fmt/format.h> | |
| 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/core.h> | |
| 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 <typename... Args> | |
| 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. | |
| - Added prefix `v` to non-variadic functions taking `format_args` to | |
| distinguish them from variadic ones: | |
| ```c++ | |
| std::string vformat(string_view format_str, format_args args); | |
| template <typename... Args> | |
| std::string format(string_view format_str, const Args & ... args); | |
| ``` | |
| - Added experimental support for formatting ranges, containers and | |
| tuple-like types in `fmt/ranges.h` | |
| (https://github.com/fmtlib/fmt/pull/735): | |
| ```c++ | |
| #include <fmt/ranges.h> | |
| std::vector<int> v = {1, 2, 3}; | |
| fmt::print("{}", v); // prints {1, 2, 3} | |
| ``` | |
| Thanks @Remotion. | |
| - Implemented `wchar_t` date and time formatting | |
| (https://github.com/fmtlib/fmt/pull/712): | |
| ```c++ | |
| #include <fmt/time.h> | |
| std::time_t t = std::time(nullptr); | |
| auto s = fmt::format(L"The date is {:%Y-%m-%d}.", *std::localtime(&t)); | |
| ``` | |
| Thanks @DanielaE. | |
| - Provided more wide string overloads | |
| (https://github.com/fmtlib/fmt/pull/724). Thanks @DanielaE. | |
| - 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. | |
| - Added support for `std::experimental::string_view` | |
| (https://github.com/fmtlib/fmt/pull/607): | |
| ```c++ | |
| #include <fmt/core.h> | |
| #include <experimental/string_view> | |
| fmt::print("{}", std::experimental::string_view("foo")); | |
| ``` | |
| Thanks @virgiliofornazin. | |
| - Allowed mixing named and automatic arguments: | |
| ```c++ | |
| fmt::format("{} {two}", 1, fmt::arg("two", 2)); | |
| ``` | |
| - 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. | |
| - Disallowed formatting of multibyte strings into a wide character | |
| target (https://github.com/fmtlib/fmt/pull/606). | |
| - 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. | |
| - Implemented more efficient handling of large number of format | |
| arguments. | |
| - Introduced an inline namespace for symbol versioning. | |
| - Added debug postfix `d` to the `fmt` library name | |
| (https://github.com/fmtlib/fmt/issues/636). | |
| - Removed unnecessary `fmt/` prefix in includes | |
| (https://github.com/fmtlib/fmt/pull/397). Thanks @chronoxor. | |
| - 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. | |
| - Added qmake project file `support/fmt.pro` | |
| (https://github.com/fmtlib/fmt/pull/641). Thanks @cowo78. | |
| - Added Gradle build file `support/build.gradle` | |
| (https://github.com/fmtlib/fmt/pull/649). Thanks @luncliff. | |
| - Removed `FMT_CPPFORMAT` CMake option. | |
| - Fixed a name conflict with the macro `CHAR_WIDTH` in glibc | |
| (https://github.com/fmtlib/fmt/pull/616). Thanks @aroig. | |
| - Fixed handling of nested braces in `fmt::join` | |
| (https://github.com/fmtlib/fmt/issues/638). | |
| - Added `SOURCELINK_SUFFIX` for compatibility with Sphinx 1.5 | |
| (https://github.com/fmtlib/fmt/pull/497). Thanks @ginggs. | |
| - Added a missing `inline` in the header-only mode | |
| (https://github.com/fmtlib/fmt/pull/626). Thanks @aroig. | |
| - 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. | |
| - Worked around an MSVC bug and fixed several warnings | |
| (https://github.com/fmtlib/fmt/pull/653). Thanks @alabuzhev. | |
| - 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. | |
| # 4.0.0 - 2017-06-27 | |
| - 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): | |
| ```c++ | |
| #include "fmt/string.h" | |
| std::string answer = fmt::to_string(42); | |
| ``` | |
| 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): | |
| ```c++ | |
| #include "fmt/printf.h" | |
| // %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. | |
| - 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): | |
| ```c++ | |
| #include "fmt/format.h" | |
| std::vector<double> 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. | |
| - 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 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. | |
| - 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`. | |
| - 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. | |
| - 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. | |
| # 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. | |
| # 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. | |
| # 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: | |
| ```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. | |
| The documentation is now available at <https://fmt.dev>. | |
| - 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" | |
| 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`: | |
| ```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) {} | |
| 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" | |
| ``` | |
| - 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): | |
| ```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): | |
| ```c++ | |
| fmt::printf("%lld", -42); // prints -42 | |
| ``` | |
| 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): | |
| ```c++ | |
| fmt::printf("%d", std::numeric_limits<long long>::max()); | |
| ``` | |
| Note that it would be an undefined behavior in `std::printf`. | |
| - 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. | |
| - Reduced compile time | |
| (https://github.com/fmtlib/fmt/pull/243, | |
| https://github.com/fmtlib/fmt/pull/249, | |
| https://github.com/fmtlib/fmt/issues/317): | |
|  | |
|  | |
| 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. | |
| - 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. | |
| - 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. | |
| - 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. | |
| - 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). | |
| - 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. | |
| - 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). | |
| # 2.1.0 - 2016-03-21 | |
| - 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. | |
| 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). | |
| # 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): | |
| ```c++ | |
| fmt::print("The answer is {answer}.", fmt::arg("answer", 42)); | |
| ``` | |
| 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): | |
| ```c++ | |
| using namespace fmt::literals; | |
| fmt::print("The answer is {answer}.", "answer"_a=42); | |
| ``` | |
| 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. | |
| - Runtime width specification | |
| (https://github.com/fmtlib/fmt/pull/168): | |
| ```c++ | |
| fmt::format("{0:{1}}", 42, 5); // gives " 42" | |
| ``` | |
| 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\] Changed default `bool` format to textual, \"true\" or | |
| \"false\" (https://github.com/fmtlib/fmt/issues/170): | |
| ```c++ | |
| fmt::print("{}", true); // prints "true" | |
| ``` | |
| To print `bool` as a number use numeric format specifier such as | |
| `d`: | |
| ```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): | |
| ```c++ | |
| fmt::printf("%s", true); // prints "true" | |
| ``` | |
| Thanks @LarsGullik. | |
| - \[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): | |
| ```c++ | |
| fmt::print("{:p}", "test"); // prints pointer value | |
| ``` | |
| 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): | |
| ```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\] 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 | |
| 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). | |
| - 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. | |
| - 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. | |
| - 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. | |
| - 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). | |
| ## Distribution | |
| - \[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. | |
| - 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 | |
| Thanks @jackyf. | |
| - [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): | |
| $ brew install cppformat | |
| 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 <http://cppformat.github.io/>. | |
| - 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. | |
| - \[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); | |
| ``` | |
| 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. | |
| - 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). | |
| - 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). | |
| - 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 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 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. | |
| - 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). | |
| - 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): | |
| ```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. | |
| - 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. | |
| 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 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: | |
|  | |
| - 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. | |
| - 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 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). | |
| - 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`: | |
| ```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. | |
| - 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)); | |
| ``` | |
| - 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): | |
| ```c++ | |
| fmt::print("{:.3}\n", "Carpet"); // prints "Car" | |
| ``` | |
| - Fix build on Android NDK (https://github.com/fmtlib/fmt/issues/93). | |
| - 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). | |
| - Fix error handling in `fmt::fprintf`. | |
| - 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. | |
| Old code: | |
| ```c++ | |
| fmt::Writer w; | |
| ``` | |
| New code: | |
| ```c++ | |
| fmt::MemoryWriter w; | |
| ``` | |
| If you pass `fmt::Writer` by reference, you can continue to do so: | |
| ```c++ | |
| void f(fmt::Writer &w); | |
| ``` | |
| This doesn\'t affect the formatting API. | |
| - 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): | |
| ```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. | |
| - Improved appearance of the documentation on mobile by using the | |
| [Sphinx Bootstrap | |
| theme](http://ryan-roemer.github.io/sphinx-bootstrap-theme/): | |
| | Old | New | | |
| | --- | --- | | |
| |  |  | | |
| # 0.11.0 - 2014-08-21 | |
| - 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); | |
| ``` | |
| - 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'); | |
| ``` | |
| - 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. | |
| # 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: | |
| ```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); | |
| ``` | |
| 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: | |
| ```c++ | |
| std::string s = format("The answer is {}.", 42); | |
| ``` | |
| Previously it required 2 function calls: | |
| ```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`: | |
| ```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). | |
| - 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. | |
| **Other Changes** | |
| - 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"); | |
| ``` | |
| - 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 | |
| ``` | |
| - 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. | |
| - `Writer::Format` now has a variadic overload: | |
| ```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`: | |
| ```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. | |
| - 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; | |
| ``` | |
| will throw `SystemError` exception with description \"Failed to open | |
| file \'\<filename\>\': No such file or directory\" if file doesn\'t | |
| exist. | |
| - Support for AppVeyor continuous integration platform. | |
| - `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. | |
| # 0.8.0 - 2014-04-14 | |
| - Initial release |