From 154eccfeb19960c543b7fad2888c4176bae8abd6 Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Mon, 4 Sep 2023 07:07:24 -0700 Subject: [PATCH] Convert changelog to markdown for compatibility with release notes --- CMakeLists.txt | 2 +- ChangeLog.md | 5885 +++++++++++++++++++++++++++++++++++++++++++++++ ChangeLog.rst | 5922 ------------------------------------------------ 3 files changed, 5886 insertions(+), 5923 deletions(-) create mode 100644 ChangeLog.md delete mode 100644 ChangeLog.rst diff --git a/CMakeLists.txt b/CMakeLists.txt index bcdd1101..c2a54b5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -283,7 +283,7 @@ if (FMT_OS) endif () add_module_library(fmt src/fmt.cc FALLBACK - ${FMT_SOURCES} ${FMT_HEADERS} README.rst ChangeLog.rst + ${FMT_SOURCES} ${FMT_HEADERS} README.rst ChangeLog.md IF FMT_MODULE) add_library(fmt::fmt ALIAS fmt) if (FMT_MODULE) diff --git a/ChangeLog.md b/ChangeLog.md new file mode 100644 index 00000000..1e586e03 --- /dev/null +++ b/ChangeLog.md @@ -0,0 +1,5885 @@ +# 10.1.1 - 2023-08-28 + +- Added formatters for `std::atomic` and `atomic_flag` + ([#3574](https://github.com/fmtlib/fmt/pull/3574), + [#3594](https://github.com/fmtlib/fmt/pull/3594)). Thanks [\@wangzw + (Zhanwei Wang)](https://github.com/wangzw) and [\@AlexGuteniev (Alex + Guteniev)](https://github.com/AlexGuteniev). +- Fixed an error about partial specialization of `formatter` + after instantiation when compiled with gcc and C++20 + ([#3584](https://github.com/fmtlib/fmt/issues/3584)). +- Fixed compilation as a C++20 module with gcc and clang + ([#3587](https://github.com/fmtlib/fmt/issues/3587), + [#3597](https://github.com/fmtlib/fmt/pull/3597), + [#3605](https://github.com/fmtlib/fmt/pull/3605)). Thanks + [\@MathewBensonCode (Mathew + Benson)](https://github.com/MathewBensonCode). +- Made `fmt::to_string` work with types that have `format_as` + overloads ([#3575](https://github.com/fmtlib/fmt/pull/3575)). Thanks + [\@phprus (Vladislav Shchapov)](https://github.com/phprus). +- Made `formatted_size` work with integral format specifiers at + compile time ([#3591](https://github.com/fmtlib/fmt/pull/3591)). + Thanks [\@elbeno (Ben Deane)](https://github.com/elbeno). +- Fixed a warning about the `no_unique_address` attribute on clang-cl + ([#3599](https://github.com/fmtlib/fmt/pull/3599)). Thanks + [\@lukester1975](https://github.com/lukester1975). +- Improved compatibility with the legacy GBK encoding + ([#3598](https://github.com/fmtlib/fmt/issues/3598), + [#3599](https://github.com/fmtlib/fmt/pull/3599)). Thanks + [\@YuHuanTin](https://github.com/YuHuanTin). +- Added OpenSSF Scorecard analysis + ([#3530](https://github.com/fmtlib/fmt/issues/3530), + [#3571](https://github.com/fmtlib/fmt/pull/3571)). Thanks + [\@joycebrum (Joyce)](https://github.com/joycebrum). +- Updated CI dependencies + ([#3591](https://github.com/fmtlib/fmt/pull/3591), + [#3592](https://github.com/fmtlib/fmt/pull/3592), + [#3593](https://github.com/fmtlib/fmt/pull/3593), + [#3602](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 + ([#3133](https://github.com/fmtlib/fmt/issues/3133), + [#3484](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` + ([#3485](https://github.com/fmtlib/fmt/pull/3485)). Thanks + [\@Minty-Meeo](https://github.com/Minty-Meeo). + +- Added formatters for proxy references to elements of + `std::vector` and `std::bitset` + ([#3567](https://github.com/fmtlib/fmt/issues/3567), + [#3570](https://github.com/fmtlib/fmt/pull/3570)). For example + ([godbolt](https://godbolt.org/z/zYb79Pvn8)): + + ```c++ + #include + #include + + int main() { + auto v = std::vector{true}; + fmt::print("{}", v[0]); + } + ``` + + Thanks [\@phprus (Vladislav Shchapov)](https://github.com/phprus) + and [\@felix642 (Félix-Antoine + Constantin)](https://github.com/felix642). + +- Fixed an ambiguous formatter specialization for containers that look + like container adaptors such as `boost::flat_set` + ([#3556](https://github.com/fmtlib/fmt/issues/3556), + [#3561](https://github.com/fmtlib/fmt/pull/3561)). Thanks + [\@5chmidti](https://github.com/5chmidti). + +- Fixed compilation when formatting durations not convertible from + `std::chrono::seconds` + ([#3430](https://github.com/fmtlib/fmt/pull/3430)). Thanks + [\@patlkli (Patrick Geltinger)](https://github.com/patlkli). + +- Made the `formatter` specialization for `char*` const-correct + ([#3432](https://github.com/fmtlib/fmt/pull/3432)). Thanks + [\@timsong-cpp](https://github.com/timsong-cpp). + +- Made `{}` and `{:}` handled consistently during compile-time checks + ([#3526](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 + ([#3478](https://github.com/fmtlib/fmt/pull/3478)). Thanks + [\@BRevzin (Barry Revzin)](https://github.com/BRevzin). + +- Improved the floating-point formatter + ([#3448](https://github.com/fmtlib/fmt/pull/3448), + [#3450](https://github.com/fmtlib/fmt/pull/3450)). Thanks + [\@florimond-collette (Florimond + Collette)](https://github.com/florimond-collette). + +- Fixed handling of precision for `long double` larger than 64 bits. + ([#3539](https://github.com/fmtlib/fmt/issues/3539), + [#3564](https://github.com/fmtlib/fmt/issues/3564)). + +- Made floating-point and chrono tests less platform-dependent + ([#3337](https://github.com/fmtlib/fmt/issues/3337), + [#3433](https://github.com/fmtlib/fmt/issues/3433), + [#3434](https://github.com/fmtlib/fmt/pull/3434)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/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 + ([#3551](https://github.com/fmtlib/fmt/pull/3551)). Thanks + [\@mjerabek (Martin Jeřábek)](https://github.com/mjerabek). + +- Made `FMT_THROW` assert even if assertions are disabled when + compiling with exceptions disabled + ([#3418](https://github.com/fmtlib/fmt/issues/3418), + [#3439](https://github.com/fmtlib/fmt/pull/3439)). Thanks [\@BRevzin + (Barry Revzin)](https://github.com/BRevzin). + +- Made `format_as` and `std::filesystem::path` formatter work with + exotic code unit types. + ([#3457](https://github.com/fmtlib/fmt/pull/3457), + [#3476](https://github.com/fmtlib/fmt/pull/3476)). Thanks [\@gix + (Nico Rieck)](https://github.com/gix), [\@hmbj (Hans-Martin B. + Jensen)](https://github.com/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 + ([#3468](https://github.com/fmtlib/fmt/pull/3468)). Thanks [\@danakj + (Dana Jansens)](https://github.com/danakj). + +- Improved compatibility with VxWorks7 + ([#3467](https://github.com/fmtlib/fmt/pull/3467)). Thanks + [\@wenshan1 (Bin Lan)](https://github.com/wenshan1). + +- Improved documentation + ([#3174](https://github.com/fmtlib/fmt/issues/3174), + [#3423](https://github.com/fmtlib/fmt/issues/3423), + [#3454](https://github.com/fmtlib/fmt/pull/3454), + [#3458](https://github.com/fmtlib/fmt/issues/3458), + [#3461](https://github.com/fmtlib/fmt/pull/3461), + [#3487](https://github.com/fmtlib/fmt/issues/3487), + [#3515](https://github.com/fmtlib/fmt/pull/3515)). Thanks + [\@zencatalyst (Kasra Hashemi)](https://github.com/zencatalyst), + [\@rlalik](https://github.com/rlalik), [\@mikecrowe (Mike + Crowe)](https://github.com/mikecrowe). + +- Improved build and CI configurations + ([#3449](https://github.com/fmtlib/fmt/issues/3449), + [#3451](https://github.com/fmtlib/fmt/pull/3451), + [#3452](https://github.com/fmtlib/fmt/pull/3452), + [#3453](https://github.com/fmtlib/fmt/pull/3453), + [#3459](https://github.com/fmtlib/fmt/pull/3459), + [#3481](https://github.com/fmtlib/fmt/issues/3481), + [#3486](https://github.com/fmtlib/fmt/pull/3486), + [#3489](https://github.com/fmtlib/fmt/issues/3489), + [#3496](https://github.com/fmtlib/fmt/pull/3496), + [#3517](https://github.com/fmtlib/fmt/issues/3517), + [#3523](https://github.com/fmtlib/fmt/pull/3523), + [#3563](https://github.com/fmtlib/fmt/pull/3563)). Thanks + [\@joycebrum (Joyce)](https://github.com/joycebrum), [\@glebm (Gleb + Mazovetskiy)](https://github.com/glebm), [\@phprus (Vladislav + Shchapov)](https://github.com/phprus), [\@petrmanek (Petr + Mánek)](https://github.com/petrmanek), [\@setoye + (Alta)](https://github.com/setoye), [\@abouvier (Alexandre + Bouvier)](https://github.com/abouvier). + +- Fixed various warnings and compilation issues + ([#3408](https://github.com/fmtlib/fmt/issues/3408), + [#3424](https://github.com/fmtlib/fmt/issues/3424), + [#3444](https://github.com/fmtlib/fmt/issues/3444), + [#3446](https://github.com/fmtlib/fmt/pull/3446), + [#3475](https://github.com/fmtlib/fmt/pull/3475), + [#3482](https://github.com/fmtlib/fmt/pull/3482), + [#3492](https://github.com/fmtlib/fmt/issues/3492), + [#3493](https://github.com/fmtlib/fmt/pull/3493), + [#3508](https://github.com/fmtlib/fmt/pull/3508), + [#3509](https://github.com/fmtlib/fmt/issues/3509), + [#3533](https://github.com/fmtlib/fmt/issues/3533), + [#3542](https://github.com/fmtlib/fmt/pull/3542), + [#3543](https://github.com/fmtlib/fmt/issues/3543), + [#3540](https://github.com/fmtlib/fmt/issues/3540), + [#3544](https://github.com/fmtlib/fmt/pull/3544), + [#3548](https://github.com/fmtlib/fmt/issues/3548), + [#3549](https://github.com/fmtlib/fmt/pull/3549), + [#3550](https://github.com/fmtlib/fmt/pull/3550), + [#3552](https://github.com/fmtlib/fmt/pull/3552)). Thanks + [\@adesitter (Arnaud Desitter)](https://github.com/adesitter), + [\@hmbj (Hans-Martin B. Jensen)](https://github.com/hmbj), + [\@Minty-Meeo](https://github.com/Minty-Meeo), [\@phprus (Vladislav + Shchapov)](https://github.com/phprus), [\@TobiSchluter (Tobias + Schlüter)](https://github.com/TobiSchluter), [\@kieranclancy (Kieran + Clancy)](https://github.com/kieranclancy), [\@alexeedm (Dmitry + Alexeev)](https://github.com/alexeedm), [\@jurihock (Jürgen + Hock)](https://github.com/jurihock), + [\@Ozomahtli](https://github.com/Ozomahtli), + [\@razaqq](https://github.com/razaqq). + +# 10.0.0 - 2023-05-09 + +- Replaced Grisu with a new floating-point formatting algorithm for + given precision ([#3262](https://github.com/fmtlib/fmt/issues/3262), + [#2750](https://github.com/fmtlib/fmt/issues/2750), + [#3269](https://github.com/fmtlib/fmt/pull/3269), + [#3276](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: + + ![image](https://user-images.githubusercontent.com/33922675/%0A211956670-84891a09-6867-47d9-82fc-3230da7abe0f.png) + + - Red: new algorithm + - Green: new algorithm with `FMT_USE_FULL_CACHE_DRAGONBOX` defined + to 1 + - Blue: old algorithm + + Thanks [\@jk-jeon (Junekey Jeon)](https://github.com/jk-jeon). + +- Replaced `snprintf`-based hex float formatter with an internal + implementation ([#3179](https://github.com/fmtlib/fmt/pull/3179), + [#3203](https://github.com/fmtlib/fmt/pull/3203)). This removes the + last usage of `s(n)printf` in {fmt}. Thanks [\@phprus (Vladislav + Shchapov)](https://github.com/phprus). + +- Fixed alignment of floating-point numbers with localization + ([#3263](https://github.com/fmtlib/fmt/issues/3263), + [#3272](https://github.com/fmtlib/fmt/pull/3272)). Thanks + [\@ShawnZhong (Shawn Zhong)](https://github.com/ShawnZhong). + +- Made handling of `#` consistent with `std::format`. + +- Improved C++20 module support + ([#3134](https://github.com/fmtlib/fmt/pull/3134), + [#3254](https://github.com/fmtlib/fmt/pull/3254), + [#3386](https://github.com/fmtlib/fmt/pull/3386), + [#3387](https://github.com/fmtlib/fmt/pull/3387), + [#3388](https://github.com/fmtlib/fmt/pull/3388), + [#3392](https://github.com/fmtlib/fmt/pull/3392), + [#3397](https://github.com/fmtlib/fmt/pull/3397), + [#3399](https://github.com/fmtlib/fmt/pull/3399), + [#3400](https://github.com/fmtlib/fmt/pull/3400)). Thanks + [\@laitingsheng (Tinson Lai)](https://github.com/laitingsheng), + [\@Orvid (Orvid King)](https://github.com/Orvid), [\@DanielaE + (Daniela Engert)](https://github.com/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 + + 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 + ([#3237](https://github.com/fmtlib/fmt/issues/3237), + [#3260](https://github.com/fmtlib/fmt/pull/3260), + [#3275](https://github.com/fmtlib/fmt/pull/3275)). For example + ([godbolt](https://godbolt.org/z/rKP6MGz6c)): + + ```c++ + #include + + int main() { + // prints " 2023" + fmt::print("{:>8%Y}\n", std::chrono::system_clock::now()); + } + ``` + + Thanks [\@ShawnZhong (Shawn Zhong)](https://github.com/ShawnZhong). + +- Implemented formatting of subseconds + ([#2207](https://github.com/fmtlib/fmt/issues/2207), + [#3117](https://github.com/fmtlib/fmt/issues/3117), + [#3115](https://github.com/fmtlib/fmt/pull/3115), + [#3143](https://github.com/fmtlib/fmt/pull/3143), + [#3144](https://github.com/fmtlib/fmt/pull/3144), + [#3349](https://github.com/fmtlib/fmt/pull/3349)). For example + ([godbolt](https://godbolt.org/z/45738oGEo)): + + ```c++ + #include + + int main() { + // prints 01.234567 + fmt::print("{:%S}\n", std::chrono::microseconds(1234567)); + } + ``` + + Thanks [\@patrickroocks (Patrick + Roocks)](https://github.com/patrickroocks) [\@phprus (Vladislav + Shchapov)](https://github.com/phprus), [\@BRevzin (Barry + Revzin)](https://github.com/BRevzin). + +- Added precision support to `%S` + ([#3148](https://github.com/fmtlib/fmt/pull/3148)). Thanks + [\@SappyJoy (Stepan Ponomaryov)](https://github.com/SappyJoy) + +- Added support for `std::utc_time` + ([#3098](https://github.com/fmtlib/fmt/issues/3098), + [#3110](https://github.com/fmtlib/fmt/pull/3110)). Thanks + [\@patrickroocks (Patrick + Roocks)](https://github.com/patrickroocks). + +- Switched formatting of `std::chrono::system_clock` from local time + to UTC for compatibility with the standard + ([#3199](https://github.com/fmtlib/fmt/issues/3199), + [#3230](https://github.com/fmtlib/fmt/pull/3230)). Thanks [\@ned14 + (Niall Douglas)](https://github.com/ned14). + +- Added support for `%Ez` and `%Oz` to chrono formatters. + ([#3220](https://github.com/fmtlib/fmt/issues/3220), + [#3222](https://github.com/fmtlib/fmt/pull/3222)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus). + +- Improved validation of format specifiers for `std::chrono::duration` + ([#3219](https://github.com/fmtlib/fmt/issues/3219), + [#3232](https://github.com/fmtlib/fmt/pull/3232)). Thanks + [\@ShawnZhong (Shawn Zhong)](https://github.com/ShawnZhong). + +- Fixed formatting of time points before the epoch + ([#3117](https://github.com/fmtlib/fmt/issues/3117), + [#3261](https://github.com/fmtlib/fmt/pull/3261)). For example + ([godbolt](https://godbolt.org/z/f7bcznb3W)): + + ```c++ + #include + + int main() { + auto t = std::chrono::system_clock::from_time_t(0) - + std::chrono::milliseconds(250); + fmt::print("{:%S}\n", t); // prints 59.750000000 + } + ``` + + Thanks [\@ShawnZhong (Shawn Zhong)](https://github.com/ShawnZhong). + +- Experimental: implemented glibc extension for padding seconds, + minutes and hours + ([#2959](https://github.com/fmtlib/fmt/issues/2959), + [#3271](https://github.com/fmtlib/fmt/pull/3271)). Thanks + [\@ShawnZhong (Shawn Zhong)](https://github.com/ShawnZhong). + +- Added a formatter for `std::exception` + ([#2977](https://github.com/fmtlib/fmt/issues/2977), + [#3012](https://github.com/fmtlib/fmt/issues/3012), + [#3062](https://github.com/fmtlib/fmt/pull/3062), + [#3076](https://github.com/fmtlib/fmt/pull/3076), + [#3119](https://github.com/fmtlib/fmt/pull/3119)). For example + ([godbolt](https://godbolt.org/z/8xoWGs9e4)): + + ```c++ + #include + #include + + int main() { + try { + std::vector().at(0); + } catch(const std::exception& e) { + fmt::print("{}", e); + } + } + ``` + + prints: + + vector::_M_range_check: __n (which is 0) >= this->size() (which is 0) + + on libstdc++. Thanks [\@zach2good (Zach + Toogood)](https://github.com/zach2good) and [\@phprus (Vladislav + Shchapov)](https://github.com/phprus). + +- Moved `std::error_code` formatter from `fmt/os.h` to `fmt/std.h`. + ([#3125](https://github.com/fmtlib/fmt/pull/3125)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus). + +- Added formatters for standard container adapters: + `std::priority_queue`, `std::queue` and `std::stack` + ([#3215](https://github.com/fmtlib/fmt/issues/3215), + [#3279](https://github.com/fmtlib/fmt/pull/3279)). For example + ([godbolt](https://godbolt.org/z/74h1xY9qK)): + + ```c++ + #include + #include + #include + + int main() { + auto s = std::stack>(); + for (auto b: {true, false, true}) s.push(b); + fmt::print("{}\n", s); // prints [true, false, true] + } + ``` + + Thanks [\@ShawnZhong (Shawn Zhong)](https://github.com/ShawnZhong). + +- Added a formatter for `std::optional` to `fmt/std.h`. Thanks + [\@tom-huntington](https://github.com/tom-huntington). + +- Fixed formatting of valueless by exception variants + ([#3347](https://github.com/fmtlib/fmt/pull/3347)). Thanks + [\@TheOmegaCarrot](https://github.com/TheOmegaCarrot). + +- Made `fmt::ptr` accept `unique_ptr` with a custom deleter + ([#3177](https://github.com/fmtlib/fmt/pull/3177)). Thanks [\@hmbj + (Hans-Martin B. Jensen)](https://github.com/hmbj). + +- Fixed formatting of noncopyable ranges and nested ranges of chars + ([#3158](https://github.com/fmtlib/fmt/pull/3158) + [#3286](https://github.com/fmtlib/fmt/issues/3286), + [#3290](https://github.com/fmtlib/fmt/pull/3290)). Thanks [\@BRevzin + (Barry Revzin)](https://github.com/BRevzin). + +- Fixed issues with formatting of paths and ranges of paths + ([#3319](https://github.com/fmtlib/fmt/issues/3319), + [#3321](https://github.com/fmtlib/fmt/pull/3321) + [#3322](https://github.com/fmtlib/fmt/issues/3322)). Thanks + [\@phprus (Vladislav Shchapov)](https://github.com/phprus). + +- Improved handling of invalid Unicode in paths. + +- Enabled compile-time checks on Apple clang 14 and later + ([#3331](https://github.com/fmtlib/fmt/pull/3331)). Thanks [\@cloyce + (Cloyce D. Spradling)](https://github.com/cloyce). + +- Improved compile-time checks of named arguments + ([#3105](https://github.com/fmtlib/fmt/issues/3105), + [#3214](https://github.com/fmtlib/fmt/pull/3214)). Thanks [\@rbrich + (Radek Brich)](https://github.com/rbrich). + +- Fixed formatting when both alignment and `0` are given + ([#3236](https://github.com/fmtlib/fmt/issues/3236), + [#3248](https://github.com/fmtlib/fmt/pull/3248)). Thanks + [\@ShawnZhong (Shawn Zhong)](https://github.com/ShawnZhong). + +- Improved Unicode support in the experimental file API on Windows + ([#3234](https://github.com/fmtlib/fmt/issues/3234), + [#3293](https://github.com/fmtlib/fmt/pull/3293)). Thanks [\@Fros1er + (Froster)](https://github.com/Fros1er). + +- Unified UTF transcoding + ([#3416](https://github.com/fmtlib/fmt/pull/3416)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus). + +- Added support for UTF-8 digit separators via an experimental locale + facet ([#1861](https://github.com/fmtlib/fmt/issues/1861)). For + example ([godbolt](https://godbolt.org/z/f7bcznb3W)): + + ```c++ + auto loc = std::locale( + std::locale(), new fmt::format_facet("’")); + auto s = fmt::format(loc, "{:L}", 1000); + ``` + + where `’` is U+2019 used as a digit separator in the de_CH locale. + +- Added an overload of `formatted_size` that takes a locale + ([#3084](https://github.com/fmtlib/fmt/issues/3084), + [#3087](https://github.com/fmtlib/fmt/pull/3087)). Thanks + [\@gerboengels](https://github.com/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 + ([#3241](https://github.com/fmtlib/fmt/issues/3241), + [#3244](https://github.com/fmtlib/fmt/pull/3244)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus). + +- Added `starts_with` to the fallback `string_view` implementation + ([#3080](https://github.com/fmtlib/fmt/pull/3080)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus). + +- Added `fmt::basic_format_string::get()` for compatibility with + `basic_format_string` + ([#3111](https://github.com/fmtlib/fmt/pull/3111)). Thanks + [\@huangqinjin](https://github.com/huangqinjin). + +- Added `println` for compatibility with C++23 + ([#3267](https://github.com/fmtlib/fmt/pull/3267)). Thanks + [\@ShawnZhong (Shawn Zhong)](https://github.com/ShawnZhong). + +- Renamed the `FMT_EXPORT` macro for shared library usage to + `FMT_LIB_EXPORT`. + +- Improved documentation + ([#3108](https://github.com/fmtlib/fmt/issues/3108), + [#3169](https://github.com/fmtlib/fmt/issues/3169), + [#3243](https://github.com/fmtlib/fmt/pull/3243)). + [#3404](https://github.com/fmtlib/fmt/pull/3404)). Thanks + [\@Cleroth](https://github.com/Cleroth) and + [\@Vertexwahn](https://github.com/Vertexwahn). + +- Improved build configuration and tests + ([#3118](https://github.com/fmtlib/fmt/pull/3118), + [#3120](https://github.com/fmtlib/fmt/pull/3120), + [#3188](https://github.com/fmtlib/fmt/pull/3188), + [#3189](https://github.com/fmtlib/fmt/issues/3189), + [#3198](https://github.com/fmtlib/fmt/pull/3198), + [#3205](https://github.com/fmtlib/fmt/pull/3205), + [#3207](https://github.com/fmtlib/fmt/pull/3207), + [#3210](https://github.com/fmtlib/fmt/pull/3210), + [#3240](https://github.com/fmtlib/fmt/pull/3240), + [#3256](https://github.com/fmtlib/fmt/pull/3256), + [#3264](https://github.com/fmtlib/fmt/pull/3264), + [#3299](https://github.com/fmtlib/fmt/issues/3299), + [#3302](https://github.com/fmtlib/fmt/pull/3302), + [#3312](https://github.com/fmtlib/fmt/pull/3312), + [#3317](https://github.com/fmtlib/fmt/issues/3317), + [#3328](https://github.com/fmtlib/fmt/pull/3328), + [#3333](https://github.com/fmtlib/fmt/pull/3333), + [#3369](https://github.com/fmtlib/fmt/pull/3369), + [#3373](https://github.com/fmtlib/fmt/issues/3373), + [#3395](https://github.com/fmtlib/fmt/pull/3395), + [#3406](https://github.com/fmtlib/fmt/pull/3406), + [#3411](https://github.com/fmtlib/fmt/pull/3411)). Thanks + [\@dimztimz (Dimitrij Mijoski)](https://github.com/dimztimz), + [\@phprus (Vladislav Shchapov)](https://github.com/phprus), + [\@DavidKorczynski](https://github.com/DavidKorczynski), + [\@ChrisThrasher (Chris + Thrasher)](https://github.com/ChrisThrasher), [\@FrancoisCarouge + (François Carouge)](https://github.com/FrancoisCarouge), + [\@kennyweiss (Kenny Weiss)](https://github.com/kennyweiss), + [\@luzpaz](https://github.com/luzpaz), [\@codeinred (Alecto Irene + Perez)](https://github.com/codeinred), [\@Mixaill (Mikhail + Paulyshka)](https://github.com/Mixaill), [\@joycebrum + (Joyce)](https://github.com/joycebrum), [\@kevinhwang (Kevin + Hwang)](https://github.com/kevinhwang), + [\@Vertexwahn](https://github.com/Vertexwahn). + +- Fixed a regression in handling empty format specifiers after a colon + (`{:}`) ([#3086](https://github.com/fmtlib/fmt/pull/3086)). Thanks + [\@oxidase (Michael Krasnyk)](https://github.com/oxidase). + +- Worked around a broken implementation of + `std::is_constant_evaluated` in some versions of libstdc++ on clang + ([#3247](https://github.com/fmtlib/fmt/issues/3247), + [#3281](https://github.com/fmtlib/fmt/pull/3281)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus). + +- Fixed formatting of volatile variables + ([#3068](https://github.com/fmtlib/fmt/pull/3068)). + +- Fixed various warnings and compilation issues + ([#3057](https://github.com/fmtlib/fmt/pull/3057), + [#3066](https://github.com/fmtlib/fmt/pull/3066), + [#3072](https://github.com/fmtlib/fmt/pull/3072), + [#3082](https://github.com/fmtlib/fmt/pull/3082), + [#3091](https://github.com/fmtlib/fmt/pull/3091), + [#3092](https://github.com/fmtlib/fmt/issues/3092), + [#3093](https://github.com/fmtlib/fmt/pull/3093), + [#3095](https://github.com/fmtlib/fmt/pull/3095), + [#3096](https://github.com/fmtlib/fmt/issues/3096), + [#3097](https://github.com/fmtlib/fmt/pull/3097), + [#3128](https://github.com/fmtlib/fmt/issues/3128), + [#3129](https://github.com/fmtlib/fmt/pull/3129), + [#3137](https://github.com/fmtlib/fmt/pull/3137), + [#3139](https://github.com/fmtlib/fmt/pull/3139), + [#3140](https://github.com/fmtlib/fmt/issues/3140), + [#3142](https://github.com/fmtlib/fmt/pull/3142), + [#3149](https://github.com/fmtlib/fmt/issues/3149), + [#3150](https://github.com/fmtlib/fmt/pull/3150), + [#3154](https://github.com/fmtlib/fmt/issues/3154), + [#3163](https://github.com/fmtlib/fmt/issues/3163), + [#3178](https://github.com/fmtlib/fmt/issues/3178), + [#3184](https://github.com/fmtlib/fmt/pull/3184), + [#3196](https://github.com/fmtlib/fmt/pull/3196), + [#3204](https://github.com/fmtlib/fmt/issues/3204), + [#3206](https://github.com/fmtlib/fmt/pull/3206), + [#3208](https://github.com/fmtlib/fmt/pull/3208), + [#3213](https://github.com/fmtlib/fmt/issues/3213), + [#3216](https://github.com/fmtlib/fmt/pull/3216), + [#3224](https://github.com/fmtlib/fmt/issues/3224), + [#3226](https://github.com/fmtlib/fmt/issues/3226), + [#3228](https://github.com/fmtlib/fmt/issues/3228), + [#3229](https://github.com/fmtlib/fmt/pull/3229), + [#3259](https://github.com/fmtlib/fmt/pull/3259), + [#3274](https://github.com/fmtlib/fmt/issues/3274), + [#3287](https://github.com/fmtlib/fmt/issues/3287), + [#3288](https://github.com/fmtlib/fmt/pull/3288), + [#3292](https://github.com/fmtlib/fmt/issues/3292), + [#3295](https://github.com/fmtlib/fmt/pull/3295), + [#3296](https://github.com/fmtlib/fmt/pull/3296), + [#3298](https://github.com/fmtlib/fmt/issues/3298), + [#3325](https://github.com/fmtlib/fmt/issues/3325), + [#3326](https://github.com/fmtlib/fmt/pull/3326), + [#3334](https://github.com/fmtlib/fmt/issues/3334), + [#3342](https://github.com/fmtlib/fmt/issues/3342), + [#3343](https://github.com/fmtlib/fmt/pull/3343), + [#3351](https://github.com/fmtlib/fmt/issues/3351), + [#3352](https://github.com/fmtlib/fmt/pull/3352), + [#3362](https://github.com/fmtlib/fmt/pull/3362), + [#3365](https://github.com/fmtlib/fmt/issues/3365), + [#3366](https://github.com/fmtlib/fmt/pull/3366), + [#3374](https://github.com/fmtlib/fmt/pull/3374), + [#3377](https://github.com/fmtlib/fmt/issues/3377), + [#3378](https://github.com/fmtlib/fmt/pull/3378), + [#3381](https://github.com/fmtlib/fmt/issues/3381), + [#3398](https://github.com/fmtlib/fmt/pull/3398), + [#3413](https://github.com/fmtlib/fmt/pull/3413), + [#3415](https://github.com/fmtlib/fmt/issues/3415)). Thanks + [\@phprus (Vladislav Shchapov)](https://github.com/phprus), + [\@gsjaardema (Greg Sjaardema)](https://github.com/gsjaardema), + [\@NewbieOrange](https://github.com/NewbieOrange), [\@EngineLessCC + (VivyaCC)](https://github.com/EngineLessCC), [\@asmaloney (Andy + Maloney)](https://github.com/asmaloney), [\@HazardyKnusperkeks + (Björn Schäpers)](https://github.com/HazardyKnusperkeks), [\@sergiud + (Sergiu Deitsch)](https://github.com/sergiud), [\@Youw (Ihor + Dutchak)](https://github.com/Youw), + [\@thesmurph](https://github.com/thesmurph), [\@czudziakm + (Maksymilian Czudziak)](https://github.com/czudziakm), + [\@Roman-Koshelev](https://github.com/Roman-Koshelev), [\@chronoxor + (Ivan Shynkarenka)](https://github.com/chronoxor), [\@ShawnZhong + (Shawn Zhong)](https://github.com/ShawnZhong), [\@russelltg (Russell + Greene)](https://github.com/russelltg), [\@glebm (Gleb + Mazovetskiy)](https://github.com/glebm), + [\@tmartin-gh](https://github.com/tmartin-gh), [\@Zhaojun-Liu (June + Liu)](https://github.com/Zhaojun-Liu), [\@louiswins (Louis + Wilson)](https://github.com/louiswins), + [\@mogemimi](https://github.com/mogemimi). + +# 9.1.0 - 2022-08-27 + +- `fmt::formatted_size` now works at compile time + ([#3026](https://github.com/fmtlib/fmt/pull/3026)). For example + ([godbolt](https://godbolt.org/z/1MW5rMdf8)): + + ```c++ + #include + + int main() { + using namespace fmt::literals; + constexpr size_t n = fmt::formatted_size("{}"_cf, 42); + fmt::print("{}\n", n); // prints 2 + } + ``` + + Thanks [\@marksantaniello (Mark + Santaniello)](https://github.com/marksantaniello). + +- Fixed handling of invalid UTF-8 + ([#3038](https://github.com/fmtlib/fmt/pull/3038), + [#3044](https://github.com/fmtlib/fmt/pull/3044), + [#3056](https://github.com/fmtlib/fmt/pull/3056)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus) and [\@skeeto + (Christopher Wellons)](https://github.com/skeeto). + +- Improved Unicode support in `ostream` overloads of `print` + ([#2994](https://github.com/fmtlib/fmt/pull/2994), + [#3001](https://github.com/fmtlib/fmt/pull/3001), + [#3025](https://github.com/fmtlib/fmt/pull/3025)). Thanks + [\@dimztimz (Dimitrij Mijoski)](https://github.com/dimztimz). + +- Fixed handling of the sign specifier in localized formatting on + systems with 32-bit `wchar_t` + ([#3041](https://github.com/fmtlib/fmt/issues/3041)). + +- Added support for wide streams to `fmt::streamed` + ([#2994](https://github.com/fmtlib/fmt/pull/2994)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus). + +- Added the `n` specifier that disables the output of delimiters when + formatting ranges ([#2981](https://github.com/fmtlib/fmt/pull/2981), + [#2983](https://github.com/fmtlib/fmt/pull/2983)). For example + ([godbolt](https://godbolt.org/z/roKqGdj8c)): + + ```c++ + #include + #include + + int main() { + auto v = std::vector{1, 2, 3}; + fmt::print("{:n}\n", v); // prints 1, 2, 3 + } + ``` + + Thanks [\@BRevzin (Barry Revzin)](https://github.com/BRevzin). + +- Worked around problematic `std::string_view` constructors introduced + in C++23 ([#3030](https://github.com/fmtlib/fmt/issues/3030), + [#3050](https://github.com/fmtlib/fmt/issues/3050)). Thanks + [\@strega-nil-ms (nicole + mazzuca)](https://github.com/strega-nil-ms). + +- Improve handling (exclusion) of recursive ranges + ([#2968](https://github.com/fmtlib/fmt/issues/2968), + [#2974](https://github.com/fmtlib/fmt/pull/2974)). Thanks + [\@Dani-Hub (Daniel Krügler)](https://github.com/Dani-Hub). + +- Improved error reporting in format string compilation + ([#3055](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 + ([#2984](https://github.com/fmtlib/fmt/pull/2984)). Thanks + [\@jk-jeon (Junekey Jeon)](https://github.com/jk-jeon). + +- Fixed issues with floating-point formatting on exotic platforms. + +- Improved the implementation of chrono formatting + ([#3010](https://github.com/fmtlib/fmt/pull/3010)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus). + +- Improved documentation + ([#2966](https://github.com/fmtlib/fmt/pull/2966), + [#3009](https://github.com/fmtlib/fmt/pull/3009), + [#3020](https://github.com/fmtlib/fmt/issues/3020), + [#3037](https://github.com/fmtlib/fmt/pull/3037)). Thanks + [\@mwinterb](https://github.com/mwinterb), [\@jcelerier + (Jean-Michaël Celerier)](https://github.com/jcelerier) and + [\@remiburtin (Rémi Burtin)](https://github.com/remiburtin). + +- Improved build configuration + ([#2991](https://github.com/fmtlib/fmt/pull/2991), + [#2995](https://github.com/fmtlib/fmt/pull/2995), + [#3004](https://github.com/fmtlib/fmt/issues/3004), + [#3007](https://github.com/fmtlib/fmt/pull/3007), + [#3040](https://github.com/fmtlib/fmt/pull/3040)). Thanks + [\@dimztimz (Dimitrij Mijoski)](https://github.com/dimztimz) and + [\@hwhsu1231 (Haowei Hsu)](https://github.com/hwhsu1231). + +- Fixed various warnings and compilation issues + ([#2969](https://github.com/fmtlib/fmt/issues/2969), + [#2971](https://github.com/fmtlib/fmt/pull/2971), + [#2975](https://github.com/fmtlib/fmt/issues/2975), + [#2982](https://github.com/fmtlib/fmt/pull/2982), + [#2985](https://github.com/fmtlib/fmt/pull/2985), + [#2988](https://github.com/fmtlib/fmt/issues/2988), + [#2989](https://github.com/fmtlib/fmt/issues/2989), + [#3000](https://github.com/fmtlib/fmt/issues/3000), + [#3006](https://github.com/fmtlib/fmt/issues/3006), + [#3014](https://github.com/fmtlib/fmt/issues/3014), + [#3015](https://github.com/fmtlib/fmt/issues/3015), + [#3021](https://github.com/fmtlib/fmt/pull/3021), + [#3023](https://github.com/fmtlib/fmt/issues/3023), + [#3024](https://github.com/fmtlib/fmt/pull/3024), + [#3029](https://github.com/fmtlib/fmt/pull/3029), + [#3043](https://github.com/fmtlib/fmt/pull/3043), + [#3052](https://github.com/fmtlib/fmt/issues/3052), + [#3053](https://github.com/fmtlib/fmt/pull/3053), + [#3054](https://github.com/fmtlib/fmt/pull/3054)). Thanks + [\@h-friederich (Hannes + Friederich)](https://github.com/h-friederich), [\@dimztimz (Dimitrij + Mijoski)](https://github.com/dimztimz), [\@olupton (Olli + Lupton)](https://github.com/olupton), [\@bernhardmgruber (Bernhard + Manfred Gruber)](https://github.com/bernhardmgruber), [\@phprus + (Vladislav Shchapov)](https://github.com/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 + #include + + consteval auto compile_time_dtoa(double value) -> std::array { + auto result = std::array(); + fmt::format_to(result.data(), FMT_COMPILE("{}"), value); + return result; + } + + constexpr auto answer = compile_time_dtoa(0.42); + ``` + + works with the default settings. + +- Improved the implementation of + [Dragonbox](https://github.com/jk-jeon/dragonbox), the algorithm + used for the default floating-point formatting + ([#2713](https://github.com/fmtlib/fmt/pull/2713), + [#2750](https://github.com/fmtlib/fmt/pull/2750)). Thanks [\@jk-jeon + (Junekey Jeon)](https://github.com/jk-jeon). + +- Made `fmt::to_string` work with `__float128`. This uses the internal + FP formatter and works even on system without `__float128` support + in `[s]printf`. + +- Disabled automatic `std::ostream` insertion operator (`operator<<`) + discovery when `fmt/ostream.h` is included to prevent ODR + violations. You can get the old behavior by defining + `FMT_DEPRECATED_OSTREAM` but this will be removed in the next major + release. Use `fmt::streamed` or `fmt::ostream_formatter` to enable + formatting via `std::ostream` instead. + +- Added `fmt::ostream_formatter` that can be used to write `formatter` + specializations that perform formatting via `std::ostream`. For + example ([godbolt](https://godbolt.org/z/5sEc5qMsf)): + + ```c++ + #include + + struct date { + int year, month, day; + + friend std::ostream& operator<<(std::ostream& os, const date& d) { + return os << d.year << '-' << d.month << '-' << d.day; + } + }; + + template <> struct fmt::formatter : 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 + #include + + 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 + ([#2941](https://github.com/fmtlib/fmt/pull/2941)). For example + ([godbolt](https://godbolt.org/z/KG9z6cq68)): + + ```c++ + #include + #include + + int main() { + auto v = std::variant(42); + fmt::print("{}\n", v); + } + ``` + + prints: + + variant(42) + + Thanks [\@jehelset](https://github.com/jehelset). + +- Added experimental `std::filesystem::path` formatting support + ([#2865](https://github.com/fmtlib/fmt/issues/2865), + [#2902](https://github.com/fmtlib/fmt/pull/2902), + [#2917](https://github.com/fmtlib/fmt/issues/2917), + [#2918](https://github.com/fmtlib/fmt/pull/2918)). For example + ([godbolt](https://godbolt.org/z/o44dMexEb)): + + ```c++ + #include + #include + + int main() { + fmt::print("There is no place like {}.", std::filesystem::path("/home")); + } + ``` + + prints: + + There is no place like "/home". + + Thanks [\@phprus (Vladislav Shchapov)](https://github.com/phprus). + +- Added a `std::thread::id` formatter to `fmt/std.h`. For example + ([godbolt](https://godbolt.org/z/j1azbYf3E)): + + ```c++ + #include + #include + + 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 ([#2793](https://github.com/fmtlib/fmt/pull/2793)). For + example ([godbolt](https://godbolt.org/z/vWGW7v5M6)): + + ```c++ + #include + #include + + 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 + + ![image](https://user-images.githubusercontent.com/576385/%0A175071215-12809244-dab0-4005-96d8-7cd911c964d5.png) + + Thanks [\@rbrugo (Riccardo Brugo)](https://github.com/rbrugo). + +- Made `fmt::print` overload for text styles correctly handle UTF-8 + ([#2681](https://github.com/fmtlib/fmt/issues/2681), + [#2701](https://github.com/fmtlib/fmt/pull/2701)). Thanks + [\@AlexGuteniev (Alex Guteniev)](https://github.com/AlexGuteniev). + +- Fixed Unicode handling when writing to an ostream. + +- Added support for nested specifiers to range formatting + ([#2673](https://github.com/fmtlib/fmt/pull/2673)). For example + ([godbolt](https://godbolt.org/z/xd3Gj38cf)): + + ```c++ + #include + #include + + int main() { + fmt::print("{::#x}\n", std::vector{10, 20, 30}); + } + ``` + + prints `[0xa, 0x14, 0x1e]`. + + Thanks [\@BRevzin (Barry Revzin)](https://github.com/BRevzin). + +- Implemented escaping of wide strings in ranges + ([#2904](https://github.com/fmtlib/fmt/pull/2904)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus). + +- Added support for ranges with `begin` / `end` found via the + argument-dependent lookup + ([#2807](https://github.com/fmtlib/fmt/pull/2807)). Thanks [\@rbrugo + (Riccardo Brugo)](https://github.com/rbrugo). + +- Fixed formatting of certain kinds of ranges of ranges + ([#2787](https://github.com/fmtlib/fmt/pull/2787)). Thanks + [\@BRevzin (Barry Revzin)](https://github.com/BRevzin). + +- Fixed handling of maps with element types other than `std::pair` + ([#2944](https://github.com/fmtlib/fmt/pull/2944)). Thanks + [\@BrukerJWD (Jonathan W)](https://github.com/BrukerJWD). + +- Made tuple formatter enabled only if elements are formattable + ([#2939](https://github.com/fmtlib/fmt/issues/2939), + [#2940](https://github.com/fmtlib/fmt/pull/2940)). Thanks + [\@jehelset](https://github.com/jehelset). + +- Made `fmt::join` compatible with format string compilation + ([#2719](https://github.com/fmtlib/fmt/issues/2719), + [#2720](https://github.com/fmtlib/fmt/pull/2720)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus). + +- Made compile-time checks work with named arguments of custom types + and `std::ostream` `print` overloads + ([#2816](https://github.com/fmtlib/fmt/issues/2816), + [#2817](https://github.com/fmtlib/fmt/issues/2817), + [#2819](https://github.com/fmtlib/fmt/pull/2819)). Thanks + [\@timsong-cpp](https://github.com/timsong-cpp). + +- Removed `make_args_checked` because it is no longer needed for + compile-time checks + ([#2760](https://github.com/fmtlib/fmt/pull/2760)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/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` + ([#2733](https://github.com/fmtlib/fmt/pull/2733)). Thanks [\@arogge + (Andreas Rogge)](https://github.com/arogge). + +- Removed a redundant buffer resize when formatting to `std::ostream` + ([#2842](https://github.com/fmtlib/fmt/issues/2842), + [#2843](https://github.com/fmtlib/fmt/pull/2843)). Thanks + [\@jcelerier (Jean-Michaël Celerier)](https://github.com/jcelerier). + +- Made precision computation for strings consistent with width + ([#2888](https://github.com/fmtlib/fmt/issues/2888)). + +- Fixed handling of locale separators in floating point formatting + ([#2830](https://github.com/fmtlib/fmt/issues/2830)). + +- Made sign specifiers work with `__int128_t` + ([#2773](https://github.com/fmtlib/fmt/issues/2773)). + +- Improved support for systems such as CHERI with extra data stored in + pointers ([#2932](https://github.com/fmtlib/fmt/pull/2932)). Thanks + [\@davidchisnall (David + Chisnall)](https://github.com/davidchisnall). + +- Improved documentation + ([#2706](https://github.com/fmtlib/fmt/pull/2706), + [#2712](https://github.com/fmtlib/fmt/pull/2712), + [#2789](https://github.com/fmtlib/fmt/pull/2789), + [#2803](https://github.com/fmtlib/fmt/pull/2803), + [#2805](https://github.com/fmtlib/fmt/pull/2805), + [#2815](https://github.com/fmtlib/fmt/pull/2815), + [#2924](https://github.com/fmtlib/fmt/pull/2924)). Thanks [\@BRevzin + (Barry Revzin)](https://github.com/BRevzin), + [\@Pokechu22](https://github.com/Pokechu22), [\@setoye + (Alta)](https://github.com/setoye), + [\@rtobar](https://github.com/rtobar), [\@rbrugo (Riccardo + Brugo)](https://github.com/rbrugo), [\@anoonD + (cre)](https://github.com/anoonD), [\@leha-bot + (Alex)](https://github.com/leha-bot). + +- Improved build configuration + ([#2766](https://github.com/fmtlib/fmt/pull/2766), + [#2772](https://github.com/fmtlib/fmt/pull/2772), + [#2836](https://github.com/fmtlib/fmt/pull/2836), + [#2852](https://github.com/fmtlib/fmt/pull/2852), + [#2907](https://github.com/fmtlib/fmt/pull/2907), + [#2913](https://github.com/fmtlib/fmt/pull/2913), + [#2914](https://github.com/fmtlib/fmt/pull/2914)). Thanks + [\@kambala-decapitator (Andrey + Filipenkov)](https://github.com/kambala-decapitator), + [\@mattiasljungstrom (Mattias + Ljungström)](https://github.com/mattiasljungstrom), [\@kieselnb + (Nick Kiesel)](https://github.com/kieselnb), + [\@nathannaveen](https://github.com/nathannaveen), + [\@Vertexwahn](https://github.com/Vertexwahn). + +- Fixed various warnings and compilation issues + ([#2408](https://github.com/fmtlib/fmt/issues/2408), + [#2507](https://github.com/fmtlib/fmt/issues/2507), + [#2697](https://github.com/fmtlib/fmt/issues/2697), + [#2715](https://github.com/fmtlib/fmt/issues/2715), + [#2717](https://github.com/fmtlib/fmt/issues/2717), + [#2722](https://github.com/fmtlib/fmt/pull/2722), + [#2724](https://github.com/fmtlib/fmt/pull/2724), + [#2725](https://github.com/fmtlib/fmt/pull/2725), + [#2726](https://github.com/fmtlib/fmt/issues/2726), + [#2728](https://github.com/fmtlib/fmt/pull/2728), + [#2732](https://github.com/fmtlib/fmt/pull/2732), + [#2738](https://github.com/fmtlib/fmt/issues/2738), + [#2742](https://github.com/fmtlib/fmt/pull/2742), + [#2744](https://github.com/fmtlib/fmt/issues/2744), + [#2745](https://github.com/fmtlib/fmt/issues/2745), + [#2746](https://github.com/fmtlib/fmt/issues/2746), + [#2754](https://github.com/fmtlib/fmt/issues/2754), + [#2755](https://github.com/fmtlib/fmt/pull/2755), + [#2757](https://github.com/fmtlib/fmt/issues/2757), + [#2758](https://github.com/fmtlib/fmt/pull/2758), + [#2761](https://github.com/fmtlib/fmt/issues/2761), + [#2762](https://github.com/fmtlib/fmt/pull/2762), + [#2763](https://github.com/fmtlib/fmt/issues/2763), + [#2765](https://github.com/fmtlib/fmt/pull/2765), + [#2769](https://github.com/fmtlib/fmt/issues/2769), + [#2770](https://github.com/fmtlib/fmt/pull/2770), + [#2771](https://github.com/fmtlib/fmt/issues/2771), + [#2777](https://github.com/fmtlib/fmt/issues/2777), + [#2779](https://github.com/fmtlib/fmt/pull/2779), + [#2782](https://github.com/fmtlib/fmt/pull/2782), + [#2783](https://github.com/fmtlib/fmt/pull/2783), + [#2794](https://github.com/fmtlib/fmt/issues/2794), + [#2796](https://github.com/fmtlib/fmt/issues/2796), + [#2797](https://github.com/fmtlib/fmt/pull/2797), + [#2801](https://github.com/fmtlib/fmt/pull/2801), + [#2802](https://github.com/fmtlib/fmt/pull/2802), + [#2808](https://github.com/fmtlib/fmt/issues/2808), + [#2818](https://github.com/fmtlib/fmt/issues/2818), + [#2819](https://github.com/fmtlib/fmt/pull/2819), + [#2829](https://github.com/fmtlib/fmt/issues/2829), + [#2835](https://github.com/fmtlib/fmt/issues/2835), + [#2848](https://github.com/fmtlib/fmt/issues/2848), + [#2860](https://github.com/fmtlib/fmt/issues/2860), + [#2861](https://github.com/fmtlib/fmt/pull/2861), + [#2882](https://github.com/fmtlib/fmt/pull/2882), + [#2886](https://github.com/fmtlib/fmt/issues/2886), + [#2891](https://github.com/fmtlib/fmt/issues/2891), + [#2892](https://github.com/fmtlib/fmt/pull/2892), + [#2895](https://github.com/fmtlib/fmt/issues/2895), + [#2896](https://github.com/fmtlib/fmt/issues/2896), + [#2903](https://github.com/fmtlib/fmt/pull/2903), + [#2906](https://github.com/fmtlib/fmt/issues/2906), + [#2908](https://github.com/fmtlib/fmt/issues/2908), + [#2909](https://github.com/fmtlib/fmt/pull/2909), + [#2920](https://github.com/fmtlib/fmt/issues/2920), + [#2922](https://github.com/fmtlib/fmt/pull/2922), + [#2927](https://github.com/fmtlib/fmt/pull/2927), + [#2929](https://github.com/fmtlib/fmt/pull/2929), + [#2936](https://github.com/fmtlib/fmt/issues/2936), + [#2937](https://github.com/fmtlib/fmt/pull/2937), + [#2938](https://github.com/fmtlib/fmt/pull/2938), + [#2951](https://github.com/fmtlib/fmt/pull/2951), + [#2954](https://github.com/fmtlib/fmt/issues/2954), + [#2957](https://github.com/fmtlib/fmt/pull/2957), + [#2958](https://github.com/fmtlib/fmt/issues/2958), + [#2960](https://github.com/fmtlib/fmt/pull/2960)). Thanks + [\@matrackif](https://github.com/matrackif) [\@Tobi823 (Tobias + Hellmann)](https://github.com/Tobi823), [\@ivan-volnov (Ivan + Volnov)](https://github.com/ivan-volnov), + [\@VasiliPupkin256](https://github.com/VasiliPupkin256), + [\@federico-busato (Federico)](https://github.com/federico-busato), + [\@barcharcraz (Charlie Barto)](https://github.com/barcharcraz), + [\@jk-jeon (Junekey Jeon)](https://github.com/jk-jeon), + [\@HazardyKnusperkeks (Björn + Schäpers)](https://github.com/HazardyKnusperkeks), [\@dalboris + (Boris Dalstein)](https://github.com/dalboris), [\@seanm (Sean + McBride)](https://github.com/seanm), [\@gsjaardema (Greg + Sjaardema)](https://github.com/gsjaardema), + [\@timsong-cpp](https://github.com/timsong-cpp), [\@seanm (Sean + McBride)](https://github.com/seanm), + [\@frithrah](https://github.com/frithrah), [\@chronoxor (Ivan + Shynkarenka)](https://github.com/chronoxor), + [\@Agga](https://github.com/Agga), [\@madmaxoft (Mattes + D)](https://github.com/madmaxoft), [\@JurajX + (Juraj)](https://github.com/JurajX), [\@phprus (Vladislav + Shchapov)](https://github.com/phprus), [\@Dani-Hub (Daniel + Krügler)](https://github.com/Dani-Hub). + +# 8.1.1 - 2022-01-06 + +- Restored ABI compatibility with version 8.0.x + ([#2695](https://github.com/fmtlib/fmt/issues/2695), + [#2696](https://github.com/fmtlib/fmt/pull/2696)). Thanks + [\@saraedum (Julian Rüth)](https://github.com/saraedum). +- Fixed chrono formatting on big endian systems + ([#2698](https://github.com/fmtlib/fmt/issues/2698), + [#2699](https://github.com/fmtlib/fmt/pull/2699)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus) and [\@xvitaly + (Vitaly Zaitsev)](https://github.com/xvitaly). +- Fixed a linkage error with mingw + ([#2691](https://github.com/fmtlib/fmt/issues/2691), + [#2692](https://github.com/fmtlib/fmt/pull/2692)). Thanks + [\@rbberger (Richard Berger)](https://github.com/rbberger). + +# 8.1.0 - 2022-01-02 + +- Optimized chrono formatting + ([#2500](https://github.com/fmtlib/fmt/pull/2500), + [#2537](https://github.com/fmtlib/fmt/pull/2537), + [#2541](https://github.com/fmtlib/fmt/issues/2541), + [#2544](https://github.com/fmtlib/fmt/pull/2544), + [#2550](https://github.com/fmtlib/fmt/pull/2550), + [#2551](https://github.com/fmtlib/fmt/pull/2551), + [#2576](https://github.com/fmtlib/fmt/pull/2576), + [#2577](https://github.com/fmtlib/fmt/issues/2577), + [#2586](https://github.com/fmtlib/fmt/pull/2586), + [#2591](https://github.com/fmtlib/fmt/pull/2591), + [#2594](https://github.com/fmtlib/fmt/pull/2594), + [#2602](https://github.com/fmtlib/fmt/pull/2602), + [#2617](https://github.com/fmtlib/fmt/pull/2617), + [#2628](https://github.com/fmtlib/fmt/issues/2628), + [#2633](https://github.com/fmtlib/fmt/pull/2633), + [#2670](https://github.com/fmtlib/fmt/issues/2670), + [#2671](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 (Vladislav Shchapov)](https://github.com/phprus) + and [\@toughengineer (Pavel + Novikov)](https://github.com/toughengineer). + +- Implemented subsecond formatting for chrono durations + ([#2623](https://github.com/fmtlib/fmt/pull/2623)). For example + ([godbolt](https://godbolt.org/z/es7vWTETe)): + + ```c++ + #include + + int main() { + fmt::print("{:%S}", std::chrono::milliseconds(1234)); + } + ``` + + prints \"01.234\". + + Thanks [\@matrackif](https://github.com/matrackif). + +- Fixed handling of precision 0 when formatting chrono durations + ([#2587](https://github.com/fmtlib/fmt/issues/2587), + [#2588](https://github.com/fmtlib/fmt/pull/2588)). Thanks + [\@lukester1975](https://github.com/lukester1975). + +- Fixed an overflow on invalid inputs in the `tm` formatter + ([#2564](https://github.com/fmtlib/fmt/pull/2564)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/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 + + int main() { + fmt::print("{} dollars", fmt::group_digits(1000000)); + } + ``` + + prints \"1,000,000 dollars\". + +- Added support for faint, conceal, reverse and blink text styles + ([#2394](https://github.com/fmtlib/fmt/pull/2394)): + + + + Thanks [\@benit8 (Benoît Lormeau)](https://github.com/benit8) and + [\@data-man (Dmitry Atamanov)](https://github.com/data-man). + +- Added experimental support for compile-time floating point + formatting ([#2426](https://github.com/fmtlib/fmt/pull/2426), + [#2470](https://github.com/fmtlib/fmt/pull/2470)). It is currently + limited to the header-only mode. Thanks [\@alexezeder (Alexey + Ochapov)](https://github.com/alexezeder). + +- Added UDL-based named argument support to compile-time format string + checks ([#2640](https://github.com/fmtlib/fmt/issues/2640), + [#2649](https://github.com/fmtlib/fmt/pull/2649)). For example + ([godbolt](https://godbolt.org/z/ohGbbvonv)): + + ```c++ + #include + + 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 (Alexey + Ochapov)](https://github.com/alexezeder). + +- Implemented escaping of string range elements. For example + ([godbolt](https://godbolt.org/z/rKvM1vKf3)): + + ```c++ + #include + #include + + int main() { + fmt::print("{}", std::vector{"\naan"}); + } + ``` + + is now printed as: + + ["\naan"] + + instead of: + + [" + aan"] + +- Added an experimental `?` specifier for escaping strings. + ([#2674](https://github.com/fmtlib/fmt/pull/2674)). Thanks + [\@BRevzin (Barry Revzin)](https://github.com/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 + #include + + int main() { + fmt::print("{}", std::map{{"answer", 42}}); + } + ``` + + is now printed as: + + {"answer": 42} + +- Extended `fmt::join` to support C++20-only ranges + ([#2549](https://github.com/fmtlib/fmt/pull/2549)). Thanks + [\@BRevzin (Barry Revzin)](https://github.com/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 + ([#1841](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 + ([#2646](https://github.com/fmtlib/fmt/pull/2646)). Thanks + [\@alexezeder (Alexey Ochapov)](https://github.com/alexezeder). + +- Marked `format`, `formatted_size` and `to_string` as `[[nodiscard]]` + ([#2612](https://github.com/fmtlib/fmt/pull/2612)). [\@0x8000-0000 + (Florin Iucha)](https://github.com/0x8000-0000). + +- Added missing diagnostic when trying to format function and member + pointers as well as objects convertible to pointers which is + explicitly disallowed + ([#2598](https://github.com/fmtlib/fmt/issues/2598), + [#2609](https://github.com/fmtlib/fmt/pull/2609), + [#2610](https://github.com/fmtlib/fmt/pull/2610)). Thanks + [\@AlexGuteniev (Alex Guteniev)](https://github.com/AlexGuteniev). + +- Optimized writing to a contiguous buffer with `format_to_n` + ([#2489](https://github.com/fmtlib/fmt/pull/2489)). Thanks + [\@Roman-Koshelev](https://github.com/Roman-Koshelev). + +- Optimized writing to non-`char` buffers + ([#2477](https://github.com/fmtlib/fmt/pull/2477)). Thanks + [\@Roman-Koshelev](https://github.com/Roman-Koshelev). + +- Decimal point is now localized when using the `L` specifier. + +- Improved floating point formatter implementation + ([#2498](https://github.com/fmtlib/fmt/pull/2498), + [#2499](https://github.com/fmtlib/fmt/pull/2499)). Thanks + [\@Roman-Koshelev](https://github.com/Roman-Koshelev). + +- Fixed handling of very large precision in fixed format + ([#2616](https://github.com/fmtlib/fmt/pull/2616)). + +- Made a table of cached powers used in FP formatting static + ([#2509](https://github.com/fmtlib/fmt/pull/2509)). Thanks + [\@jk-jeon (Junekey Jeon)](https://github.com/jk-jeon). + +- Resolved a lookup ambiguity with C++20 format-related functions due + to ADL ([#2639](https://github.com/fmtlib/fmt/issues/2639), + [#2641](https://github.com/fmtlib/fmt/pull/2641)). Thanks [\@mkurdej + (Marek Kurdej)](https://github.com/mkurdej). + +- Removed unnecessary inline namespace qualification + ([#2642](https://github.com/fmtlib/fmt/issues/2642), + [#2643](https://github.com/fmtlib/fmt/pull/2643)). Thanks [\@mkurdej + (Marek Kurdej)](https://github.com/mkurdej). + +- Implemented argument forwarding in `format_to_n` + ([#2462](https://github.com/fmtlib/fmt/issues/2462), + [#2463](https://github.com/fmtlib/fmt/pull/2463)). Thanks [\@owent + (WenTao Ou)](https://github.com/owent). + +- Fixed handling of implicit conversions in `fmt::to_string` and + format string compilation + ([#2565](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` + ([#2530](https://github.com/fmtlib/fmt/issues/2530)). + +- Make `fmt::ostream::flush` public + ([#2435](https://github.com/fmtlib/fmt/issues/2435)). + +- Improved C++14/17 attribute detection + ([#2615](https://github.com/fmtlib/fmt/pull/2615)). Thanks + [\@AlexGuteniev (Alex Guteniev)](https://github.com/AlexGuteniev). + +- Improved `consteval` detection for MSVC + ([#2559](https://github.com/fmtlib/fmt/pull/2559)). Thanks + [\@DanielaE (Daniela Engert)](https://github.com/DanielaE). + +- Improved documentation + ([#2406](https://github.com/fmtlib/fmt/issues/2406), + [#2446](https://github.com/fmtlib/fmt/pull/2446), + [#2493](https://github.com/fmtlib/fmt/issues/2493), + [#2513](https://github.com/fmtlib/fmt/issues/2513), + [#2515](https://github.com/fmtlib/fmt/pull/2515), + [#2522](https://github.com/fmtlib/fmt/issues/2522), + [#2562](https://github.com/fmtlib/fmt/pull/2562), + [#2575](https://github.com/fmtlib/fmt/pull/2575), + [#2606](https://github.com/fmtlib/fmt/pull/2606), + [#2620](https://github.com/fmtlib/fmt/pull/2620), + [#2676](https://github.com/fmtlib/fmt/issues/2676)). Thanks + [\@sobolevn (Nikita Sobolev)](https://github.com/sobolevn), + [\@UnePierre (Max FERGER)](https://github.com/UnePierre), + [\@zhsj](https://github.com/zhsj), [\@phprus (Vladislav + Shchapov)](https://github.com/phprus), [\@ericcurtin (Eric + Curtin)](https://github.com/ericcurtin), + [\@Lounarok](https://github.com/Lounarok). + +- Improved fuzzers and added a fuzzer for chrono timepoint formatting + ([#2461](https://github.com/fmtlib/fmt/pull/2461), + [#2469](https://github.com/fmtlib/fmt/pull/2469)). [\@pauldreik + (Paul Dreik)](https://github.com/pauldreik), + +- Added the `FMT_SYSTEM_HEADERS` CMake option setting which marks + {fmt}\'s headers as system. It can be used to suppress warnings + ([#2644](https://github.com/fmtlib/fmt/issues/2644), + [#2651](https://github.com/fmtlib/fmt/pull/2651)). Thanks + [\@alexezeder (Alexey Ochapov)](https://github.com/alexezeder). + +- Added the Bazel build system support + ([#2505](https://github.com/fmtlib/fmt/pull/2505), + [#2516](https://github.com/fmtlib/fmt/pull/2516)). Thanks + [\@Vertexwahn](https://github.com/Vertexwahn). + +- Improved build configuration and tests + ([#2437](https://github.com/fmtlib/fmt/issues/2437), + [#2558](https://github.com/fmtlib/fmt/pull/2558), + [#2648](https://github.com/fmtlib/fmt/pull/2648), + [#2650](https://github.com/fmtlib/fmt/pull/2650), + [#2663](https://github.com/fmtlib/fmt/pull/2663), + [#2677](https://github.com/fmtlib/fmt/pull/2677)). Thanks + [\@DanielaE (Daniela Engert)](https://github.com/DanielaE), + [\@alexezeder (Alexey Ochapov)](https://github.com/alexezeder), + [\@phprus (Vladislav Shchapov)](https://github.com/phprus). + +- Fixed various warnings and compilation issues + ([#2353](https://github.com/fmtlib/fmt/pull/2353), + [#2356](https://github.com/fmtlib/fmt/pull/2356), + [#2399](https://github.com/fmtlib/fmt/pull/2399), + [#2408](https://github.com/fmtlib/fmt/issues/2408), + [#2414](https://github.com/fmtlib/fmt/pull/2414), + [#2427](https://github.com/fmtlib/fmt/pull/2427), + [#2432](https://github.com/fmtlib/fmt/pull/2432), + [#2442](https://github.com/fmtlib/fmt/pull/2442), + [#2434](https://github.com/fmtlib/fmt/pull/2434), + [#2439](https://github.com/fmtlib/fmt/issues/2439), + [#2447](https://github.com/fmtlib/fmt/pull/2447), + [#2450](https://github.com/fmtlib/fmt/pull/2450), + [#2455](https://github.com/fmtlib/fmt/issues/2455), + [#2465](https://github.com/fmtlib/fmt/issues/2465), + [#2472](https://github.com/fmtlib/fmt/issues/2472), + [#2474](https://github.com/fmtlib/fmt/issues/2474), + [#2476](https://github.com/fmtlib/fmt/pull/2476), + [#2478](https://github.com/fmtlib/fmt/issues/2478), + [#2479](https://github.com/fmtlib/fmt/issues/2479), + [#2481](https://github.com/fmtlib/fmt/issues/2481), + [#2482](https://github.com/fmtlib/fmt/pull/2482), + [#2483](https://github.com/fmtlib/fmt/pull/2483), + [#2490](https://github.com/fmtlib/fmt/issues/2490), + [#2491](https://github.com/fmtlib/fmt/pull/2491), + [#2510](https://github.com/fmtlib/fmt/pull/2510), + [#2518](https://github.com/fmtlib/fmt/pull/2518), + [#2528](https://github.com/fmtlib/fmt/issues/2528), + [#2529](https://github.com/fmtlib/fmt/pull/2529), + [#2539](https://github.com/fmtlib/fmt/pull/2539), + [#2540](https://github.com/fmtlib/fmt/issues/2540), + [#2545](https://github.com/fmtlib/fmt/pull/2545), + [#2555](https://github.com/fmtlib/fmt/pull/2555), + [#2557](https://github.com/fmtlib/fmt/issues/2557), + [#2570](https://github.com/fmtlib/fmt/issues/2570), + [#2573](https://github.com/fmtlib/fmt/pull/2573), + [#2582](https://github.com/fmtlib/fmt/pull/2582), + [#2605](https://github.com/fmtlib/fmt/issues/2605), + [#2611](https://github.com/fmtlib/fmt/pull/2611), + [#2647](https://github.com/fmtlib/fmt/pull/2647), + [#2627](https://github.com/fmtlib/fmt/issues/2627), + [#2630](https://github.com/fmtlib/fmt/pull/2630), + [#2635](https://github.com/fmtlib/fmt/issues/2635), + [#2638](https://github.com/fmtlib/fmt/issues/2638), + [#2653](https://github.com/fmtlib/fmt/issues/2653), + [#2654](https://github.com/fmtlib/fmt/issues/2654), + [#2661](https://github.com/fmtlib/fmt/issues/2661), + [#2664](https://github.com/fmtlib/fmt/pull/2664), + [#2684](https://github.com/fmtlib/fmt/pull/2684)). Thanks + [\@DanielaE (Daniela Engert)](https://github.com/DanielaE), + [\@mwinterb](https://github.com/mwinterb), [\@cdacamar (Cameron + DaCamara)](https://github.com/cdacamar), [\@TrebledJ + (Johnathan)](https://github.com/TrebledJ), [\@bodomartin + (brm)](https://github.com/bodomartin), [\@cquammen (Cory + Quammen)](https://github.com/cquammen), [\@white238 (Chris + White)](https://github.com/white238), [\@mmarkeloff + (Max)](https://github.com/mmarkeloff), [\@palacaze (Pierre-Antoine + Lacaze)](https://github.com/palacaze), [\@jcelerier (Jean-Michaël + Celerier)](https://github.com/jcelerier), [\@mborn-adi (Mathias + Born)](https://github.com/mborn-adi), [\@BrukerJWD (Jonathan + W)](https://github.com/BrukerJWD), [\@spyridon97 (Spiros + Tsalikis)](https://github.com/spyridon97), [\@phprus (Vladislav + Shchapov)](https://github.com/phprus), [\@oliverlee (Oliver + Lee)](https://github.com/oliverlee), [\@joshessman-llnl (Josh + Essman)](https://github.com/joshessman-llnl), [\@akohlmey (Axel + Kohlmeyer)](https://github.com/akohlmey), + [\@timkalu](https://github.com/timkalu), [\@olupton (Olli + Lupton)](https://github.com/olupton), + [\@Acretock](https://github.com/Acretock), [\@alexezeder (Alexey + Ochapov)](https://github.com/alexezeder), [\@andrewcorrigan (Andrew + Corrigan)](https://github.com/andrewcorrigan), + [\@lucpelletier](https://github.com/lucpelletier), + [\@HazardyKnusperkeks (Björn + Schäpers)](https://github.com/HazardyKnusperkeks). + +# 8.0.1 - 2021-07-02 + +- Fixed the version number in the inline namespace + ([#2374](https://github.com/fmtlib/fmt/issues/2374)). +- Added a missing presentation type check for `std::string` + ([#2402](https://github.com/fmtlib/fmt/issues/2402)). +- Fixed a linkage error when mixing code built with clang and gcc + ([#2377](https://github.com/fmtlib/fmt/issues/2377)). +- Fixed documentation issues + ([#2396](https://github.com/fmtlib/fmt/pull/2396), + [#2403](https://github.com/fmtlib/fmt/issues/2403), + [#2406](https://github.com/fmtlib/fmt/issues/2406)). Thanks + [\@mkurdej (Marek Kurdej)](https://github.com/mkurdej). +- Removed dead code in FP formatter ( + [#2398](https://github.com/fmtlib/fmt/pull/2398)). Thanks + [\@javierhonduco (Javier Honduvilla + Coto)](https://github.com/javierhonduco). +- Fixed various warnings and compilation issues + ([#2351](https://github.com/fmtlib/fmt/issues/2351), + [#2359](https://github.com/fmtlib/fmt/issues/2359), + [#2365](https://github.com/fmtlib/fmt/pull/2365), + [#2368](https://github.com/fmtlib/fmt/issues/2368), + [#2370](https://github.com/fmtlib/fmt/pull/2370), + [#2376](https://github.com/fmtlib/fmt/pull/2376), + [#2381](https://github.com/fmtlib/fmt/pull/2381), + [#2382](https://github.com/fmtlib/fmt/pull/2382), + [#2386](https://github.com/fmtlib/fmt/issues/2386), + [#2389](https://github.com/fmtlib/fmt/pull/2389), + [#2395](https://github.com/fmtlib/fmt/pull/2395), + [#2397](https://github.com/fmtlib/fmt/pull/2397), + [#2400](https://github.com/fmtlib/fmt/issues/2400), + [#2401](https://github.com/fmtlib/fmt/issues/2401), + [#2407](https://github.com/fmtlib/fmt/pull/2407)). Thanks [\@zx2c4 + (Jason A. Donenfeld)](https://github.com/zx2c4), [\@AidanSun05 + (Aidan Sun)](https://github.com/AidanSun05), [\@mattiasljungstrom + (Mattias Ljungström)](https://github.com/mattiasljungstrom), + [\@joemmett (Jonathan Emmett)](https://github.com/joemmett), + [\@erengy (Eren Okka)](https://github.com/erengy), [\@patlkli + (Patrick Geltinger)](https://github.com/patlkli), [\@gsjaardema + (Greg Sjaardema)](https://github.com/gsjaardema), [\@phprus + (Vladislav Shchapov)](https://github.com/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 + + 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 + ([#2019](https://github.com/fmtlib/fmt/pull/2019), + [#2044](https://github.com/fmtlib/fmt/pull/2044), + [#2056](https://github.com/fmtlib/fmt/pull/2056), + [#2072](https://github.com/fmtlib/fmt/pull/2072), + [#2075](https://github.com/fmtlib/fmt/pull/2075), + [#2078](https://github.com/fmtlib/fmt/issues/2078), + [#2129](https://github.com/fmtlib/fmt/pull/2129), + [#2326](https://github.com/fmtlib/fmt/pull/2326)). For example + ([godbolt](https://godbolt.org/z/Mxx9d89jM)): + + ```c++ + #include + + consteval auto compile_time_itoa(int value) -> std::array { + auto result = std::array(); + fmt::format_to(result.data(), FMT_COMPILE("{}"), value); + return result; + } + + constexpr auto answer = compile_time_itoa(42); + ``` + + Most of the formatting functionality is available at compile time + with a notable exception of floating-point numbers and pointers. + Thanks [\@alexezeder (Alexey + Ochapov)](https://github.com/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 + ([#1944](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 + ([#2043](https://github.com/fmtlib/fmt/pull/2043), + [#2242](https://github.com/fmtlib/fmt/pull/2242)): + + ```c++ + #include + + using namespace fmt::literals; + auto s = fmt::format(FMT_COMPILE("{}"), 42); // 🙁 not modern + auto s = fmt::format("{}"_cf, 42); // 🙂 modern as hell + ``` + + It requires compiler support for class types in non-type template + parameters (a C++20 feature) which is available in GCC 9.3+. Thanks + [\@alexezeder (Alexey Ochapov)](https://github.com/alexezeder). + +- Format string compilation now requires `format` functions of + `formatter` specializations for user-defined types to be `const`: + + ```c++ + template <> struct fmt::formatter: formatter { + template + auto format(my_type obj, FormatContext& ctx) const { // Note const here. + // ... + } + }; + ``` + +- Added UDL-based named argument support to format string compilation + ([#2243](https://github.com/fmtlib/fmt/pull/2243), + [#2281](https://github.com/fmtlib/fmt/pull/2281)). For example: + + ```c++ + #include + + using namespace fmt::literals; + auto s = fmt::format(FMT_COMPILE("{answer}"), "answer"_a = 42); + ``` + + Here the argument named \"answer\" is resolved at compile time with + no runtime overhead. Thanks [\@alexezeder (Alexey + Ochapov)](https://github.com/alexezeder). + +- Added format string compilation support to `fmt::print` + ([#2280](https://github.com/fmtlib/fmt/issues/2280), + [#2304](https://github.com/fmtlib/fmt/pull/2304)). Thanks + [\@alexezeder (Alexey Ochapov)](https://github.com/alexezeder). + +- Added initial support for compiling {fmt} as a C++20 module + ([#2235](https://github.com/fmtlib/fmt/pull/2235), + [#2240](https://github.com/fmtlib/fmt/pull/2240), + [#2260](https://github.com/fmtlib/fmt/pull/2260), + [#2282](https://github.com/fmtlib/fmt/pull/2282), + [#2283](https://github.com/fmtlib/fmt/pull/2283), + [#2288](https://github.com/fmtlib/fmt/pull/2288), + [#2298](https://github.com/fmtlib/fmt/pull/2298), + [#2306](https://github.com/fmtlib/fmt/pull/2306), + [#2307](https://github.com/fmtlib/fmt/pull/2307), + [#2309](https://github.com/fmtlib/fmt/pull/2309), + [#2318](https://github.com/fmtlib/fmt/pull/2318), + [#2324](https://github.com/fmtlib/fmt/pull/2324), + [#2332](https://github.com/fmtlib/fmt/pull/2332), + [#2340](https://github.com/fmtlib/fmt/pull/2340)). Thanks + [\@DanielaE (Daniela Engert)](https://github.com/DanielaE). + +- Made symbols private by default reducing shared library size + ([#2301](https://github.com/fmtlib/fmt/pull/2301)). For example + there was a \~15% reported reduction on one platform. Thanks + [\@sergiud (Sergiu Deitsch)](https://github.com/sergiud). + +- Optimized includes making the result of preprocessing `fmt/format.h` + \~20% smaller with libstdc++/C++20 and slightly improving build + times ([#1998](https://github.com/fmtlib/fmt/issues/1998)). + +- Added support of ranges with non-const `begin` / `end` + ([#1953](https://github.com/fmtlib/fmt/pull/1953)). Thanks [\@kitegi + (sarah)](https://github.com/kitegi). + +- Added support of `std::byte` and other formattable types to + `fmt::join` ([#1981](https://github.com/fmtlib/fmt/issues/1981), + [#2040](https://github.com/fmtlib/fmt/issues/2040), + [#2050](https://github.com/fmtlib/fmt/pull/2050), + [#2262](https://github.com/fmtlib/fmt/issues/2262)). For example: + + ```c++ + #include + #include + #include + + int main() { + auto bytes = std::vector{std::byte(4), std::byte(2)}; + fmt::print("{}", fmt::join(bytes, "")); + } + ``` + + prints \"42\". + + Thanks [\@kamibo (Camille Bordignon)](https://github.com/kamibo). + +- Implemented the default format for `std::chrono::system_clock` + ([#2319](https://github.com/fmtlib/fmt/issues/2319), + [#2345](https://github.com/fmtlib/fmt/pull/2345)). For example: + + ```c++ + #include + + int main() { + fmt::print("{}", std::chrono::system_clock::now()); + } + ``` + + prints \"2021-06-18 15:22:00\" (the output depends on the current + date and time). Thanks [\@sunmy2019](https://github.com/sunmy2019). + +- Made more chrono specifiers locale independent by default. Use the + `'L'` specifier to get localized formatting. For example: + + ```c++ + #include + + int main() { + std::locale::global(std::locale("ru_RU.UTF-8")); + auto monday = std::chrono::weekday(1); + fmt::print("{}\n", monday); // prints "Mon" + fmt::print("{:L}\n", monday); // prints "пн" + } + ``` + +- Improved locale handling in chrono formatting + ([#2337](https://github.com/fmtlib/fmt/issues/2337), + [#2349](https://github.com/fmtlib/fmt/pull/2349), + [#2350](https://github.com/fmtlib/fmt/pull/2350)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus). + +- Deprecated `fmt/locale.h` moving the formatting functions that take + a locale to `fmt/format.h` (`char`) and `fmt/xchar` (other + overloads). This doesn\'t introduce a dependency on `` so + there is virtually no compile time effect. + +- Deprecated an undocumented `format_to` overload that takes + `basic_memory_buffer`. + +- Made parameter order in `vformat_to` consistent with `format_to` + ([#2327](https://github.com/fmtlib/fmt/issues/2327)). + +- Added support for time points with arbitrary durations + ([#2208](https://github.com/fmtlib/fmt/issues/2208)). For example: + + ```c++ + #include + + int main() { + using tp = std::chrono::time_point< + std::chrono::system_clock, std::chrono::seconds>; + fmt::print("{:%S}", tp(std::chrono::seconds(42))); + } + ``` + + prints \"42\". + +- Formatting floating-point numbers no longer produces trailing zeros + by default for consistency with `std::format`. For example: + + ```c++ + #include + + 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 + #include + + 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 + ([#2305](https://github.com/fmtlib/fmt/issues/2305), + [#2310](https://github.com/fmtlib/fmt/pull/2310)). Thanks [\@Liedtke + (Matthias Liedtke)](https://github.com/Liedtke). + +- Made the hexfloat formatting use the right alignment by default + ([#2308](https://github.com/fmtlib/fmt/issues/2308), + [#2317](https://github.com/fmtlib/fmt/pull/2317)). Thanks [\@Liedtke + (Matthias Liedtke)](https://github.com/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 + ([#2133](https://github.com/fmtlib/fmt/issues/2133)). + +- Added support for the `'s'` format specifier that gives textual + representation of `bool` + ([#2094](https://github.com/fmtlib/fmt/issues/2094), + [#2109](https://github.com/fmtlib/fmt/pull/2109)). For example: + + ```c++ + #include + + int main() { + fmt::print("{:s}", true); + } + ``` + + prints \"true\". Thanks [\@powercoderlol (Ivan + Polyakov)](https://github.com/powercoderlol). + +- Made `fmt::ptr` work with function pointers + ([#2131](https://github.com/fmtlib/fmt/pull/2131)). For example: + + ```c++ + #include + + int main() { + fmt::print("My main: {}\n", fmt::ptr(main)); + } + ``` + + Thanks [\@mikecrowe (Mike Crowe)](https://github.com/mikecrowe). + +- The undocumented support for specializing `formatter` for pointer + types has been removed. + +- Fixed `fmt::formatted_size` with format string compilation + ([#2141](https://github.com/fmtlib/fmt/pull/2141), + [#2161](https://github.com/fmtlib/fmt/pull/2161)). Thanks + [\@alexezeder (Alexey Ochapov)](https://github.com/alexezeder). + +- Fixed handling of empty format strings during format string + compilation ([#2042](https://github.com/fmtlib/fmt/issues/2042)): + + ```c++ + auto s = fmt::format(FMT_COMPILE("")); + ``` + + Thanks [\@alexezeder (Alexey + Ochapov)](https://github.com/alexezeder). + +- Fixed handling of enums in `fmt::to_string` + ([#2036](https://github.com/fmtlib/fmt/issues/2036)). + +- Improved width computation + ([#2033](https://github.com/fmtlib/fmt/issues/2033), + [#2091](https://github.com/fmtlib/fmt/issues/2091)). For example: + + ```c++ + #include + + int main() { + fmt::print("{:-<10}{}\n", "你好", "世界"); + fmt::print("{:-<10}{}\n", "hello", "world"); + } + ``` + + prints + + ![image](https://user-images.githubusercontent.com/576385/%0A119840373-cea3ca80-beb9-11eb-91e0-54266c48e181.png) + + on a modern terminal. + +- The experimental fast output stream (`fmt::ostream`) is now + truncated by default for consistency with `fopen` + ([#2018](https://github.com/fmtlib/fmt/issues/2018)). For example: + + ```c++ + #include + + int main() { + fmt::ostream out1 = fmt::output_file("guide"); + out1.print("Zaphod"); + out1.close(); + fmt::ostream out2 = fmt::output_file("guide"); + out2.print("Ford"); + } + ``` + + writes \"Ford\" to the file \"guide\". To preserve the old file + content if any pass `fmt::file::WRONLY | fmt::file::CREATE` flags to + `fmt::output_file`. + +- Fixed moving of `fmt::ostream` that holds buffered data + ([#2197](https://github.com/fmtlib/fmt/issues/2197), + [#2198](https://github.com/fmtlib/fmt/pull/2198)). Thanks + [\@vtta](https://github.com/vtta). + +- Replaced the `fmt::system_error` exception with a function of the + same name that constructs `std::system_error` + ([#2266](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()` + ([#2274](https://github.com/fmtlib/fmt/issues/2274), + [#2275](https://github.com/fmtlib/fmt/pull/2275)). The latter is + similar to `std::sytem_category` but correctly handles UTF-8. Thanks + [\@phprus (Vladislav Shchapov)](https://github.com/phprus). + +- Replaced `fmt::error_code` with `std::error_code` and made it + formattable ([#2269](https://github.com/fmtlib/fmt/issues/2269), + [#2270](https://github.com/fmtlib/fmt/pull/2270), + [#2273](https://github.com/fmtlib/fmt/pull/2273)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus). + +- Added speech synthesis support + ([#2206](https://github.com/fmtlib/fmt/pull/2206)). + +- Made `format_to` work with a memory buffer that has a custom + allocator ([#2300](https://github.com/fmtlib/fmt/pull/2300)). Thanks + [\@voxmea](https://github.com/voxmea). + +- Added `Allocator::max_size` support to `basic_memory_buffer`. + ([#1960](https://github.com/fmtlib/fmt/pull/1960)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus). + +- Added wide string support to `fmt::join` + ([#2236](https://github.com/fmtlib/fmt/pull/2236)). Thanks + [\@crbrz](https://github.com/crbrz). + +- Made iterators passed to `formatter` specializations via a format + context satisfy C++20 `std::output_iterator` requirements + ([#2156](https://github.com/fmtlib/fmt/issues/2156), + [#2158](https://github.com/fmtlib/fmt/pull/2158), + [#2195](https://github.com/fmtlib/fmt/issues/2195), + [#2204](https://github.com/fmtlib/fmt/pull/2204)). Thanks + [\@randomnetcat (Jason Cobb)](https://github.com/randomnetcat). + +- Optimized the `printf` implementation + ([#1982](https://github.com/fmtlib/fmt/pull/1982), + [#1984](https://github.com/fmtlib/fmt/pull/1984), + [#2016](https://github.com/fmtlib/fmt/pull/2016), + [#2164](https://github.com/fmtlib/fmt/pull/2164)). Thanks + [\@rimathia](https://github.com/rimathia) and + [\@moiwi](https://github.com/moiwi). + +- Improved detection of `constexpr` `char_traits` + ([#2246](https://github.com/fmtlib/fmt/pull/2246), + [#2257](https://github.com/fmtlib/fmt/pull/2257)). Thanks [\@phprus + (Vladislav Shchapov)](https://github.com/phprus). + +- Fixed writing to `stdout` when it is redirected to `NUL` on Windows + ([#2080](https://github.com/fmtlib/fmt/issues/2080)). + +- Fixed exception propagation from iterators + ([#2097](https://github.com/fmtlib/fmt/issues/2097)). + +- Improved `strftime` error handling + ([#2238](https://github.com/fmtlib/fmt/issues/2238), + [#2244](https://github.com/fmtlib/fmt/pull/2244)). Thanks + [\@yumeyao](https://github.com/yumeyao). + +- Stopped using deprecated GCC UDL template extension. + +- Added `fmt/args.h` to the install target + ([#2096](https://github.com/fmtlib/fmt/issues/2096)). + +- Error messages are now passed to assert when exceptions are disabled + ([#2145](https://github.com/fmtlib/fmt/pull/2145)). Thanks + [\@NobodyXu (Jiahao XU)](https://github.com/NobodyXu). + +- Added the `FMT_MASTER_PROJECT` CMake option to control build and + install targets when {fmt} is included via `add_subdirectory` + ([#2098](https://github.com/fmtlib/fmt/issues/2098), + [#2100](https://github.com/fmtlib/fmt/pull/2100)). Thanks + [\@randomizedthinking](https://github.com/randomizedthinking). + +- Improved build configuration + ([#2026](https://github.com/fmtlib/fmt/pull/2026), + [#2122](https://github.com/fmtlib/fmt/pull/2122)). Thanks + [\@luncliff (Park DongHa)](https://github.com/luncliff) and + [\@ibaned (Dan Ibanez)](https://github.com/ibaned). + +- Fixed various warnings and compilation issues + ([#1947](https://github.com/fmtlib/fmt/issues/1947), + [#1959](https://github.com/fmtlib/fmt/pull/1959), + [#1963](https://github.com/fmtlib/fmt/pull/1963), + [#1965](https://github.com/fmtlib/fmt/pull/1965), + [#1966](https://github.com/fmtlib/fmt/issues/1966), + [#1974](https://github.com/fmtlib/fmt/pull/1974), + [#1975](https://github.com/fmtlib/fmt/pull/1975), + [#1990](https://github.com/fmtlib/fmt/pull/1990), + [#2000](https://github.com/fmtlib/fmt/issues/2000), + [#2001](https://github.com/fmtlib/fmt/pull/2001), + [#2002](https://github.com/fmtlib/fmt/issues/2002), + [#2004](https://github.com/fmtlib/fmt/issues/2004), + [#2006](https://github.com/fmtlib/fmt/pull/2006), + [#2009](https://github.com/fmtlib/fmt/pull/2009), + [#2010](https://github.com/fmtlib/fmt/pull/2010), + [#2038](https://github.com/fmtlib/fmt/issues/2038), + [#2039](https://github.com/fmtlib/fmt/issues/2039), + [#2047](https://github.com/fmtlib/fmt/issues/2047), + [#2053](https://github.com/fmtlib/fmt/pull/2053), + [#2059](https://github.com/fmtlib/fmt/issues/2059), + [#2065](https://github.com/fmtlib/fmt/pull/2065), + [#2067](https://github.com/fmtlib/fmt/pull/2067), + [#2068](https://github.com/fmtlib/fmt/pull/2068), + [#2073](https://github.com/fmtlib/fmt/pull/2073), + [#2103](https://github.com/fmtlib/fmt/issues/2103), + [#2105](https://github.com/fmtlib/fmt/issues/2105), + [#2106](https://github.com/fmtlib/fmt/pull/2106), + [#2107](https://github.com/fmtlib/fmt/pull/2107), + [#2116](https://github.com/fmtlib/fmt/issues/2116), + [#2117](https://github.com/fmtlib/fmt/pull/2117), + [#2118](https://github.com/fmtlib/fmt/issues/2118), + [#2119](https://github.com/fmtlib/fmt/pull/2119), + [#2127](https://github.com/fmtlib/fmt/issues/2127), + [#2128](https://github.com/fmtlib/fmt/pull/2128), + [#2140](https://github.com/fmtlib/fmt/issues/2140), + [#2142](https://github.com/fmtlib/fmt/issues/2142), + [#2143](https://github.com/fmtlib/fmt/pull/2143), + [#2144](https://github.com/fmtlib/fmt/pull/2144), + [#2147](https://github.com/fmtlib/fmt/issues/2147), + [#2148](https://github.com/fmtlib/fmt/issues/2148), + [#2149](https://github.com/fmtlib/fmt/issues/2149), + [#2152](https://github.com/fmtlib/fmt/pull/2152), + [#2160](https://github.com/fmtlib/fmt/pull/2160), + [#2170](https://github.com/fmtlib/fmt/issues/2170), + [#2175](https://github.com/fmtlib/fmt/issues/2175), + [#2176](https://github.com/fmtlib/fmt/issues/2176), + [#2177](https://github.com/fmtlib/fmt/pull/2177), + [#2178](https://github.com/fmtlib/fmt/issues/2178), + [#2179](https://github.com/fmtlib/fmt/pull/2179), + [#2180](https://github.com/fmtlib/fmt/issues/2180), + [#2181](https://github.com/fmtlib/fmt/issues/2181), + [#2183](https://github.com/fmtlib/fmt/pull/2183), + [#2184](https://github.com/fmtlib/fmt/issues/2184), + [#2185](https://github.com/fmtlib/fmt/issues/2185), + [#2186](https://github.com/fmtlib/fmt/pull/2186), + [#2187](https://github.com/fmtlib/fmt/pull/2187), + [#2190](https://github.com/fmtlib/fmt/pull/2190), + [#2192](https://github.com/fmtlib/fmt/pull/2192), + [#2194](https://github.com/fmtlib/fmt/pull/2194), + [#2205](https://github.com/fmtlib/fmt/pull/2205), + [#2210](https://github.com/fmtlib/fmt/issues/2210), + [#2211](https://github.com/fmtlib/fmt/pull/2211), + [#2215](https://github.com/fmtlib/fmt/pull/2215), + [#2216](https://github.com/fmtlib/fmt/pull/2216), + [#2218](https://github.com/fmtlib/fmt/pull/2218), + [#2220](https://github.com/fmtlib/fmt/pull/2220), + [#2228](https://github.com/fmtlib/fmt/issues/2228), + [#2229](https://github.com/fmtlib/fmt/pull/2229), + [#2230](https://github.com/fmtlib/fmt/pull/2230), + [#2233](https://github.com/fmtlib/fmt/issues/2233), + [#2239](https://github.com/fmtlib/fmt/pull/2239), + [#2248](https://github.com/fmtlib/fmt/issues/2248), + [#2252](https://github.com/fmtlib/fmt/issues/2252), + [#2253](https://github.com/fmtlib/fmt/pull/2253), + [#2255](https://github.com/fmtlib/fmt/pull/2255), + [#2261](https://github.com/fmtlib/fmt/issues/2261), + [#2278](https://github.com/fmtlib/fmt/issues/2278), + [#2284](https://github.com/fmtlib/fmt/issues/2284), + [#2287](https://github.com/fmtlib/fmt/pull/2287), + [#2289](https://github.com/fmtlib/fmt/pull/2289), + [#2290](https://github.com/fmtlib/fmt/pull/2290), + [#2293](https://github.com/fmtlib/fmt/pull/2293), + [#2295](https://github.com/fmtlib/fmt/issues/2295), + [#2296](https://github.com/fmtlib/fmt/pull/2296), + [#2297](https://github.com/fmtlib/fmt/pull/2297), + [#2311](https://github.com/fmtlib/fmt/issues/2311), + [#2313](https://github.com/fmtlib/fmt/pull/2313), + [#2315](https://github.com/fmtlib/fmt/pull/2315), + [#2320](https://github.com/fmtlib/fmt/issues/2320), + [#2321](https://github.com/fmtlib/fmt/pull/2321), + [#2323](https://github.com/fmtlib/fmt/pull/2323), + [#2328](https://github.com/fmtlib/fmt/issues/2328), + [#2329](https://github.com/fmtlib/fmt/pull/2329), + [#2333](https://github.com/fmtlib/fmt/pull/2333), + [#2338](https://github.com/fmtlib/fmt/pull/2338), + [#2341](https://github.com/fmtlib/fmt/pull/2341)). Thanks + [\@darklukee](https://github.com/darklukee), [\@fagg (Ashton + Fagg)](https://github.com/fagg), [\@killerbot242 (Lieven de + Cock)](https://github.com/killerbot242), [\@jgopel (Jonathan + Gopel)](https://github.com/jgopel), [\@yeswalrus (Walter + Gray)](https://github.com/yeswalrus), + [\@Finkman](https://github.com/Finkman), [\@HazardyKnusperkeks + (Björn Schäpers)](https://github.com/HazardyKnusperkeks), + [\@dkavolis (Daumantas Kavolis)](https://github.com/dkavolis), + [\@concatime (Issam Maghni)](https://github.com/concatime), + [\@chronoxor (Ivan Shynkarenka)](https://github.com/chronoxor), + [\@summivox (Yin Zhong)](https://github.com/summivox), + [\@yNeo](https://github.com/yNeo), [\@Apache-HB + (Elliot)](https://github.com/Apache-HB), [\@alexezeder (Alexey + Ochapov)](https://github.com/alexezeder), [\@toojays (John Steele + Scott)](https://github.com/toojays), + [\@Brainy0207](https://github.com/Brainy0207), [\@vadz + (VZ)](https://github.com/vadz), [\@imsherlock (Ryan + Sherlock)](https://github.com/imsherlock), [\@phprus (Vladislav + Shchapov)](https://github.com/phprus), [\@white238 (Chris + White)](https://github.com/white238), [\@yafshar (Yaser + Afshar)](https://github.com/yafshar), [\@BillyDonahue (Billy + Donahue)](https://github.com/BillyDonahue), + [\@jstaahl](https://github.com/jstaahl), + [\@denchat](https://github.com/denchat), [\@DanielaE (Daniela + Engert)](https://github.com/DanielaE), [\@ilyakurdyukov (Ilya + Kurdyukov)](https://github.com/ilyakurdyukov), + [\@ilmai](https://github.com/ilmai), [\@JessyDL (Jessy De + Lannoit)](https://github.com/JessyDL), [\@sergiud (Sergiu + Deitsch)](https://github.com/sergiud), + [\@mwinterb](https://github.com/mwinterb), + [\@sven-herrmann](https://github.com/sven-herrmann), [\@jmelas (John + Melas)](https://github.com/jmelas), [\@twoixter (Jose Miguel + Pérez)](https://github.com/twoixter), + [\@crbrz](https://github.com/crbrz), [\@upsj (Tobias + Ribizel)](https://github.com/upsj). + +- Improved documentation + ([#1986](https://github.com/fmtlib/fmt/issues/1986), + [#2051](https://github.com/fmtlib/fmt/pull/2051), + [#2057](https://github.com/fmtlib/fmt/issues/2057), + [#2081](https://github.com/fmtlib/fmt/pull/2081), + [#2084](https://github.com/fmtlib/fmt/issues/2084), + [#2312](https://github.com/fmtlib/fmt/pull/2312)). Thanks + [\@imba-tjd (谭九鼎)](https://github.com/imba-tjd), [\@0x416c69 + (AlιAѕѕaѕѕιN)](https://github.com/0x416c69), + [\@mordante](https://github.com/mordante). + +- Continuous integration and test improvements + ([#1969](https://github.com/fmtlib/fmt/issues/1969), + [#1991](https://github.com/fmtlib/fmt/pull/1991), + [#2020](https://github.com/fmtlib/fmt/pull/2020), + [#2110](https://github.com/fmtlib/fmt/pull/2110), + [#2114](https://github.com/fmtlib/fmt/pull/2114), + [#2196](https://github.com/fmtlib/fmt/issues/2196), + [#2217](https://github.com/fmtlib/fmt/pull/2217), + [#2247](https://github.com/fmtlib/fmt/pull/2247), + [#2256](https://github.com/fmtlib/fmt/pull/2256), + [#2336](https://github.com/fmtlib/fmt/pull/2336), + [#2346](https://github.com/fmtlib/fmt/pull/2346)). Thanks [\@jgopel + (Jonathan Gopel)](https://github.com/jgopel), [\@alexezeder (Alexey + Ochapov)](https://github.com/alexezeder) and [\@DanielaE (Daniela + Engert)](https://github.com/DanielaE). + +# 7.1.3 - 2020-11-24 + +- Fixed handling of buffer boundaries in `format_to_n` + ([#1996](https://github.com/fmtlib/fmt/issues/1996), + [#2029](https://github.com/fmtlib/fmt/issues/2029)). +- Fixed linkage errors when linking with a shared library + ([#2011](https://github.com/fmtlib/fmt/issues/2011)). +- Reintroduced ostream support to range formatters + ([#2014](https://github.com/fmtlib/fmt/issues/2014)). +- Worked around an issue with mixing std versions in gcc + ([#2017](https://github.com/fmtlib/fmt/issues/2017)). + +# 7.1.2 - 2020-11-04 + +- Fixed floating point formatting with large precision + ([#1976](https://github.com/fmtlib/fmt/issues/1976)). + +# 7.1.1 - 2020-11-01 + +- Fixed ABI compatibility with 7.0.x + ([#1961](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 + ([#1919](https://github.com/fmtlib/fmt/issues/1919)). +- Worked around a SFINAE bug in GCC 8 + ([#1957](https://github.com/fmtlib/fmt/issues/1957)). +- Fixed linkage errors when building with GCC\'s LTO + ([#1955](https://github.com/fmtlib/fmt/issues/1955)). +- Fixed a compilation error when building without `__builtin_clz` or + equivalent ([#1968](https://github.com/fmtlib/fmt/pull/1968)). + Thanks [\@tohammer (Tobias Hammer)](https://github.com/tohammer). +- Fixed a sign conversion warning + ([#1964](https://github.com/fmtlib/fmt/pull/1964)). Thanks + [\@OptoCloud](https://github.com/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 + ([#1882](https://github.com/fmtlib/fmt/pull/1882), + [#1887](https://github.com/fmtlib/fmt/pull/1887), + [#1894](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ū: + + ![image](https://user-images.githubusercontent.com/576385/%0A95684665-11719600-0ba8-11eb-8e5b-972ff4e49428.png) + + It is possible to get even better performance at the cost of larger + binary size by compiling with the `FMT_USE_FULL_CACHE_DRAGONBOX` + macro set to 1. + + Thanks [\@jk-jeon (Junekey Jeon)](https://github.com/jk-jeon). + +- Added an experimental unsynchronized file output API which, together + with [format string + compilation](https://fmt.dev/latest/api.html#compile-api), can give + [5-9 times speed up compared to + fprintf](https://www.zverovich.net/2020/08/04/optimal-file-buffer-size.html) + on common platforms ([godbolt](https://godbolt.org/z/nsTcG8)): + + ```c++ + #include + + int main() { + auto f = fmt::output_file("guide"); + f.print("The answer is {}.", 42); + } + ``` + +- Added a formatter for `std::chrono::time_point` + ([#1819](https://github.com/fmtlib/fmt/issues/1819), + [#1837](https://github.com/fmtlib/fmt/pull/1837)). For example + ([godbolt](https://godbolt.org/z/c4M6fh)): + + ```c++ + #include + + int main() { + auto now = std::chrono::system_clock::now(); + fmt::print("The time is {:%H:%M:%S}.\n", now); + } + ``` + + Thanks [\@adamburgess (Adam + Burgess)](https://github.com/adamburgess). + +- Added support for ranges with non-const `begin`/`end` to `fmt::join` + ([#1784](https://github.com/fmtlib/fmt/issues/1784), + [#1786](https://github.com/fmtlib/fmt/pull/1786)). For example + ([godbolt](https://godbolt.org/z/jP63Tv)): + + ```c++ + #include + #include + + int main() { + using std::literals::string_literals::operator""s; + auto strs = std::array{"a"s, "bb"s, "ccc"s}; + auto range = strs | ranges::views::filter( + [] (const std::string &x) { return x.size() != 2; } + ); + fmt::print("{}\n", fmt::join(range, "")); + } + ``` + + prints \"accc\". + + Thanks [\@tonyelewis (Tony E Lewis)](https://github.com/tonyelewis). + +- Added a `memory_buffer::append` overload that takes a range + ([#1806](https://github.com/fmtlib/fmt/pull/1806)). Thanks + [\@BRevzin (Barry Revzin)](https://github.com/BRevzin). + +- Improved handling of single code units in `FMT_COMPILE`. For + example: + + ```c++ + #include + + char* f(char* buf) { + return fmt::format_to(buf, FMT_COMPILE("x{}"), 42); + } + ``` + + compiles to just ([godbolt](https://godbolt.org/z/5vncz3)): + + ```asm + _Z1fPc: + movb $120, (%rdi) + xorl %edx, %edx + cmpl $42, _ZN3fmt2v76detail10basic_dataIvE23zero_or_powers_of_10_32E+8(%rip) + movl $3, %eax + seta %dl + subl %edx, %eax + movzwl _ZN3fmt2v76detail10basic_dataIvE6digitsE+84(%rip), %edx + cltq + addq %rdi, %rax + movw %dx, -2(%rax) + ret + ``` + + Here a single `mov` instruction writes `'x'` (`$120`) to the output + buffer. + +- Added dynamic width support to format string compilation + ([#1809](https://github.com/fmtlib/fmt/issues/1809)). + +- Improved error reporting for unformattable types: now you\'ll get + the type name directly in the error message instead of the note: + + ```c++ + #include + + struct how_about_no {}; + + int main() { + fmt::print("{}", how_about_no()); + } + ``` + + Error ([godbolt](https://godbolt.org/z/GoxM4e)): + + `fmt/core.h:1438:3: error: static_assert failed due to requirement 'fmt::v7::formattable()' "Cannot format an argument. To make type T formattable provide a formatter specialization: https://fmt.dev/latest/api.html#udt" ...` + +- Added the + [make_args_checked](https://fmt.dev/7.1.0/api.html#argument-lists) + function template that allows you to write formatting functions with + compile-time format string checks and avoid binary code bloat + ([godbolt](https://godbolt.org/z/PEf9qr)): + + ```c++ + void vlog(const char* file, int line, fmt::string_view format, + fmt::format_args args) { + fmt::print("{}: {}: ", file, line); + fmt::vprint(format, args); + } + + template + void log(const char* file, int line, const S& format, Args&&... args) { + vlog(file, line, format, + fmt::make_args_checked(format, args...)); + } + + #define MY_LOG(format, ...) \ + log(__FILE__, __LINE__, FMT_STRING(format), __VA_ARGS__) + + MY_LOG("invalid squishiness: {}", 42); + ``` + +- Replaced `snprintf` fallback with a faster internal IEEE 754 `float` + and `double` formatter for arbitrary precision. For example + ([godbolt](https://godbolt.org/z/dPhWvj)): + + ```c++ + #include + + int main() { + fmt::print("{:.500}\n", 4.9406564584124654E-324); + } + ``` + + prints + + `4.9406564584124654417656879286822137236505980261432476442558568250067550727020875186529983636163599237979656469544571773092665671035593979639877479601078187812630071319031140452784581716784898210368871863605699873072305000638740915356498438731247339727316961514003171538539807412623856559117102665855668676818703956031062493194527159149245532930545654440112748012970999954193198940908041656332452475714786901472678015935523861155013480352649347201937902681071074917033322268447533357208324319360923829e-324`. + +- Made `format_to_n` and `formatted_size` part of the [core + API](https://fmt.dev/latest/api.html#core-api) + ([godbolt](https://godbolt.org/z/sPjY1K)): + + ```c++ + #include + + int main() { + char buffer[10]; + auto result = fmt::format_to_n(buffer, sizeof(buffer), "{}", 42); + } + ``` + +- Added `fmt::format_to_n` overload with format string compilation + ([#1764](https://github.com/fmtlib/fmt/issues/1764), + [#1767](https://github.com/fmtlib/fmt/pull/1767), + [#1869](https://github.com/fmtlib/fmt/pull/1869)). For example + ([godbolt](https://godbolt.org/z/93h86q)): + + ```c++ + #include + + int main() { + char buffer[8]; + fmt::format_to_n(buffer, sizeof(buffer), FMT_COMPILE("{}"), 42); + } + ``` + + Thanks [\@Kurkin (Dmitry Kurkin)](https://github.com/Kurkin), + [\@alexezeder (Alexey Ochapov)](https://github.com/alexezeder). + +- Added `fmt::format_to` overload that take `text_style` + ([#1593](https://github.com/fmtlib/fmt/issues/1593), + [#1842](https://github.com/fmtlib/fmt/issues/1842), + [#1843](https://github.com/fmtlib/fmt/pull/1843)). For example + ([godbolt](https://godbolt.org/z/91153r)): + + ```c++ + #include + + int main() { + std::string out; + fmt::format_to(std::back_inserter(out), + fmt::emphasis::bold | fg(fmt::color::red), + "The answer is {}.", 42); + } + ``` + + Thanks [\@Naios (Denis Blank)](https://github.com/Naios). + +- Made the `'#'` specifier emit trailing zeros in addition to the + decimal point ([#1797](https://github.com/fmtlib/fmt/issues/1797)). + For example ([godbolt](https://godbolt.org/z/bhdcW9)): + + ```c++ + #include + + int main() { + fmt::print("{:#.2g}", 0.5); + } + ``` + + prints `0.50`. + +- Changed the default floating point format to not include `.0` for + consistency with `std::format` and `std::to_chars` + ([#1893](https://github.com/fmtlib/fmt/issues/1893), + [#1943](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` + ([#1873](https://github.com/fmtlib/fmt/issues/1873), + [#1917](https://github.com/fmtlib/fmt/issues/1917)). + +- Made `fmt::to_string` fallback on `ostream` insertion operator if + the `formatter` specialization is not provided + ([#1815](https://github.com/fmtlib/fmt/issues/1815), + [#1829](https://github.com/fmtlib/fmt/pull/1829)). Thanks + [\@alexezeder (Alexey Ochapov)](https://github.com/alexezeder). + +- Added support for the append mode to the experimental file API and + improved `fcntl.h` detection. + ([#1847](https://github.com/fmtlib/fmt/pull/1847), + [#1848](https://github.com/fmtlib/fmt/pull/1848)). Thanks + [\@t-wiser](https://github.com/t-wiser). + +- Fixed handling of types that have both an implicit conversion + operator and an overloaded `ostream` insertion operator + ([#1766](https://github.com/fmtlib/fmt/issues/1766)). + +- Fixed a slicing issue in an internal iterator type + ([#1822](https://github.com/fmtlib/fmt/pull/1822)). Thanks + [\@BRevzin (Barry Revzin)](https://github.com/BRevzin). + +- Fixed an issue in locale-specific integer formatting + ([#1927](https://github.com/fmtlib/fmt/issues/1927)). + +- Fixed handling of exotic code unit types + ([#1870](https://github.com/fmtlib/fmt/issues/1870), + [#1932](https://github.com/fmtlib/fmt/issues/1932)). + +- Improved `FMT_ALWAYS_INLINE` + ([#1878](https://github.com/fmtlib/fmt/pull/1878)). Thanks + [\@jk-jeon (Junekey Jeon)](https://github.com/jk-jeon). + +- Removed dependency on `windows.h` + ([#1900](https://github.com/fmtlib/fmt/pull/1900)). Thanks [\@bernd5 + (Bernd Baumanns)](https://github.com/bernd5). + +- Optimized counting of decimal digits on MSVC + ([#1890](https://github.com/fmtlib/fmt/pull/1890)). Thanks + [\@mwinterb](https://github.com/mwinterb). + +- Improved documentation + ([#1772](https://github.com/fmtlib/fmt/issues/1772), + [#1775](https://github.com/fmtlib/fmt/pull/1775), + [#1792](https://github.com/fmtlib/fmt/pull/1792), + [#1838](https://github.com/fmtlib/fmt/pull/1838), + [#1888](https://github.com/fmtlib/fmt/pull/1888), + [#1918](https://github.com/fmtlib/fmt/pull/1918), + [#1939](https://github.com/fmtlib/fmt/pull/1939)). Thanks + [\@leolchat (Léonard Gérard)](https://github.com/leolchat), + [\@pepsiman (Malcolm Parsons)](https://github.com/pepsiman), + [\@Klaim (Joël Lamotte)](https://github.com/Klaim), [\@ravijanjam + (Ravi J)](https://github.com/ravijanjam), + [\@francesco-st](https://github.com/francesco-st), [\@udnaan + (Adnan)](https://github.com/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 + ([#1778](https://github.com/fmtlib/fmt/issues/1778), + [#1781](https://github.com/fmtlib/fmt/pull/1781)). Thanks [\@kammce + (Khalil Estell)](https://github.com/kammce). + +- Added the `FMT_USE_INLINE_NAMESPACES` macro to control usage of + inline namespaces + ([#1945](https://github.com/fmtlib/fmt/pull/1945)). Thanks + [\@darklukee](https://github.com/darklukee). + +- Improved build configuration + ([#1760](https://github.com/fmtlib/fmt/pull/1760), + [#1770](https://github.com/fmtlib/fmt/pull/1770), + [#1779](https://github.com/fmtlib/fmt/issues/1779), + [#1783](https://github.com/fmtlib/fmt/pull/1783), + [#1823](https://github.com/fmtlib/fmt/pull/1823)). Thanks + [\@dvetutnev (Dmitriy Vetutnev)](https://github.com/dvetutnev), + [\@xvitaly (Vitaly Zaitsev)](https://github.com/xvitaly), [\@tambry + (Raul Tambre)](https://github.com/tambry), + [\@medithe](https://github.com/medithe), [\@martinwuehrer (Martin + Wührer)](https://github.com/martinwuehrer). + +- Fixed various warnings and compilation issues + ([#1790](https://github.com/fmtlib/fmt/pull/1790), + [#1802](https://github.com/fmtlib/fmt/pull/1802), + [#1808](https://github.com/fmtlib/fmt/pull/1808), + [#1810](https://github.com/fmtlib/fmt/issues/1810), + [#1811](https://github.com/fmtlib/fmt/issues/1811), + [#1812](https://github.com/fmtlib/fmt/pull/1812), + [#1814](https://github.com/fmtlib/fmt/pull/1814), + [#1816](https://github.com/fmtlib/fmt/pull/1816), + [#1817](https://github.com/fmtlib/fmt/pull/1817), + [#1818](https://github.com/fmtlib/fmt/pull/1818), + [#1825](https://github.com/fmtlib/fmt/issues/1825), + [#1836](https://github.com/fmtlib/fmt/pull/1836), + [#1855](https://github.com/fmtlib/fmt/pull/1855), + [#1856](https://github.com/fmtlib/fmt/pull/1856), + [#1860](https://github.com/fmtlib/fmt/pull/1860), + [#1877](https://github.com/fmtlib/fmt/pull/1877), + [#1879](https://github.com/fmtlib/fmt/pull/1879), + [#1880](https://github.com/fmtlib/fmt/pull/1880), + [#1896](https://github.com/fmtlib/fmt/issues/1896), + [#1897](https://github.com/fmtlib/fmt/pull/1897), + [#1898](https://github.com/fmtlib/fmt/pull/1898), + [#1904](https://github.com/fmtlib/fmt/issues/1904), + [#1908](https://github.com/fmtlib/fmt/pull/1908), + [#1911](https://github.com/fmtlib/fmt/issues/1911), + [#1912](https://github.com/fmtlib/fmt/issues/1912), + [#1928](https://github.com/fmtlib/fmt/issues/1928), + [#1929](https://github.com/fmtlib/fmt/pull/1929), + [#1935](https://github.com/fmtlib/fmt/issues/1935), + [#1937](https://github.com/fmtlib/fmt/pull/1937), + [#1942](https://github.com/fmtlib/fmt/pull/1942), + [#1949](https://github.com/fmtlib/fmt/issues/1949)). Thanks + [\@TheQwertiest](https://github.com/TheQwertiest), + [\@medithe](https://github.com/medithe), [\@martinwuehrer (Martin + Wührer)](https://github.com/martinwuehrer), + [\@n16h7hunt3r](https://github.com/n16h7hunt3r), [\@Othereum + (Seokjin Lee)](https://github.com/Othereum), [\@gsjaardema (Greg + Sjaardema)](https://github.com/gsjaardema), [\@AlexanderLanin + (Alexander Lanin)](https://github.com/AlexanderLanin), [\@gcerretani + (Giovanni Cerretani)](https://github.com/gcerretani), [\@chronoxor + (Ivan Shynkarenka)](https://github.com/chronoxor), [\@noizefloor + (Jan Schwers)](https://github.com/noizefloor), [\@akohlmey (Axel + Kohlmeyer)](https://github.com/akohlmey), [\@jk-jeon (Junekey + Jeon)](https://github.com/jk-jeon), + [\@rimathia](https://github.com/rimathia), [\@rglarix (Riccardo + Ghetta (larix))](https://github.com/rglarix), + [\@moiwi](https://github.com/moiwi), [\@heckad (Kazantcev + Andrey)](https://github.com/heckad), + [\@MarcDirven](https://github.com/MarcDirven). [\@BartSiwek (Bart + Siwek)](https://github.com/BartSiwek), + [\@darklukee](https://github.com/darklukee). + +# 7.0.3 - 2020-08-06 + +- Worked around broken `numeric_limits` for 128-bit integers + ([#1787](https://github.com/fmtlib/fmt/issues/1787)). +- Added error reporting on missing named arguments + ([#1796](https://github.com/fmtlib/fmt/issues/1796)). +- Stopped using 128-bit integers with clang-cl + ([#1800](https://github.com/fmtlib/fmt/pull/1800)). Thanks + [\@Kingcom](https://github.com/Kingcom). +- Fixed issues in locale-specific integer formatting + ([#1782](https://github.com/fmtlib/fmt/issues/1782), + [#1801](https://github.com/fmtlib/fmt/issues/1801)). + +# 7.0.2 - 2020-07-29 + +- Worked around broken `numeric_limits` for 128-bit integers + ([#1725](https://github.com/fmtlib/fmt/issues/1725)). +- Fixed compatibility with CMake 3.4 + ([#1779](https://github.com/fmtlib/fmt/issues/1779)). +- Fixed handling of digit separators in locale-specific formatting + ([#1782](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 + ([#1753](https://github.com/fmtlib/fmt/issues/1753)). +- Fixed a linkage error on Windows + ([#1757](https://github.com/fmtlib/fmt/issues/1757)). Thanks + [\@Kurkin (Dmitry Kurkin)](https://github.com/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 + + // 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 + ([#1685](https://github.com/fmtlib/fmt/issues/1685)). + +- Applied extern templates to improve compile times when using the + core API and `fmt/format.h` + ([#1452](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](https://github.com/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 + + 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, + 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 + ([#1614](https://github.com/fmtlib/fmt/issues/1614)): + + ```c++ + #include + + 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` + ([#1689](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 (Barry Revzin)](https://github.com/BRevzin). + +- Added support for named arguments, `clear` and `reserve` to + `dynamic_format_arg_store` + ([#1655](https://github.com/fmtlib/fmt/issues/1655), + [#1663](https://github.com/fmtlib/fmt/pull/1663), + [#1674](https://github.com/fmtlib/fmt/pull/1674), + [#1677](https://github.com/fmtlib/fmt/pull/1677)). Thanks + [\@vsolontsov-ll (Vladimir + Solontsov)](https://github.com/vsolontsov-ll). + +- Added support for the `'c'` format specifier to integral types for + compatibility with `std::format` + ([#1652](https://github.com/fmtlib/fmt/issues/1652)). + +- Replaced the `'n'` format specifier with `'L'` for compatibility + with `std::format` + ([#1624](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` + ([#1538](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 + ([#1595](https://github.com/fmtlib/fmt/issues/1595), + [#1682](https://github.com/fmtlib/fmt/pull/1682), + [#1683](https://github.com/fmtlib/fmt/pull/1683), + [#1687](https://github.com/fmtlib/fmt/pull/1687), + [#1699](https://github.com/fmtlib/fmt/pull/1699)). Thanks + [\@rimathia](https://github.com/rimathia). + +- Fixed handling of `operator<<` overloads that use `copyfmt` + ([#1666](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 + ([#1654](https://github.com/fmtlib/fmt/issues/1654), + [#1656](https://github.com/fmtlib/fmt/pull/1656)). Thanks + [\@kwesolowski (Krzysztof + Wesolowski)](https://github.com/kwesolowski). + +- Replaced `FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION` with the + `FMT_FUZZ` macro to prevent interfering with fuzzing of projects + using {fmt} ([#1650](https://github.com/fmtlib/fmt/pull/1650)). + Thanks [\@asraa (Asra Ali)](https://github.com/asraa). + +- Fixed compatibility with emscripten + ([#1636](https://github.com/fmtlib/fmt/issues/1636), + [#1637](https://github.com/fmtlib/fmt/pull/1637)). Thanks + [\@ArthurSonzogni (Arthur + Sonzogni)](https://github.com/ArthurSonzogni). + +- Improved documentation + ([#704](https://github.com/fmtlib/fmt/issues/704), + [#1643](https://github.com/fmtlib/fmt/pull/1643), + [#1660](https://github.com/fmtlib/fmt/pull/1660), + [#1681](https://github.com/fmtlib/fmt/pull/1681), + [#1691](https://github.com/fmtlib/fmt/pull/1691), + [#1706](https://github.com/fmtlib/fmt/pull/1706), + [#1714](https://github.com/fmtlib/fmt/pull/1714), + [#1721](https://github.com/fmtlib/fmt/pull/1721), + [#1739](https://github.com/fmtlib/fmt/pull/1739), + [#1740](https://github.com/fmtlib/fmt/pull/1740), + [#1741](https://github.com/fmtlib/fmt/pull/1741), + [#1751](https://github.com/fmtlib/fmt/pull/1751)). Thanks + [\@senior7515 (Alexander Gallego)](https://github.com/senior7515), + [\@lsr0 (Lindsay Roberts)](https://github.com/lsr0), [\@puetzk + (Kevin Puetz)](https://github.com/puetzk), [\@fpelliccioni (Fernando + Pelliccioni)](https://github.com/fpelliccioni), Alexey Kuzmenko, + [\@jelly (jelle van der Waa)](https://github.com/jelly), + [\@claremacrae (Clare Macrae)](https://github.com/claremacrae), + [\@jiapengwen (文佳鹏)](https://github.com/jiapengwen), + [\@gsjaardema (Greg Sjaardema)](https://github.com/gsjaardema), + [\@alexey-milovidov](https://github.com/alexey-milovidov). + +- Implemented various build configuration fixes and improvements + ([#1603](https://github.com/fmtlib/fmt/pull/1603), + [#1657](https://github.com/fmtlib/fmt/pull/1657), + [#1702](https://github.com/fmtlib/fmt/pull/1702), + [#1728](https://github.com/fmtlib/fmt/pull/1728)). Thanks + [\@scramsby (Scott Ramsby)](https://github.com/scramsby), [\@jtojnar + (Jan Tojnar)](https://github.com/jtojnar), [\@orivej (Orivej + Desh)](https://github.com/orivej), + [\@flagarde](https://github.com/flagarde). + +- Fixed various warnings and compilation issues + ([#1616](https://github.com/fmtlib/fmt/pull/1616), + [#1620](https://github.com/fmtlib/fmt/issues/1620), + [#1622](https://github.com/fmtlib/fmt/issues/1622), + [#1625](https://github.com/fmtlib/fmt/issues/1625), + [#1627](https://github.com/fmtlib/fmt/pull/1627), + [#1628](https://github.com/fmtlib/fmt/issues/1628), + [#1629](https://github.com/fmtlib/fmt/pull/1629), + [#1631](https://github.com/fmtlib/fmt/issues/1631), + [#1633](https://github.com/fmtlib/fmt/pull/1633), + [#1649](https://github.com/fmtlib/fmt/pull/1649), + [#1658](https://github.com/fmtlib/fmt/issues/1658), + [#1661](https://github.com/fmtlib/fmt/pull/1661), + [#1667](https://github.com/fmtlib/fmt/pull/1667), + [#1668](https://github.com/fmtlib/fmt/issues/1668), + [#1669](https://github.com/fmtlib/fmt/pull/1669), + [#1692](https://github.com/fmtlib/fmt/issues/1692), + [#1696](https://github.com/fmtlib/fmt/pull/1696), + [#1697](https://github.com/fmtlib/fmt/pull/1697), + [#1707](https://github.com/fmtlib/fmt/issues/1707), + [#1712](https://github.com/fmtlib/fmt/pull/1712), + [#1716](https://github.com/fmtlib/fmt/pull/1716), + [#1722](https://github.com/fmtlib/fmt/pull/1722), + [#1724](https://github.com/fmtlib/fmt/issues/1724), + [#1729](https://github.com/fmtlib/fmt/pull/1729), + [#1738](https://github.com/fmtlib/fmt/pull/1738), + [#1742](https://github.com/fmtlib/fmt/issues/1742), + [#1743](https://github.com/fmtlib/fmt/issues/1743), + [#1744](https://github.com/fmtlib/fmt/pull/1744), + [#1747](https://github.com/fmtlib/fmt/issues/1747), + [#1750](https://github.com/fmtlib/fmt/pull/1750)). Thanks + [\@gsjaardema (Greg Sjaardema)](https://github.com/gsjaardema), + [\@gabime (Gabi Melman)](https://github.com/gabime), [\@johnor + (Johan)](https://github.com/johnor), [\@Kurkin (Dmitry + Kurkin)](https://github.com/Kurkin), [\@invexed (James + Beach)](https://github.com/invexed), + [\@peterbell10](https://github.com/peterbell10), [\@daixtrose + (Markus Werle)](https://github.com/daixtrose), [\@petrutlucian94 + (Lucian Petrut)](https://github.com/petrutlucian94), [\@Neargye + (Daniil Goncharov)](https://github.com/Neargye), [\@ambitslix + (Attila M. Szilagyi)](https://github.com/ambitslix), [\@gabime (Gabi + Melman)](https://github.com/gabime), [\@erthink (Leonid + Yuriev)](https://github.com/erthink), [\@tohammer (Tobias + Hammer)](https://github.com/tohammer), [\@0x8000-0000 (Florin + Iucha)](https://github.com/0x8000-0000). + +# 6.2.1 - 2020-05-09 + +- Fixed ostream support in `sprintf` + ([#1631](https://github.com/fmtlib/fmt/issues/1631)). +- Fixed type detection when using implicit conversion to `string_view` + and ostream `operator<<` inconsistently + ([#1662](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 specialization: + https://fmt.dev/latest/api.html#formatting-user-defined-types" + static_assert( + ^ + ... + note: in instantiation of function template specialization + 'fmt::v6::format' requested here + fmt::format("{}", S()); + ^ + + if `S` is not formattable. + +- Reduced the library size by \~10%. + +- Always print decimal point if `#` is specified + ([#1476](https://github.com/fmtlib/fmt/issues/1476), + [#1498](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 + ([#1109](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 + ([#1170](https://github.com/fmtlib/fmt/issues/1170), + [#1584](https://github.com/fmtlib/fmt/pull/1584)): + + ```c++ + fmt::dynamic_format_arg_store store; + store.push_back("answer"); + store.push_back(42); + fmt::vprint("The {} is {}.\n", store); + ``` + + prints: + + The answer is 42. + + Thanks [\@vsolontsov-ll (Vladimir + Solontsov)](https://github.com/vsolontsov-ll). + +- Made `fmt::join` accept `initializer_list` + ([#1591](https://github.com/fmtlib/fmt/pull/1591)). Thanks + [\@Rapotkinnik (Nikolay Rapotkin)](https://github.com/Rapotkinnik). + +- Fixed handling of empty tuples + ([#1588](https://github.com/fmtlib/fmt/issues/1588)). + +- Fixed handling of output iterators in `format_to_n` + ([#1506](https://github.com/fmtlib/fmt/issues/1506)). + +- Fixed formatting of `std::chrono::duration` types to wide output + ([#1533](https://github.com/fmtlib/fmt/pull/1533)). Thanks [\@zeffy + (pilao)](https://github.com/zeffy). + +- Added const `begin` and `end` overload to buffers + ([#1553](https://github.com/fmtlib/fmt/pull/1553)). Thanks + [\@dominicpoeschko](https://github.com/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 + ([#1590](https://github.com/fmtlib/fmt/pull/1590)). Thanks + [\@albaguirre (Alberto Aguirre)](https://github.com/albaguirre). + +- Made `FMT_STRING` work with `constexpr` `string_view` + ([#1589](https://github.com/fmtlib/fmt/pull/1589)). Thanks + [\@scramsby (Scott Ramsby)](https://github.com/scramsby). + +- Implemented a minor optimization in the format string parser + ([#1560](https://github.com/fmtlib/fmt/pull/1560)). Thanks + [\@IkarusDeveloper](https://github.com/IkarusDeveloper). + +- Improved attribute detection + ([#1469](https://github.com/fmtlib/fmt/pull/1469), + [#1475](https://github.com/fmtlib/fmt/pull/1475), + [#1576](https://github.com/fmtlib/fmt/pull/1576)). Thanks + [\@federico-busato (Federico)](https://github.com/federico-busato), + [\@chronoxor (Ivan Shynkarenka)](https://github.com/chronoxor), + [\@refnum](https://github.com/refnum). + +- Improved documentation + ([#1481](https://github.com/fmtlib/fmt/pull/1481), + [#1523](https://github.com/fmtlib/fmt/pull/1523)). Thanks + [\@JackBoosY (Jack·Boos·Yu)](https://github.com/JackBoosY), + [\@imba-tjd (谭九鼎)](https://github.com/imba-tjd). + +- Fixed symbol visibility on Linux when compiling with + `-fvisibility=hidden` + ([#1535](https://github.com/fmtlib/fmt/pull/1535)). Thanks + [\@milianw (Milian Wolff)](https://github.com/milianw). + +- Implemented various build configuration fixes and improvements + ([#1264](https://github.com/fmtlib/fmt/issues/1264), + [#1460](https://github.com/fmtlib/fmt/issues/1460), + [#1534](https://github.com/fmtlib/fmt/pull/1534), + [#1536](https://github.com/fmtlib/fmt/issues/1536), + [#1545](https://github.com/fmtlib/fmt/issues/1545), + [#1546](https://github.com/fmtlib/fmt/pull/1546), + [#1566](https://github.com/fmtlib/fmt/issues/1566), + [#1582](https://github.com/fmtlib/fmt/pull/1582), + [#1597](https://github.com/fmtlib/fmt/issues/1597), + [#1598](https://github.com/fmtlib/fmt/pull/1598)). Thanks + [\@ambitslix (Attila M. Szilagyi)](https://github.com/ambitslix), + [\@jwillikers (Jordan Williams)](https://github.com/jwillikers), + [\@stac47 (Laurent Stacul)](https://github.com/stac47). + +- Fixed various warnings and compilation issues + ([#1433](https://github.com/fmtlib/fmt/pull/1433), + [#1461](https://github.com/fmtlib/fmt/issues/1461), + [#1470](https://github.com/fmtlib/fmt/pull/1470), + [#1480](https://github.com/fmtlib/fmt/pull/1480), + [#1485](https://github.com/fmtlib/fmt/pull/1485), + [#1492](https://github.com/fmtlib/fmt/pull/1492), + [#1493](https://github.com/fmtlib/fmt/issues/1493), + [#1504](https://github.com/fmtlib/fmt/issues/1504), + [#1505](https://github.com/fmtlib/fmt/pull/1505), + [#1512](https://github.com/fmtlib/fmt/pull/1512), + [#1515](https://github.com/fmtlib/fmt/issues/1515), + [#1516](https://github.com/fmtlib/fmt/pull/1516), + [#1518](https://github.com/fmtlib/fmt/pull/1518), + [#1519](https://github.com/fmtlib/fmt/pull/1519), + [#1520](https://github.com/fmtlib/fmt/pull/1520), + [#1521](https://github.com/fmtlib/fmt/pull/1521), + [#1522](https://github.com/fmtlib/fmt/pull/1522), + [#1524](https://github.com/fmtlib/fmt/issues/1524), + [#1530](https://github.com/fmtlib/fmt/pull/1530), + [#1531](https://github.com/fmtlib/fmt/issues/1531), + [#1532](https://github.com/fmtlib/fmt/pull/1532), + [#1539](https://github.com/fmtlib/fmt/issues/1539), + [#1547](https://github.com/fmtlib/fmt/issues/1547), + [#1548](https://github.com/fmtlib/fmt/issues/1548), + [#1554](https://github.com/fmtlib/fmt/pull/1554), + [#1567](https://github.com/fmtlib/fmt/issues/1567), + [#1568](https://github.com/fmtlib/fmt/pull/1568), + [#1569](https://github.com/fmtlib/fmt/pull/1569), + [#1571](https://github.com/fmtlib/fmt/pull/1571), + [#1573](https://github.com/fmtlib/fmt/pull/1573), + [#1575](https://github.com/fmtlib/fmt/pull/1575), + [#1581](https://github.com/fmtlib/fmt/pull/1581), + [#1583](https://github.com/fmtlib/fmt/issues/1583), + [#1586](https://github.com/fmtlib/fmt/issues/1586), + [#1587](https://github.com/fmtlib/fmt/issues/1587), + [#1594](https://github.com/fmtlib/fmt/issues/1594), + [#1596](https://github.com/fmtlib/fmt/pull/1596), + [#1604](https://github.com/fmtlib/fmt/issues/1604), + [#1606](https://github.com/fmtlib/fmt/pull/1606), + [#1607](https://github.com/fmtlib/fmt/issues/1607), + [#1609](https://github.com/fmtlib/fmt/issues/1609)). Thanks + [\@marti4d (Chris Martin)](https://github.com/marti4d), + [\@iPherian](https://github.com/iPherian), + [\@parkertomatoes](https://github.com/parkertomatoes), [\@gsjaardema + (Greg Sjaardema)](https://github.com/gsjaardema), [\@chronoxor (Ivan + Shynkarenka)](https://github.com/chronoxor), [\@DanielaE (Daniela + Engert)](https://github.com/DanielaE), + [\@torsten48](https://github.com/torsten48), [\@tohammer (Tobias + Hammer)](https://github.com/tohammer), [\@lefticus (Jason + Turner)](https://github.com/lefticus), [\@ryusakki + (Haise)](https://github.com/ryusakki), [\@adnsv (Alex + Denisov)](https://github.com/adnsv), + [\@fghzxm](https://github.com/fghzxm), + [\@refnum](https://github.com/refnum), [\@pramodk (Pramod + Kumbhar)](https://github.com/pramodk), + [\@Spirrwell](https://github.com/Spirrwell), [\@scramsby (Scott + Ramsby)](https://github.com/scramsby). + +# 6.1.2 - 2019-12-11 + +- Fixed ABI compatibility with `libfmt.so.6.0.0` + ([#1471](https://github.com/fmtlib/fmt/issues/1471)). +- Fixed handling types convertible to `std::string_view` + ([#1451](https://github.com/fmtlib/fmt/pull/1451)). Thanks + [\@denizevrenci (Deniz Evrenci)](https://github.com/denizevrenci). +- Made CUDA test an opt-in enabled via the `FMT_CUDA_TEST` CMake + option. +- Fixed sign conversion warnings + ([#1440](https://github.com/fmtlib/fmt/pull/1440)). Thanks + [\@0x8000-0000 (Florin Iucha)](https://github.com/0x8000-0000). + +# 6.1.1 - 2019-12-04 + +- Fixed shared library build on Windows + ([#1443](https://github.com/fmtlib/fmt/pull/1443), + [#1445](https://github.com/fmtlib/fmt/issues/1445), + [#1446](https://github.com/fmtlib/fmt/pull/1446), + [#1450](https://github.com/fmtlib/fmt/issues/1450)). Thanks + [\@egorpugin (Egor Pugin)](https://github.com/egorpugin), [\@bbolli + (Beat Bolli)](https://github.com/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 + #include + + 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 | + +---------------+------------+----------+ + + ![image](https://user-images.githubusercontent.com/576385/%0A69767160-cdaca400-112f-11ea-9fc5-347c9f83caad.png) + +- {fmt} no longer converts `float` arguments to `double`. In + particular this improves the default (shortest) representation of + floats and makes `fmt::format` consistent with `std::format` specs + ([#1336](https://github.com/fmtlib/fmt/issues/1336), + [#1353](https://github.com/fmtlib/fmt/issues/1353), + [#1360](https://github.com/fmtlib/fmt/pull/1360), + [#1361](https://github.com/fmtlib/fmt/pull/1361)): + + ```c++ + fmt::print("{}", 0.1f); + ``` + + prints `0.1` instead of `0.10000000149011612`. + + Thanks [\@orivej (Orivej Desh)](https://github.com/orivej). + +- Made floating-point formatting output consistent with + `printf`/iostreams + ([#1376](https://github.com/fmtlib/fmt/issues/1376), + [#1417](https://github.com/fmtlib/fmt/issues/1417)). + +- Added support for 128-bit integers + ([#1287](https://github.com/fmtlib/fmt/pull/1287)): + + ```c++ + fmt::print("{}", std::numeric_limits<__int128_t>::max()); + ``` + + prints `170141183460469231731687303715884105727`. + + Thanks [\@denizevrenci (Deniz + Evrenci)](https://github.com/denizevrenci). + +- The overload of `print` that takes `text_style` is now atomic, i.e. + the output from different threads doesn\'t interleave + ([#1351](https://github.com/fmtlib/fmt/pull/1351)). Thanks + [\@tankiJong (Tanki Zhang)](https://github.com/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 + ([#1322](https://github.com/fmtlib/fmt/issues/1322), + [#1330](https://github.com/fmtlib/fmt/pull/1330)): + + ```c++ + #include + #include + + int main() { + std::tuple t{'a', 1, 2.0f}; + fmt::print("{}", t); + } + ``` + + prints `('a', 1, 2.0)`. + + Thanks [\@jeremyong (Jeremy Ong)](https://github.com/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 + ([#1406](https://github.com/fmtlib/fmt/pull/1406)): + + ```c++ + #include + #include + + 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 (Daniel Laügt)](https://github.com/dlaugt). + +- Locale-specific number formatting now uses grouping + ([#1393](https://github.com/fmtlib/fmt/issues/1393) + [#1394](https://github.com/fmtlib/fmt/pull/1394)). Thanks + [\@skrdaniel](https://github.com/skrdaniel). + +- Fixed handling of types with deleted implicit rvalue conversion to + `const char**` ([#1421](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` + ([#1286](https://github.com/fmtlib/fmt/pull/1286)). Thanks [\@agmt + (Egor Seredin)](https://github.com/agmt). + +- Enum classes are no longer implicitly converted to `int` + ([#1424](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 + ([#1389](https://github.com/fmtlib/fmt/issues/1389), + [#1390](https://github.com/fmtlib/fmt/pull/1390)). Thanks + [\@tajtiattila (Attila Tajti)](https://github.com/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) + ([#1410](https://github.com/fmtlib/fmt/pull/1410)): + + conda install -c conda-forge fmt + + Thanks [\@tdegeus (Tom de Geus)](https://github.com/tdegeus). + +- Added a CUDA test ([#1285](https://github.com/fmtlib/fmt/pull/1285), + [#1317](https://github.com/fmtlib/fmt/pull/1317)). Thanks + [\@luncliff (Park DongHa)](https://github.com/luncliff) and + [\@risa2000](https://github.com/risa2000). + +- Improved documentation + ([#1276](https://github.com/fmtlib/fmt/pull/1276), + [#1291](https://github.com/fmtlib/fmt/issues/1291), + [#1296](https://github.com/fmtlib/fmt/issues/1296), + [#1315](https://github.com/fmtlib/fmt/pull/1315), + [#1332](https://github.com/fmtlib/fmt/pull/1332), + [#1337](https://github.com/fmtlib/fmt/pull/1337), + [#1395](https://github.com/fmtlib/fmt/issues/1395) + [#1418](https://github.com/fmtlib/fmt/pull/1418)). Thanks + [\@waywardmonkeys (Bruce + Mitchener)](https://github.com/waywardmonkeys), [\@pauldreik (Paul + Dreik)](https://github.com/pauldreik), [\@jackoalan (Jack + Andersen)](https://github.com/jackoalan). + +- Various code improvements + ([#1358](https://github.com/fmtlib/fmt/pull/1358), + [#1407](https://github.com/fmtlib/fmt/pull/1407)). Thanks [\@orivej + (Orivej Desh)](https://github.com/orivej), [\@dpacbach (David P. + Sicilia)](https://github.com/dpacbach), + +- Fixed compile-time format string checks for user-defined types + ([#1292](https://github.com/fmtlib/fmt/issues/1292)). + +- Worked around a false positive in `unsigned-integer-overflow` + sanitizer ([#1377](https://github.com/fmtlib/fmt/issues/1377)). + +- Fixed various warnings and compilation issues + ([#1273](https://github.com/fmtlib/fmt/issues/1273), + [#1278](https://github.com/fmtlib/fmt/pull/1278), + [#1280](https://github.com/fmtlib/fmt/pull/1280), + [#1281](https://github.com/fmtlib/fmt/issues/1281), + [#1288](https://github.com/fmtlib/fmt/issues/1288), + [#1290](https://github.com/fmtlib/fmt/pull/1290), + [#1301](https://github.com/fmtlib/fmt/pull/1301), + [#1305](https://github.com/fmtlib/fmt/issues/1305), + [#1306](https://github.com/fmtlib/fmt/issues/1306), + [#1309](https://github.com/fmtlib/fmt/issues/1309), + [#1312](https://github.com/fmtlib/fmt/pull/1312), + [#1313](https://github.com/fmtlib/fmt/issues/1313), + [#1316](https://github.com/fmtlib/fmt/issues/1316), + [#1319](https://github.com/fmtlib/fmt/issues/1319), + [#1320](https://github.com/fmtlib/fmt/pull/1320), + [#1326](https://github.com/fmtlib/fmt/pull/1326), + [#1328](https://github.com/fmtlib/fmt/pull/1328), + [#1344](https://github.com/fmtlib/fmt/issues/1344), + [#1345](https://github.com/fmtlib/fmt/pull/1345), + [#1347](https://github.com/fmtlib/fmt/pull/1347), + [#1349](https://github.com/fmtlib/fmt/pull/1349), + [#1354](https://github.com/fmtlib/fmt/issues/1354), + [#1362](https://github.com/fmtlib/fmt/issues/1362), + [#1366](https://github.com/fmtlib/fmt/issues/1366), + [#1364](https://github.com/fmtlib/fmt/pull/1364), + [#1370](https://github.com/fmtlib/fmt/pull/1370), + [#1371](https://github.com/fmtlib/fmt/pull/1371), + [#1385](https://github.com/fmtlib/fmt/issues/1385), + [#1388](https://github.com/fmtlib/fmt/issues/1388), + [#1397](https://github.com/fmtlib/fmt/pull/1397), + [#1414](https://github.com/fmtlib/fmt/pull/1414), + [#1416](https://github.com/fmtlib/fmt/pull/1416), + [#1422](https://github.com/fmtlib/fmt/issues/1422) + [#1427](https://github.com/fmtlib/fmt/pull/1427), + [#1431](https://github.com/fmtlib/fmt/issues/1431), + [#1433](https://github.com/fmtlib/fmt/pull/1433)). Thanks + [\@hhb](https://github.com/hhb), [\@gsjaardema (Greg + Sjaardema)](https://github.com/gsjaardema), [\@gabime (Gabi + Melman)](https://github.com/gabime), [\@neheb (Rosen + Penev)](https://github.com/neheb), [\@vedranmiletic (Vedran + Miletić)](https://github.com/vedranmiletic), [\@dkavolis (Daumantas + Kavolis)](https://github.com/dkavolis), + [\@mwinterb](https://github.com/mwinterb), [\@orivej (Orivej + Desh)](https://github.com/orivej), [\@denizevrenci (Deniz + Evrenci)](https://github.com/denizevrenci) + [\@leonklingele](https://github.com/leonklingele), [\@chronoxor + (Ivan Shynkarenka)](https://github.com/chronoxor), + [\@kent-tri](https://github.com/kent-tri), [\@0x8000-0000 (Florin + Iucha)](https://github.com/0x8000-0000), [\@marti4d (Chris + Martin)](https://github.com/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 + #include + + int main() { + std::locale::global(std::locale("ru_RU.UTF-8")); + fmt::print("value = {}", 4.2); + } + ``` + + prints \"value = 4.2\" regardless of the locale. + + For locale-specific formatting use the `n` specifier: + + ```c++ + 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 + + 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)): + + ![image](https://user-images.githubusercontent.com/576385/%0A54883977-9fe8c000-4e28-11e9-8bde-272d122e7c52.jpg) + +- 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 + ([#1199](https://github.com/fmtlib/fmt/pull/1199)). Thanks + [\@pauldreik (Paul Dreik)](https://github.com/pauldreik). + +- `formatter` specializations now always take precedence over + `operator<<` ([#952](https://github.com/fmtlib/fmt/issues/952)): + + ```c++ + #include + #include + + struct S {}; + + std::ostream& operator<<(std::ostream& os, S) { + return os << 1; + } + + template <> + struct fmt::formatter : fmt::formatter { + auto format(S, format_context& ctx) { + return formatter::format(2, ctx); + } + }; + + 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 + ([#618](https://github.com/fmtlib/fmt/issues/618), + [#1169](https://github.com/fmtlib/fmt/issues/1169), + [#1171](https://github.com/fmtlib/fmt/pull/1171)): + + ```c++ + #include + + auto f = fmt::compile("{}"); + std::string s = fmt::format(f, 42); // can be called multiple times to + // format different values + // s == "42" + ``` + + It moves the cost of parsing a format string outside of the format + function which can be beneficial when identically formatting many + objects of the same types. Thanks [\@stryku (Mateusz + Janek)](https://github.com/stryku). + +- Added experimental `%` format specifier that formats floating-point + values as percentages + ([#1060](https://github.com/fmtlib/fmt/pull/1060), + [#1069](https://github.com/fmtlib/fmt/pull/1069), + [#1071](https://github.com/fmtlib/fmt/pull/1071)): + + ```c++ + auto s = fmt::format("{:.1%}", 0.42); // s == "42.0%" + ``` + + Thanks [\@gawain-bolton (Gawain + Bolton)](https://github.com/gawain-bolton). + +- Implemented precision for floating-point durations + ([#1004](https://github.com/fmtlib/fmt/issues/1004), + [#1012](https://github.com/fmtlib/fmt/pull/1012)): + + ```c++ + auto s = fmt::format("{:.1}", std::chrono::duration(1.234)); + // s == 1.2s + ``` + + Thanks [\@DanielaE (Daniela Engert)](https://github.com/DanielaE). + +- Implemented `chrono` format specifiers `%Q` and `%q` that give the + value and the unit respectively + ([#1019](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 (Daniela Engert)](https://github.com/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` ([#993](https://github.com/fmtlib/fmt/issues/993), + [#994](https://github.com/fmtlib/fmt/pull/994)): + + ```c++ + #include + + std::string message = fmt::format(fmt::emphasis::bold | fg(fmt::color::red), + "The answer is {}.", 42); + ``` + + Thanks [\@Naios (Denis Blank)](https://github.com/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` ([#1121](https://github.com/fmtlib/fmt/pull/1121)): + + ```c++ + std::unique_ptr p = ...; + fmt::print("{}", fmt::ptr(p)); // prints p as a pointer + ``` + + Thanks [\@sighingnow (Tao He)](https://github.com/sighingnow). + +- Made `print` and `vprint` report I/O errors + ([#1098](https://github.com/fmtlib/fmt/issues/1098), + [#1099](https://github.com/fmtlib/fmt/pull/1099)). Thanks + [\@BillyDonahue (Billy Donahue)](https://github.com/BillyDonahue). + +- Marked deprecated APIs with the `[[deprecated]]` attribute and + removed internal uses of deprecated APIs + ([#1022](https://github.com/fmtlib/fmt/pull/1022)). Thanks + [\@eliaskosunen (Elias Kosunen)](https://github.com/eliaskosunen). + +- Modernized the codebase using more C++11 features and removing + workarounds. Most importantly, `buffer_context` is now an alias + template, so use `buffer_context` instead of + `buffer_context::type`. These features require GCC 4.8 or later. + +- `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 + ([#1229](https://github.com/fmtlib/fmt/issues/1229), + [#1243](https://github.com/fmtlib/fmt/pull/1243)). Thanks + [\@jackoalan (Jack Andersen)](https://github.com/jackoalan). + +- Improved literal-based API + ([#1254](https://github.com/fmtlib/fmt/pull/1254)). Thanks + [\@sylveon (Charles Milette)](https://github.com/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 + ([#1059](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) + ([#1037](https://github.com/fmtlib/fmt/issues/1037)). Thanks + [\@Kronuz (Germán Méndez Bravo)](https://github.com/Kronuz). + +- Added the `FMT_ENFORCE_COMPILE_STRING` macro to enforce the use of + compile-time format strings + ([#1231](https://github.com/fmtlib/fmt/pull/1231)). Thanks + [\@jackoalan (Jack Andersen)](https://github.com/jackoalan). + +- Stopped setting `CMAKE_BUILD_TYPE` if {fmt} is a subproject + ([#1081](https://github.com/fmtlib/fmt/issues/1081)). + +- Various build improvements + ([#1039](https://github.com/fmtlib/fmt/pull/1039), + [#1078](https://github.com/fmtlib/fmt/pull/1078), + [#1091](https://github.com/fmtlib/fmt/pull/1091), + [#1103](https://github.com/fmtlib/fmt/pull/1103), + [#1177](https://github.com/fmtlib/fmt/pull/1177)). Thanks + [\@luncliff (Park DongHa)](https://github.com/luncliff), + [\@jasonszang (Jason Shuo Zang)](https://github.com/jasonszang), + [\@olafhering (Olaf Hering)](https://github.com/olafhering), + [\@Lecetem](https://github.com/Lectem), [\@pauldreik (Paul + Dreik)](https://github.com/pauldreik). + +- Improved documentation + ([#1049](https://github.com/fmtlib/fmt/issues/1049), + [#1051](https://github.com/fmtlib/fmt/pull/1051), + [#1083](https://github.com/fmtlib/fmt/pull/1083), + [#1113](https://github.com/fmtlib/fmt/pull/1113), + [#1114](https://github.com/fmtlib/fmt/pull/1114), + [#1146](https://github.com/fmtlib/fmt/issues/1146), + [#1180](https://github.com/fmtlib/fmt/issues/1180), + [#1250](https://github.com/fmtlib/fmt/pull/1250), + [#1252](https://github.com/fmtlib/fmt/pull/1252), + [#1265](https://github.com/fmtlib/fmt/pull/1265)). Thanks [\@mikelui + (Michael Lui)](https://github.com/mikelui), [\@foonathan (Jonathan + Müller)](https://github.com/foonathan), [\@BillyDonahue (Billy + Donahue)](https://github.com/BillyDonahue), [\@jwakely (Jonathan + Wakely)](https://github.com/jwakely), [\@kaisbe (Kais Ben + Salah)](https://github.com/kaisbe), [\@sdebionne (Samuel + Debionne)](https://github.com/sdebionne). + +- Fixed ambiguous formatter specialization in `fmt/ranges.h` + ([#1123](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 + ([#1268](https://github.com/fmtlib/fmt/issues/1268)). + +- Fixed handling of general output iterators when formatting + characters ([#1056](https://github.com/fmtlib/fmt/issues/1056), + [#1058](https://github.com/fmtlib/fmt/pull/1058)). Thanks [\@abolz + (Alexander Bolz)](https://github.com/abolz). + +- Fixed handling of output iterators in `formatter` specialization for + ranges ([#1064](https://github.com/fmtlib/fmt/issues/1064)). + +- Fixed handling of exotic character types + ([#1188](https://github.com/fmtlib/fmt/issues/1188)). + +- Made chrono formatting work with exceptions disabled + ([#1062](https://github.com/fmtlib/fmt/issues/1062)). + +- Fixed DLL visibility issues + ([#1134](https://github.com/fmtlib/fmt/pull/1134), + [#1147](https://github.com/fmtlib/fmt/pull/1147)). Thanks + [\@denchat](https://github.com/denchat). + +- Disabled the use of UDL template extension on GCC 9 + ([#1148](https://github.com/fmtlib/fmt/issues/1148)). + +- Removed misplaced `format` compile-time checks from `printf` + ([#1173](https://github.com/fmtlib/fmt/issues/1173)). + +- Fixed issues in the experimental floating-point formatter + ([#1072](https://github.com/fmtlib/fmt/issues/1072), + [#1129](https://github.com/fmtlib/fmt/issues/1129), + [#1153](https://github.com/fmtlib/fmt/issues/1153), + [#1155](https://github.com/fmtlib/fmt/pull/1155), + [#1210](https://github.com/fmtlib/fmt/issues/1210), + [#1222](https://github.com/fmtlib/fmt/issues/1222)). Thanks + [\@alabuzhev (Alex Alabuzhev)](https://github.com/alabuzhev). + +- Fixed bugs discovered by fuzzing or during fuzzing integration + ([#1124](https://github.com/fmtlib/fmt/issues/1124), + [#1127](https://github.com/fmtlib/fmt/issues/1127), + [#1132](https://github.com/fmtlib/fmt/issues/1132), + [#1135](https://github.com/fmtlib/fmt/pull/1135), + [#1136](https://github.com/fmtlib/fmt/issues/1136), + [#1141](https://github.com/fmtlib/fmt/issues/1141), + [#1142](https://github.com/fmtlib/fmt/issues/1142), + [#1178](https://github.com/fmtlib/fmt/issues/1178), + [#1179](https://github.com/fmtlib/fmt/issues/1179), + [#1194](https://github.com/fmtlib/fmt/issues/1194)). Thanks + [\@pauldreik (Paul Dreik)](https://github.com/pauldreik). + +- Fixed building tests on FreeBSD and Hurd + ([#1043](https://github.com/fmtlib/fmt/issues/1043)). Thanks + [\@jackyf (Eugene V. Lyubimkin)](https://github.com/jackyf). + +- Fixed various warnings and compilation issues + ([#998](https://github.com/fmtlib/fmt/pull/998), + [#1006](https://github.com/fmtlib/fmt/pull/1006), + [#1008](https://github.com/fmtlib/fmt/issues/1008), + [#1011](https://github.com/fmtlib/fmt/issues/1011), + [#1025](https://github.com/fmtlib/fmt/issues/1025), + [#1027](https://github.com/fmtlib/fmt/pull/1027), + [#1028](https://github.com/fmtlib/fmt/pull/1028), + [#1029](https://github.com/fmtlib/fmt/pull/1029), + [#1030](https://github.com/fmtlib/fmt/pull/1030), + [#1031](https://github.com/fmtlib/fmt/pull/1031), + [#1054](https://github.com/fmtlib/fmt/pull/1054), + [#1063](https://github.com/fmtlib/fmt/issues/1063), + [#1068](https://github.com/fmtlib/fmt/pull/1068), + [#1074](https://github.com/fmtlib/fmt/pull/1074), + [#1075](https://github.com/fmtlib/fmt/pull/1075), + [#1079](https://github.com/fmtlib/fmt/pull/1079), + [#1086](https://github.com/fmtlib/fmt/pull/1086), + [#1088](https://github.com/fmtlib/fmt/issues/1088), + [#1089](https://github.com/fmtlib/fmt/pull/1089), + [#1094](https://github.com/fmtlib/fmt/pull/1094), + [#1101](https://github.com/fmtlib/fmt/issues/1101), + [#1102](https://github.com/fmtlib/fmt/pull/1102), + [#1105](https://github.com/fmtlib/fmt/issues/1105), + [#1107](https://github.com/fmtlib/fmt/pull/1107), + [#1115](https://github.com/fmtlib/fmt/issues/1115), + [#1117](https://github.com/fmtlib/fmt/issues/1117), + [#1118](https://github.com/fmtlib/fmt/issues/1118), + [#1120](https://github.com/fmtlib/fmt/issues/1120), + [#1123](https://github.com/fmtlib/fmt/issues/1123), + [#1139](https://github.com/fmtlib/fmt/pull/1139), + [#1140](https://github.com/fmtlib/fmt/issues/1140), + [#1143](https://github.com/fmtlib/fmt/issues/1143), + [#1144](https://github.com/fmtlib/fmt/pull/1144), + [#1150](https://github.com/fmtlib/fmt/pull/1150), + [#1151](https://github.com/fmtlib/fmt/pull/1151), + [#1152](https://github.com/fmtlib/fmt/issues/1152), + [#1154](https://github.com/fmtlib/fmt/issues/1154), + [#1156](https://github.com/fmtlib/fmt/issues/1156), + [#1159](https://github.com/fmtlib/fmt/pull/1159), + [#1175](https://github.com/fmtlib/fmt/issues/1175), + [#1181](https://github.com/fmtlib/fmt/issues/1181), + [#1186](https://github.com/fmtlib/fmt/issues/1186), + [#1187](https://github.com/fmtlib/fmt/pull/1187), + [#1191](https://github.com/fmtlib/fmt/pull/1191), + [#1197](https://github.com/fmtlib/fmt/issues/1197), + [#1200](https://github.com/fmtlib/fmt/issues/1200), + [#1203](https://github.com/fmtlib/fmt/issues/1203), + [#1205](https://github.com/fmtlib/fmt/issues/1205), + [#1206](https://github.com/fmtlib/fmt/pull/1206), + [#1213](https://github.com/fmtlib/fmt/issues/1213), + [#1214](https://github.com/fmtlib/fmt/issues/1214), + [#1217](https://github.com/fmtlib/fmt/pull/1217), + [#1228](https://github.com/fmtlib/fmt/issues/1228), + [#1230](https://github.com/fmtlib/fmt/pull/1230), + [#1232](https://github.com/fmtlib/fmt/issues/1232), + [#1235](https://github.com/fmtlib/fmt/pull/1235), + [#1236](https://github.com/fmtlib/fmt/pull/1236), + [#1240](https://github.com/fmtlib/fmt/issues/1240)). Thanks + [\@DanielaE (Daniela Engert)](https://github.com/DanielaE), + [\@mwinterb](https://github.com/mwinterb), [\@eliaskosunen (Elias + Kosunen)](https://github.com/eliaskosunen), + [\@morinmorin](https://github.com/morinmorin), [\@ricco19 (Brian + Ricciardelli)](https://github.com/ricco19), [\@waywardmonkeys (Bruce + Mitchener)](https://github.com/waywardmonkeys), [\@chronoxor (Ivan + Shynkarenka)](https://github.com/chronoxor), + [\@remyabel](https://github.com/remyabel), [\@pauldreik (Paul + Dreik)](https://github.com/pauldreik), [\@gsjaardema (Greg + Sjaardema)](https://github.com/gsjaardema), [\@rcane (Ronny + Krüger)](https://github.com/rcane), + [\@mocabe](https://github.com/mocabe), + [\@denchat](https://github.com/denchat), [\@cjdb (Christopher Di + Bella)](https://github.com/cjdb), [\@HazardyKnusperkeks (Björn + Schäpers)](https://github.com/HazardyKnusperkeks), [\@vedranmiletic + (Vedran Miletić)](https://github.com/vedranmiletic), [\@jackoalan + (Jack Andersen)](https://github.com/jackoalan), [\@DaanDeMeyer (Daan + De Meyer)](https://github.com/DaanDeMeyer), [\@starkmapper (Mark + Stapper)](https://github.com/starkmapper). + +# 5.3.0 - 2018-12-28 + +- Introduced experimental chrono formatting support: + + ```c++ + #include + + int main() { + using namespace std::literals::chrono_literals; + fmt::print("Default format: {} {}\n", 42s, 100ms); + fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s); + } + ``` + + 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 + ([#961](https://github.com/fmtlib/fmt/pull/961), + [#967](https://github.com/fmtlib/fmt/pull/967), + [#973](https://github.com/fmtlib/fmt/pull/973)): + + ```c++ + #include + + int main() { + print(fg(fmt::color::crimson) | fmt::emphasis::bold, + "Hello, {}!\n", "world"); + print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) | + fmt::emphasis::underline, "Hello, {}!\n", "мир"); + print(fg(fmt::color::steel_blue) | fmt::emphasis::italic, + "Hello, {}!\n", "世界"); + } + ``` + + prints the following on modern terminals with RGB color support: + + ![image](https://user-images.githubusercontent.com/576385/%0A50405788-b66e7500-076e-11e9-9592-7324d1f951d8.png) + + Thanks [\@Rakete1111 (Nicolas)](https://github.com/Rakete1111). + +- Added support for 4-bit terminal colors + ([#968](https://github.com/fmtlib/fmt/issues/968), + [#974](https://github.com/fmtlib/fmt/pull/974)) + + ```c++ + #include + + int main() { + print(fg(fmt::terminal_color::red), "stop\n"); + } + ``` + + Note that these colors vary by terminal: + + ![image](https://user-images.githubusercontent.com/576385/%0A50405925-dbfc7e00-0770-11e9-9b85-333fab0af9ac.png) + + Thanks [\@Rakete1111 (Nicolas)](https://github.com/Rakete1111). + +- Parameterized formatting functions on the type of the format string + ([#880](https://github.com/fmtlib/fmt/issues/880), + [#881](https://github.com/fmtlib/fmt/pull/881), + [#883](https://github.com/fmtlib/fmt/pull/883), + [#885](https://github.com/fmtlib/fmt/pull/885), + [#897](https://github.com/fmtlib/fmt/pull/897), + [#920](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 (Daniela Engert)](https://github.com/DanielaE). + +- Made `std::string_view` work as a format string + ([#898](https://github.com/fmtlib/fmt/pull/898)): + + ```c++ + auto message = fmt::format(std::string_view("The answer is {}."), 42); + ``` + + Thanks [\@DanielaE (Daniela Engert)](https://github.com/DanielaE). + +- Added wide string support to compile-time format string checks + ([#924](https://github.com/fmtlib/fmt/pull/924)): + + ```c++ + print(fmt(L"{:f}"), 42); // compile-time error: invalid type specifier + ``` + + Thanks [\@XZiar](https://github.com/XZiar). + +- Made colored print functions work with wide strings + ([#867](https://github.com/fmtlib/fmt/pull/867)): + + ```c++ + #include + + int main() { + print(fg(fmt::color::red), L"{}\n", 42); + } + ``` + + Thanks [\@DanielaE (Daniela Engert)](https://github.com/DanielaE). + +- Introduced experimental Unicode support + ([#628](https://github.com/fmtlib/fmt/issues/628), + [#891](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 + + struct numpunct : std::numpunct { + protected: + char do_thousands_sep() const override { return '~'; } + }; + + std::locale loc; + auto s = fmt::format(std::locale(loc, new numpunct()), "{:n}", 1234567); + // s == "1~234~567" + ``` + +- Constrained formatting functions on proper iterator types + ([#921](https://github.com/fmtlib/fmt/pull/921)). Thanks [\@DanielaE + (Daniela Engert)](https://github.com/DanielaE). + +- Added `make_printf_args` and `make_wprintf_args` functions + ([#934](https://github.com/fmtlib/fmt/pull/934)). Thanks + [\@tnovotny](https://github.com/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 + ([#873](https://github.com/fmtlib/fmt/issues/873), + [#902](https://github.com/fmtlib/fmt/pull/902)). Thanks [\@superfunc + (hollywood programmer)](https://github.com/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` + ([#878](https://github.com/fmtlib/fmt/issues/878)). + +- Improved documentation + ([#164](https://github.com/fmtlib/fmt/issues/164), + [#877](https://github.com/fmtlib/fmt/issues/877), + [#901](https://github.com/fmtlib/fmt/pull/901), + [#906](https://github.com/fmtlib/fmt/pull/906), + [#979](https://github.com/fmtlib/fmt/pull/979)). Thanks [\@kookjr + (Mathew Cucuzella)](https://github.com/kookjr), [\@DarkDimius + (Dmitry Petrashko)](https://github.com/DarkDimius), + [\@HecticSerenity](https://github.com/HecticSerenity). + +- Added pkgconfig support which makes it easier to consume the library + from meson and other build systems + ([#916](https://github.com/fmtlib/fmt/pull/916)). Thanks + [\@colemickens (Cole Mickens)](https://github.com/colemickens). + +- Various build improvements + ([#909](https://github.com/fmtlib/fmt/pull/909), + [#926](https://github.com/fmtlib/fmt/pull/926), + [#937](https://github.com/fmtlib/fmt/pull/937), + [#953](https://github.com/fmtlib/fmt/pull/953), + [#959](https://github.com/fmtlib/fmt/pull/959)). Thanks [\@tchaikov + (Kefu Chai)](https://github.com/tchaikov), [\@luncliff (Park + DongHa)](https://github.com/luncliff), [\@AndreasSchoenle (Andreas + Schönle)](https://github.com/AndreasSchoenle), + [\@hotwatermorning](https://github.com/hotwatermorning), [\@Zefz + (JohanJansen)](https://github.com/Zefz). + +- Improved `string_view` construction performance + ([#914](https://github.com/fmtlib/fmt/pull/914)). Thanks [\@gabime + (Gabi Melman)](https://github.com/gabime). + +- Fixed non-matching char types + ([#895](https://github.com/fmtlib/fmt/pull/895)). Thanks [\@DanielaE + (Daniela Engert)](https://github.com/DanielaE). + +- Fixed `format_to_n` with `std::back_insert_iterator` + ([#913](https://github.com/fmtlib/fmt/pull/913)). Thanks [\@DanielaE + (Daniela Engert)](https://github.com/DanielaE). + +- Fixed locale-dependent formatting + ([#905](https://github.com/fmtlib/fmt/issues/905)). + +- Fixed various compiler warnings and errors + ([#882](https://github.com/fmtlib/fmt/pull/882), + [#886](https://github.com/fmtlib/fmt/pull/886), + [#933](https://github.com/fmtlib/fmt/pull/933), + [#941](https://github.com/fmtlib/fmt/pull/941), + [#931](https://github.com/fmtlib/fmt/issues/931), + [#943](https://github.com/fmtlib/fmt/pull/943), + [#954](https://github.com/fmtlib/fmt/pull/954), + [#956](https://github.com/fmtlib/fmt/pull/956), + [#962](https://github.com/fmtlib/fmt/pull/962), + [#965](https://github.com/fmtlib/fmt/issues/965), + [#977](https://github.com/fmtlib/fmt/issues/977), + [#983](https://github.com/fmtlib/fmt/pull/983), + [#989](https://github.com/fmtlib/fmt/pull/989)). Thanks [\@Luthaf + (Guillaume Fraux)](https://github.com/Luthaf), [\@stevenhoving + (Steven Hoving)](https://github.com/stevenhoving), [\@christinaa + (Kristina Brooks)](https://github.com/christinaa), [\@lgritz (Larry + Gritz)](https://github.com/lgritz), [\@DanielaE (Daniela + Engert)](https://github.com/DanielaE), [\@0x8000-0000 (Sign + Bit)](https://github.com/0x8000-0000), + [\@liuping1997](https://github.com/liuping1997). + +# 5.2.1 - 2018-09-21 + +- Fixed `visit` lookup issues on gcc 7 & 8 + ([#870](https://github.com/fmtlib/fmt/pull/870)). Thanks + [\@medithe](https://github.com/medithe). +- Fixed linkage errors on older gcc. +- Prevented `fmt/range.h` from specializing `fmt::basic_string_view` + ([#865](https://github.com/fmtlib/fmt/issues/865), + [#868](https://github.com/fmtlib/fmt/pull/868)). Thanks [\@hhggit + (dual)](https://github.com/hhggit). +- Improved error message when formatting unknown types + ([#872](https://github.com/fmtlib/fmt/pull/872)). Thanks + [\@foonathan (Jonathan Müller)](https://github.com/foonathan), +- Disabled templated user-defined literals when compiled under nvcc + ([#875](https://github.com/fmtlib/fmt/pull/875)). Thanks + [\@CandyGumdrop (Candy Gumdrop)](https://github.com/CandyGumdrop), +- Fixed `format_to` formatting to `wmemory_buffer` + ([#874](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 0.51 | > 1.66x | + | fmt::format_to 5.1 | | | + +----------------------------+-----------------------+---------+ + | fmt::format_to 5.2 sprintf | > 0.23 0.71 1.01 1.73 | > 2.22x | + | std::to_string | | | + | std::stringstream | | | + +----------------------------+-----------------------+---------+ + +- Changed the `fmt` macro from opt-out to opt-in to prevent name + collisions. To enable it define the `FMT_STRING_ALIAS` macro to 1 + before including `fmt/format.h`: + + ```c++ + #define FMT_STRING_ALIAS 1 + #include + std::string answer = format(fmt("{}"), 42); + ``` + +- Added compile-time format string checks to `format_to` overload that + takes `fmt::memory_buffer` + ([#783](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 + ([#814](https://github.com/fmtlib/fmt/issues/814), + [#819](https://github.com/fmtlib/fmt/pull/819)). Thanks + [\@MikePopoloski (Michael + Popoloski)](https://github.com/MikePopoloski). + +- Reduced executable size overhead for embedded targets using newlib + nano by making locale dependency optional + ([#839](https://github.com/fmtlib/fmt/pull/839)). Thanks + [\@teajay-fr (Thomas Benard)](https://github.com/teajay-fr). + +- Keep `noexcept` specifier when exceptions are disabled + ([#801](https://github.com/fmtlib/fmt/issues/801), + [#810](https://github.com/fmtlib/fmt/pull/810)). Thanks [\@qis + (Alexej Harm)](https://github.com/qis). + +- Fixed formatting of user-defined types providing `operator<<` with + `format_to_n` ([#806](https://github.com/fmtlib/fmt/pull/806)). + Thanks [\@mkurdej (Marek Kurdej)](https://github.com/mkurdej). + +- Fixed dynamic linkage of new symbols + ([#808](https://github.com/fmtlib/fmt/issues/808)). + +- Fixed global initialization issue + ([#807](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 + ([#804](https://github.com/fmtlib/fmt/pull/804), + [#809](https://github.com/fmtlib/fmt/issues/809), + [#811](https://github.com/fmtlib/fmt/pull/811), + [#822](https://github.com/fmtlib/fmt/issues/822), + [#827](https://github.com/fmtlib/fmt/pull/827), + [#830](https://github.com/fmtlib/fmt/issues/830), + [#838](https://github.com/fmtlib/fmt/pull/838), + [#843](https://github.com/fmtlib/fmt/issues/843), + [#844](https://github.com/fmtlib/fmt/pull/844), + [#851](https://github.com/fmtlib/fmt/issues/851), + [#852](https://github.com/fmtlib/fmt/pull/852), + [#854](https://github.com/fmtlib/fmt/pull/854)). Thanks [\@henryiii + (Henry Schreiner)](https://github.com/henryiii), + [\@medithe](https://github.com/medithe), and [\@eliasdaler (Elias + Daler)](https://github.com/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::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. + ([#762](https://github.com/fmtlib/fmt/issues/762) + [#767](https://github.com/fmtlib/fmt/pull/767)). thanks [\@Remotion + (Remo)](https://github.com/Remotion). + +- Added quotes to strings in ranges and tuples + ([#766](https://github.com/fmtlib/fmt/pull/766)). Thanks [\@Remotion + (Remo)](https://github.com/Remotion). + +- Made `format_to` work with `basic_memory_buffer` + ([#776](https://github.com/fmtlib/fmt/issues/776)). + +- Added `vformat_to_n` and `wchar_t` overload of `format_to_n` + ([#764](https://github.com/fmtlib/fmt/issues/764), + [#769](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 + ([#751](https://github.com/fmtlib/fmt/issues/751), + [#759](https://github.com/fmtlib/fmt/pull/759)). Thanks [\@drrlvn + (Dror Levin)](https://github.com/drrlvn). + +- Added more compilers to continuous integration and increased + `FMT_PEDANTIC` warning levels + ([#736](https://github.com/fmtlib/fmt/pull/736)). Thanks + [\@eliaskosunen (Elias Kosunen)](https://github.com/eliaskosunen). + +- Fixed compilation with MSVC 2013. + +- Fixed handling of user-defined types in `format_to` + ([#793](https://github.com/fmtlib/fmt/issues/793)). + +- Forced linking of inline `vformat` functions into the library + ([#795](https://github.com/fmtlib/fmt/issues/795)). + +- Fixed incorrect call to on_align in `'{:}='` + ([#750](https://github.com/fmtlib/fmt/issues/750)). + +- Fixed floating-point formatting to a non-back_insert_iterator with + sign & numeric alignment specified + ([#756](https://github.com/fmtlib/fmt/issues/756)). + +- Fixed formatting to an array with `format_to_n` + ([#778](https://github.com/fmtlib/fmt/issues/778)). + +- Fixed formatting of more than 15 named arguments + ([#754](https://github.com/fmtlib/fmt/issues/754)). + +- Fixed handling of compile-time strings when including + `fmt/ostream.h`. ([#768](https://github.com/fmtlib/fmt/issues/768)). + +- Fixed various compiler warnings and errors + ([#742](https://github.com/fmtlib/fmt/issues/742), + [#748](https://github.com/fmtlib/fmt/issues/748), + [#752](https://github.com/fmtlib/fmt/issues/752), + [#770](https://github.com/fmtlib/fmt/issues/770), + [#775](https://github.com/fmtlib/fmt/pull/775), + [#779](https://github.com/fmtlib/fmt/issues/779), + [#780](https://github.com/fmtlib/fmt/pull/780), + [#790](https://github.com/fmtlib/fmt/pull/790), + [#792](https://github.com/fmtlib/fmt/pull/792), + [#800](https://github.com/fmtlib/fmt/pull/800)). Thanks [\@Remotion + (Remo)](https://github.com/Remotion), [\@gabime (Gabi + Melman)](https://github.com/gabime), [\@foonathan (Jonathan + Müller)](https://github.com/foonathan), [\@Dark-Passenger (Dhruv + Paranjape)](https://github.com/Dark-Passenger), and [\@0x8000-0000 + (Sign Bit)](https://github.com/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 + + 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)): + + ... + :4:19: note: in instantiation of function template specialization 'fmt::v5::format' requested here + std::string s = format(fmt("{:d}"), "foo"); + ^ + format.h:1337:13: note: non-constexpr function 'on_error' cannot be used in a constant expression + handler.on_error("invalid type specifier"); + + Compile-time checks require relaxed `constexpr` (C++14 feature) + support. If the latter is not available, checks will be performed at + runtime. + +- 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 { + constexpr auto parse(parse_context& ctx) { + auto it = ctx.begin(); + spec = *it; + if (spec != 'd' && spec != 's') + throw format_error("invalid specifier"); + return ++it; + } + + template + auto format(Answer, FormatContext& ctx) { + return spec == 's' ? + format_to(ctx.begin(), "{}", "fourty-two") : + format_to(ctx.begin(), "{}", 42); + } + + char spec = 0; + }; + } + + std::string s = format(fmt("{:x}"), Answer()); + ``` + + gives a compile-time error due to invalid format specifier + ([godbolt](https://godbolt.org/g/2jQ1Dv)): + + ... + :12:45: error: expression '' is not a constant expression + throw format_error("invalid specifier"); + +- Added [iterator + support](https://fmt.dev/latest/api.html#output-iterator-support): + + ```c++ + #include + #include + + std::vector out; + fmt::format_to(std::back_inserter(out), "{}", 42); + ``` + +- Added the + [format_to_n](https://fmt.dev/latest/api.html#_CPPv2N3fmt11format_to_nE8OutputItNSt6size_tE11string_viewDpRK4Args) + function that restricts the output to the specified number of + characters ([#298](https://github.com/fmtlib/fmt/issues/298)): + + ```c++ + char out[4]; + fmt::format_to_n(out, sizeof(out), "{}", 12345); + // out == "1234" (without terminating '\0') + ``` + +- Added the + [formatted_size](https://fmt.dev/latest/api.html#_CPPv2N3fmt14formatted_sizeE11string_viewDpRK4Args) + function for computing the output size: + + ```c++ + #include + + auto size = fmt::formatted_size("{}", 12345); // size == 5 + ``` + +- Improved compile times by reducing dependencies on standard headers + and providing a lightweight [core + API](https://fmt.dev/latest/api.html#core-api): + + ```c++ + #include + + fmt::print("The answer is {}.", 42); + ``` + + See [Compile time and code + bloat](https://github.com/fmtlib/fmt#compile-time-and-code-bloat). + +- Added the + [make_format_args](https://fmt.dev/latest/api.html#_CPPv2N3fmt16make_format_argsEDpRK4Args) + function for capturing formatting arguments: + + ```c++ + // Prints formatted error message. + void vreport_error(const char *format, fmt::format_args args) { + fmt::print("Error: "); + fmt::vprint(format, args); + } + template + 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 ([#687](https://github.com/fmtlib/fmt/issues/687), + [#694](https://github.com/fmtlib/fmt/pull/694)). Thanks [\@Kronuz + (Germán Méndez Bravo)](https://github.com/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 + 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` + ([#735](https://github.com/fmtlib/fmt/pull/735)): + + ```c++ + #include + + std::vector v = {1, 2, 3}; + fmt::print("{}", v); // prints {1, 2, 3} + ``` + + Thanks [\@Remotion (Remo)](https://github.com/Remotion). + +- Implemented `wchar_t` date and time formatting + ([#712](https://github.com/fmtlib/fmt/pull/712)): + + ```c++ + #include + + std::time_t t = std::time(nullptr); + auto s = fmt::format(L"The date is {:%Y-%m-%d}.", *std::localtime(&t)); + ``` + + Thanks [\@DanielaE (Daniela Engert)](https://github.com/DanielaE). + +- Provided more wide string overloads + ([#724](https://github.com/fmtlib/fmt/pull/724)). Thanks [\@DanielaE + (Daniela Engert)](https://github.com/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` + ([#607](https://github.com/fmtlib/fmt/pull/607)): + + ```c++ + #include + #include + + fmt::print("{}", std::experimental::string_view("foo")); + ``` + + Thanks [\@virgiliofornazin (Virgilio Alexandre + Fornazin)](https://github.com/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 ([#606](https://github.com/fmtlib/fmt/pull/606)). + +- Improved documentation + ([#515](https://github.com/fmtlib/fmt/pull/515), + [#614](https://github.com/fmtlib/fmt/issues/614), + [#617](https://github.com/fmtlib/fmt/pull/617), + [#661](https://github.com/fmtlib/fmt/pull/661), + [#680](https://github.com/fmtlib/fmt/pull/680)). Thanks [\@ibell + (Ian Bell)](https://github.com/ibell), [\@mihaitodor (Mihai + Todor)](https://github.com/mihaitodor), and + [\@johnthagen](https://github.com/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 + ([#636](https://github.com/fmtlib/fmt/issues/636)). + +- Removed unnecessary `fmt/` prefix in includes + ([#397](https://github.com/fmtlib/fmt/pull/397)). Thanks + [\@chronoxor (Ivan Shynkarenka)](https://github.com/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` + ([#641](https://github.com/fmtlib/fmt/pull/641)). Thanks [\@cowo78 + (Giuseppe Corbelli)](https://github.com/cowo78). + +- Added Gradle build file `support/build.gradle` + ([#649](https://github.com/fmtlib/fmt/pull/649)). Thanks [\@luncliff + (Park DongHa)](https://github.com/luncliff). + +- Removed `FMT_CPPFORMAT` CMake option. + +- Fixed a name conflict with the macro `CHAR_WIDTH` in glibc + ([#616](https://github.com/fmtlib/fmt/pull/616)). Thanks [\@aroig + (Abdó Roig-Maranges)](https://github.com/aroig). + +- Fixed handling of nested braces in `fmt::join` + ([#638](https://github.com/fmtlib/fmt/issues/638)). + +- Added `SOURCELINK_SUFFIX` for compatibility with Sphinx 1.5 + ([#497](https://github.com/fmtlib/fmt/pull/497)). Thanks [\@ginggs + (Graham Inggs)](https://github.com/ginggs). + +- Added a missing `inline` in the header-only mode + ([#626](https://github.com/fmtlib/fmt/pull/626)). Thanks [\@aroig + (Abdó Roig-Maranges)](https://github.com/aroig). + +- Fixed various compiler warnings + ([#640](https://github.com/fmtlib/fmt/pull/640), + [#656](https://github.com/fmtlib/fmt/pull/656), + [#679](https://github.com/fmtlib/fmt/pull/679), + [#681](https://github.com/fmtlib/fmt/pull/681), + [#705](https://github.com/fmtlib/fmt/pull/705), + [#715](https://github.com/fmtlib/fmt/issues/715), + [#717](https://github.com/fmtlib/fmt/pull/717), + [#720](https://github.com/fmtlib/fmt/pull/720), + [#723](https://github.com/fmtlib/fmt/pull/723), + [#726](https://github.com/fmtlib/fmt/pull/726), + [#730](https://github.com/fmtlib/fmt/pull/730), + [#739](https://github.com/fmtlib/fmt/pull/739)). Thanks + [\@peterbell10](https://github.com/peterbell10), + [\@LarsGullik](https://github.com/LarsGullik), [\@foonathan + (Jonathan Müller)](https://github.com/foonathan), [\@eliaskosunen + (Elias Kosunen)](https://github.com/eliaskosunen), + [\@christianparpart (Christian + Parpart)](https://github.com/christianparpart), [\@DanielaE (Daniela + Engert)](https://github.com/DanielaE), and + [\@mwinterb](https://github.com/mwinterb). + +- Worked around an MSVC bug and fixed several warnings + ([#653](https://github.com/fmtlib/fmt/pull/653)). Thanks + [\@alabuzhev (Alex Alabuzhev)](https://github.com/alabuzhev). + +- Worked around GCC bug 67371 + ([#682](https://github.com/fmtlib/fmt/issues/682)). + +- Fixed compilation with `-fno-exceptions` + ([#655](https://github.com/fmtlib/fmt/pull/655)). Thanks + [\@chenxiaolong (Andrew + Gunnerson)](https://github.com/chenxiaolong). + +- Made `constexpr remove_prefix` gcc version check tighter + ([#648](https://github.com/fmtlib/fmt/issues/648)). + +- Renamed internal type enum constants to prevent collision with + poorly written C libraries + ([#644](https://github.com/fmtlib/fmt/issues/644)). + +- Added detection of `wostream operator<<` + ([#650](https://github.com/fmtlib/fmt/issues/650)). + +- Fixed compilation on OpenBSD + ([#660](https://github.com/fmtlib/fmt/pull/660)). Thanks + [\@hubslave](https://github.com/hubslave). + +- Fixed compilation on FreeBSD 12 + ([#732](https://github.com/fmtlib/fmt/pull/732)). Thanks + [\@dankm](https://github.com/dankm). + +- Fixed compilation when there is a mismatch between `-std` options + between the library and user code + ([#664](https://github.com/fmtlib/fmt/issues/664)). + +- Fixed compilation with GCC 7 and `-std=c++11` + ([#734](https://github.com/fmtlib/fmt/issues/734)). + +- Improved generated binary code on GCC 7 and older + ([#668](https://github.com/fmtlib/fmt/issues/668)). + +- Fixed handling of numeric alignment with no width + ([#675](https://github.com/fmtlib/fmt/issues/675)). + +- Fixed handling of empty strings in UTF8/16 converters + ([#676](https://github.com/fmtlib/fmt/pull/676)). Thanks + [\@vgalka-sl (Vasili Galka)](https://github.com/vgalka-sl). + +- Fixed formatting of an empty `string_view` + ([#689](https://github.com/fmtlib/fmt/issues/689)). + +- Fixed detection of `string_view` on libc++ + ([#686](https://github.com/fmtlib/fmt/issues/686)). + +- Fixed DLL issues ([#696](https://github.com/fmtlib/fmt/pull/696)). + Thanks [\@sebkoenig](https://github.com/sebkoenig). + +- Fixed compile checks for mixing narrow and wide strings + ([#690](https://github.com/fmtlib/fmt/issues/690)). + +- Disabled unsafe implicit conversion to `std::string` + ([#729](https://github.com/fmtlib/fmt/issues/729)). + +- Fixed handling of reused format specs (as in `fmt::join`) for + pointers ([#725](https://github.com/fmtlib/fmt/pull/725)). Thanks + [\@mwinterb](https://github.com/mwinterb). + +- Fixed installation of `fmt/ranges.h` + ([#738](https://github.com/fmtlib/fmt/pull/738)). Thanks + [\@sv1990](https://github.com/sv1990). + +# 4.1.0 - 2017-12-20 + +- Added `fmt::to_wstring()` in addition to `fmt::to_string()` + ([#559](https://github.com/fmtlib/fmt/pull/559)). Thanks + [\@alabuzhev (Alex Alabuzhev)](https://github.com/alabuzhev). +- Added support for C++17 `std::string_view` + ([#571](https://github.com/fmtlib/fmt/pull/571) and + [#578](https://github.com/fmtlib/fmt/pull/578)). Thanks [\@thelostt + (Mário Feroldi)](https://github.com/thelostt) and + [\@mwinterb](https://github.com/mwinterb). +- Enabled stream exceptions to catch errors + ([#581](https://github.com/fmtlib/fmt/issues/581)). Thanks + [\@crusader-mike](https://github.com/crusader-mike). +- Allowed formatting of class hierarchies with `fmt::format_arg()` + ([#547](https://github.com/fmtlib/fmt/pull/547)). Thanks [\@rollbear + (Björn Fahller)](https://github.com/rollbear). +- Removed limitations on character types + ([#563](https://github.com/fmtlib/fmt/pull/563)). Thanks + [\@Yelnats321 (Elnar Dakeshov)](https://github.com/Yelnats321). +- Conditionally enabled use of `std::allocator_traits` + ([#583](https://github.com/fmtlib/fmt/pull/583)). Thanks + [\@mwinterb](https://github.com/mwinterb). +- Added support for `const` variadic member function emulation with + `FMT_VARIADIC_CONST` + ([#591](https://github.com/fmtlib/fmt/pull/591)). Thanks + [\@ludekvodicka (Ludek Vodicka)](https://github.com/ludekvodicka). +- Various bugfixes: bad overflow check, unsupported implicit type + conversion when determining formatting function, test segfaults + ([#551](https://github.com/fmtlib/fmt/issues/551)), ill-formed + macros ([#542](https://github.com/fmtlib/fmt/pull/542)) and + ambiguous overloads + ([#580](https://github.com/fmtlib/fmt/issues/580)). Thanks + [\@xylosper (Byoung-young Lee)](https://github.com/xylosper). +- Prevented warnings on MSVC + ([#605](https://github.com/fmtlib/fmt/pull/605), + [#602](https://github.com/fmtlib/fmt/pull/602), and + [#545](https://github.com/fmtlib/fmt/pull/545)), clang + ([#582](https://github.com/fmtlib/fmt/pull/582)), GCC + ([#573](https://github.com/fmtlib/fmt/issues/573)), various + conversion warnings ([#609](https://github.com/fmtlib/fmt/pull/609), + [#567](https://github.com/fmtlib/fmt/pull/567), + [#553](https://github.com/fmtlib/fmt/pull/553) and + [#553](https://github.com/fmtlib/fmt/pull/553)), and added + `override` and `[[noreturn]]` + ([#549](https://github.com/fmtlib/fmt/pull/549) and + [#555](https://github.com/fmtlib/fmt/issues/555)). Thanks + [\@alabuzhev (Alex Alabuzhev)](https://github.com/alabuzhev), + [\@virgiliofornazin (Virgilio Alexandre + Fornazin)](https://gihtub.com/virgiliofornazin), [\@alexanderbock + (Alexander Bock)](https://github.com/alexanderbock), + [\@yumetodo](https://github.com/yumetodo), [\@VaderY (Császár + Mátyás)](https://github.com/VaderY), [\@jpcima (JP + Cimalando)](https://github.com/jpcima), [\@thelostt (Mário + Feroldi)](https://github.com/thelostt), and [\@Manu343726 (Manu + Sánchez)](https://github.com/Manu343726). +- Improved CMake: Used `GNUInstallDirs` to set installation location + ([#610](https://github.com/fmtlib/fmt/pull/610)) and fixed warnings + ([#536](https://github.com/fmtlib/fmt/pull/536) and + [#556](https://github.com/fmtlib/fmt/pull/556)). Thanks [\@mikecrowe + (Mike Crowe)](https://github.com/mikecrowe), + [\@evgen231](https://github.com/evgen231) and [\@henryiii (Henry + Schreiner)](https://github.com/henryiii). + +# 4.0.0 - 2017-06-27 + +- Removed old compatibility headers `cppformat/*.h` and CMake options + ([#527](https://github.com/fmtlib/fmt/pull/527)). Thanks + [\@maddinat0r (Alex Martin)](https://github.com/maddinat0r). + +- Added `string.h` containing `fmt::to_string()` as alternative to + `std::to_string()` as well as other string writer functionality + ([#326](https://github.com/fmtlib/fmt/issues/326) and + [#441](https://github.com/fmtlib/fmt/pull/441)): + + ```c++ + #include "fmt/string.h" + + std::string answer = fmt::to_string(42); + ``` + + Thanks to [\@glebov-andrey (Andrey + Glebov)](https://github.com/glebov-andrey). + +- Moved `fmt::printf()` to new `printf.h` header and allowed `%s` as + generic specifier ([#453](https://github.com/fmtlib/fmt/pull/453)), + made `%.f` more conformant to regular `printf()` + ([#490](https://github.com/fmtlib/fmt/pull/490)), added custom + writer support ([#476](https://github.com/fmtlib/fmt/issues/476)) + and implemented missing custom argument formatting + ([#339](https://github.com/fmtlib/fmt/pull/339) and + [#340](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](https://github.com/mojoBrendan), + [\@manylegged (Arthur Danskin)](https://github.com/manylegged) and + [\@spacemoose (Glen Stark)](https://github.com/spacemoose). See also + [#360](https://github.com/fmtlib/fmt/issues/360), + [#335](https://github.com/fmtlib/fmt/issues/335) and + [#331](https://github.com/fmtlib/fmt/issues/331). + +- Added `container.h` containing a `BasicContainerWriter` to write to + containers like `std::vector` + ([#450](https://github.com/fmtlib/fmt/pull/450)). Thanks + [\@polyvertex (Jean-Charles + Lefebvre)](https://github.com/polyvertex). + +- Added `fmt::join()` function that takes a range and formats its + elements separated by a given string + ([#466](https://github.com/fmtlib/fmt/pull/466)): + + ```c++ + #include "fmt/format.h" + + std::vector v = {1.2, 3.4, 5.6}; + // Prints "(+01.20, +03.40, +05.60)". + fmt::print("({:+06.2f})", fmt::join(v.begin(), v.end(), ", ")); + ``` + + Thanks [\@olivier80](https://github.com/olivier80). + +- Added support for custom formatting specifications to simplify + customization of built-in formatting + ([#444](https://github.com/fmtlib/fmt/pull/444)). Thanks + [\@polyvertex (Jean-Charles + Lefebvre)](https://github.com/polyvertex). See also + [#439](https://github.com/fmtlib/fmt/issues/439). + +- Added `fmt::format_system_error()` for error code formatting + ([#323](https://github.com/fmtlib/fmt/issues/323) and + [#526](https://github.com/fmtlib/fmt/pull/526)). Thanks + [\@maddinat0r (Alex Martin)](https://github.com/maddinat0r). + +- Added thread-safe `fmt::localtime()` and `fmt::gmtime()` as + replacement for the standard version to `time.h` + ([#396](https://github.com/fmtlib/fmt/pull/396)). Thanks + [\@codicodi](https://github.com/codicodi). + +- Internal improvements to `NamedArg` and `ArgLists` + ([#389](https://github.com/fmtlib/fmt/pull/389) and + [#390](https://github.com/fmtlib/fmt/pull/390)). Thanks + [\@chronoxor](https://github.com/chronoxor). + +- Fixed crash due to bug in `FormatBuf` + ([#493](https://github.com/fmtlib/fmt/pull/493)). Thanks + [\@effzeh](https://github.com/effzeh). See also + [#480](https://github.com/fmtlib/fmt/issues/480) and + [#491](https://github.com/fmtlib/fmt/issues/491). + +- Fixed handling of wide strings in `fmt::StringWriter`. + +- Improved compiler error messages + ([#357](https://github.com/fmtlib/fmt/issues/357)). + +- Fixed various warnings and issues with various compilers + ([#494](https://github.com/fmtlib/fmt/pull/494), + [#499](https://github.com/fmtlib/fmt/pull/499), + [#483](https://github.com/fmtlib/fmt/pull/483), + [#485](https://github.com/fmtlib/fmt/pull/485), + [#482](https://github.com/fmtlib/fmt/pull/482), + [#475](https://github.com/fmtlib/fmt/pull/475), + [#473](https://github.com/fmtlib/fmt/pull/473) and + [#414](https://github.com/fmtlib/fmt/pull/414)). Thanks + [\@chronoxor](https://github.com/chronoxor), + [\@zhaohuaxishi](https://github.com/zhaohuaxishi), [\@pkestene + (Pierre Kestener)](https://github.com/pkestene), [\@dschmidt + (Dominik Schmidt)](https://github.com/dschmidt) and [\@0x414c + (Alexey Gorishny)](https://github.com/0x414c) . + +- Improved CMake: targets are now namespaced + ([#511](https://github.com/fmtlib/fmt/pull/511) and + [#513](https://github.com/fmtlib/fmt/pull/513)), supported + header-only `printf.h` + ([#354](https://github.com/fmtlib/fmt/pull/354)), fixed issue with + minimal supported library subset + ([#418](https://github.com/fmtlib/fmt/issues/418), + [#419](https://github.com/fmtlib/fmt/pull/419) and + [#420](https://github.com/fmtlib/fmt/pull/420)). Thanks + [\@bjoernthiel (Bjoern Thiel)](https://github.com/bjoernthiel), + [\@niosHD (Mario Werner)](https://github.com/niosHD), + [\@LogicalKnight (Sean LK)](https://github.com/LogicalKnight) and + [\@alabuzhev (Alex Alabuzhev)](https://github.com/alabuzhev). + +- Improved documentation. Thanks to [\@pwm1234 + (Phil)](https://github.com/pwm1234) for + [#393](https://github.com/fmtlib/fmt/pull/393). + +# 3.0.2 - 2017-06-14 + +- Added `FMT_VERSION` macro + ([#411](https://github.com/fmtlib/fmt/issues/411)). +- Used `FMT_NULL` instead of literal `0` + ([#409](https://github.com/fmtlib/fmt/pull/409)). Thanks + [\@alabuzhev (Alex Alabuzhev)](https://github.com/alabuzhev). +- Added extern templates for `format_float` + ([#413](https://github.com/fmtlib/fmt/issues/413)). +- Fixed implicit conversion issue + ([#507](https://github.com/fmtlib/fmt/issues/507)). +- Fixed signbit detection + ([#423](https://github.com/fmtlib/fmt/issues/423)). +- Fixed naming collision + ([#425](https://github.com/fmtlib/fmt/issues/425)). +- Fixed missing intrinsic for C++/CLI + ([#457](https://github.com/fmtlib/fmt/pull/457)). Thanks [\@calumr + (Calum Robinson)](https://github.com/calumr) +- Fixed Android detection + ([#458](https://github.com/fmtlib/fmt/pull/458)). Thanks [\@Gachapen + (Magnus Bjerke Vik)](https://github.com/Gachapen). +- Use lean `windows.h` if not in header-only mode + ([#503](https://github.com/fmtlib/fmt/pull/503)). Thanks + [\@Quentin01 (Quentin Buathier)](https://github.com/Quentin01). +- Fixed issue with CMake exporting C++11 flag + ([#445](https://github.com/fmtlib/fmt/pull/455)). Thanks [\@EricWF + (Eric)](https://github.com/EricWF). +- Fixed issue with nvcc and MSVC compiler bug and MinGW + ([#505](https://github.com/fmtlib/fmt/issues/505)). +- Fixed DLL issues ([#469](https://github.com/fmtlib/fmt/pull/469) and + [#502](https://github.com/fmtlib/fmt/pull/502)). Thanks + [\@richardeakin (Richard Eakin)](https://github.com/richardeakin) + and [\@AndreasSchoenle (Andreas + Schönle)](https://github.com/AndreasSchoenle). +- Fixed test compilation under FreeBSD + ([#433](https://github.com/fmtlib/fmt/issues/433)). +- Fixed various warnings + ([#403](https://github.com/fmtlib/fmt/pull/403), + [#410](https://github.com/fmtlib/fmt/pull/410) and + [#510](https://github.com/fmtlib/fmt/pull/510)). Thanks + [\@Lecetem](https://github.com/Lectem), [\@chenhayat (Chen + Hayat)](https://github.com/chenhayat) and + [\@trozen](https://github.com/trozen). +- Worked around a broken `__builtin_clz` in clang with MS codegen + ([#519](https://github.com/fmtlib/fmt/issues/519)). +- Removed redundant include + ([#479](https://github.com/fmtlib/fmt/issues/479)). +- Fixed documentation issues. + +# 3.0.1 - 2016-11-01 + +- Fixed handling of thousands separator + ([#353](https://github.com/fmtlib/fmt/issues/353)). +- Fixed handling of `unsigned char` strings + ([#373](https://github.com/fmtlib/fmt/issues/373)). +- Corrected buffer growth when formatting time + ([#367](https://github.com/fmtlib/fmt/issues/367)). +- Removed warnings under MSVC and clang + ([#318](https://github.com/fmtlib/fmt/issues/318), + [#250](https://github.com/fmtlib/fmt/issues/250), also merged + [#385](https://github.com/fmtlib/fmt/pull/385) and + [#361](https://github.com/fmtlib/fmt/pull/361)). Thanks [\@jcelerier + (Jean-Michaël Celerier)](https://github.com/jcelerier) and + [\@nmoehrle (Nils Moehrle)](https://github.com/nmoehrle). +- Fixed compilation issues under Android + ([#327](https://github.com/fmtlib/fmt/pull/327), + [#345](https://github.com/fmtlib/fmt/issues/345) and + [#381](https://github.com/fmtlib/fmt/pull/381)), FreeBSD + ([#358](https://github.com/fmtlib/fmt/pull/358)), Cygwin + ([#388](https://github.com/fmtlib/fmt/issues/388)), MinGW + ([#355](https://github.com/fmtlib/fmt/issues/355)) as well as other + issues ([#350](https://github.com/fmtlib/fmt/issues/350), + [#366](https://github.com/fmtlib/fmt/issues/355), + [#348](https://github.com/fmtlib/fmt/pull/348), + [#402](https://github.com/fmtlib/fmt/pull/402), + [#405](https://github.com/fmtlib/fmt/pull/405)). Thanks to + [\@dpantele (Dmitry)](https://github.com/dpantele), [\@hghwng (Hugh + Wang)](https://github.com/hghwng), [\@arvedarved (Tilman + Keskinöz)](https://github.com/arvedarved), [\@LogicalKnight + (Sean)](https://github.com/LogicalKnight) and [\@JanHellwig (Jan + Hellwig)](https://github.com/janhellwig). +- Fixed some documentation issues and extended specification + ([#320](https://github.com/fmtlib/fmt/issues/320), + [#333](https://github.com/fmtlib/fmt/pull/333), + [#347](https://github.com/fmtlib/fmt/issues/347), + [#362](https://github.com/fmtlib/fmt/pull/362)). Thanks to + [\@smellman (Taro Matsuzawa aka. btm)](https://github.com/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 + ([#307](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 . + +- 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) + ([#283](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) + ([#235](https://github.com/fmtlib/fmt/issues/235)). + +- Added support for locale-specific integer formatting with the `n` + specifier ([#305](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 + ([#265](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 + ([#255](https://github.com/fmtlib/fmt/issues/255)): + + ```c++ + fmt::printf("%d", std::numeric_limits::max()); + ``` + + Note that it would be an undefined behavior in `std::printf`. + +- Added initial support for custom formatters + ([#231](https://github.com/fmtlib/fmt/issues/231)). + +- Fixed detection of user-defined literal support on Intel C++ + compiler ([#311](https://github.com/fmtlib/fmt/issues/311), + [#312](https://github.com/fmtlib/fmt/pull/312)). Thanks to + [\@dean0x7d (Dean Moldovan)](https://github.com/dean0x7d) and + [\@speth (Ray Speth)](https://github.com/speth). + +- Reduced compile time + ([#243](https://github.com/fmtlib/fmt/pull/243), + [#249](https://github.com/fmtlib/fmt/pull/249), + [#317](https://github.com/fmtlib/fmt/issues/317)): + + ![image](https://cloud.githubusercontent.com/assets/4831417/11614060/%0Ab9e826d2-9c36-11e5-8666-d4131bf503ef.png) + + ![image](https://cloud.githubusercontent.com/assets/4831417/11614080/%0A6ac903cc-9c37-11e5-8165-26df6efae364.png) + + Thanks to [\@dean0x7d (Dean Moldovan)](https://github.com/dean0x7d). + +- Compile test fixes ([#313](https://github.com/fmtlib/fmt/pull/313)). + Thanks to [\@dean0x7d (Dean Moldovan)](https://github.com/dean0x7d). + +- Documentation fixes ([#239](https://github.com/fmtlib/fmt/pull/239), + [#248](https://github.com/fmtlib/fmt/issues/248), + [#252](https://github.com/fmtlib/fmt/issues/252), + [#258](https://github.com/fmtlib/fmt/pull/258), + [#260](https://github.com/fmtlib/fmt/issues/260), + [#301](https://github.com/fmtlib/fmt/issues/301), + [#309](https://github.com/fmtlib/fmt/pull/309)). Thanks to + [\@ReadmeCritic](https://github.com/ReadmeCritic) [\@Gachapen + (Magnus Bjerke Vik)](https://github.com/Gachapen) and [\@jwilk + (Jakub Wilk)](https://github.com/jwilk). + +- Fixed compiler and sanitizer warnings + ([#244](https://github.com/fmtlib/fmt/issues/244), + [#256](https://github.com/fmtlib/fmt/pull/256), + [#259](https://github.com/fmtlib/fmt/pull/259), + [#263](https://github.com/fmtlib/fmt/issues/263), + [#274](https://github.com/fmtlib/fmt/issues/274), + [#277](https://github.com/fmtlib/fmt/pull/277), + [#286](https://github.com/fmtlib/fmt/pull/286), + [#291](https://github.com/fmtlib/fmt/issues/291), + [#296](https://github.com/fmtlib/fmt/issues/296), + [#308](https://github.com/fmtlib/fmt/issues/308)) Thanks to + [\@mwinterb](https://github.com/mwinterb), [\@pweiskircher (Patrik + Weiskircher)](https://github.com/pweiskircher), + [\@Naios](https://github.com/Naios). + +- Improved compatibility with Windows Store apps + ([#280](https://github.com/fmtlib/fmt/issues/280), + [#285](https://github.com/fmtlib/fmt/pull/285)) Thanks to + [\@mwinterb](https://github.com/mwinterb). + +- Added tests of compatibility with older C++ standards + ([#273](https://github.com/fmtlib/fmt/pull/273)). Thanks to + [\@niosHD](https://github.com/niosHD). + +- Fixed Android build + ([#271](https://github.com/fmtlib/fmt/pull/271)). Thanks to + [\@newnon](https://github.com/newnon). + +- Changed `ArgMap` to be backed by a vector instead of a map. + ([#261](https://github.com/fmtlib/fmt/issues/261), + [#262](https://github.com/fmtlib/fmt/pull/262)). Thanks to + [\@mwinterb](https://github.com/mwinterb). + +- Added `fprintf` overload that writes to a `std::ostream` + ([#251](https://github.com/fmtlib/fmt/pull/251)). Thanks to + [nickhutchinson (Nicholas + Hutchinson)](https://github.com/nickhutchinson). + +- Export symbols when building a Windows DLL + ([#245](https://github.com/fmtlib/fmt/pull/245)). Thanks to [macdems + (Maciek Dems)](https://github.com/macdems). + +- Fixed compilation on Cygwin + ([#304](https://github.com/fmtlib/fmt/issues/304)). + +- Implemented a workaround for a bug in Apple LLVM version 4.2 of + clang ([#276](https://github.com/fmtlib/fmt/issues/276)). + +- Implemented a workaround for Google Test bug + [#705](https://github.com/google/googletest/issues/705) on gcc 6 + ([#268](https://github.com/fmtlib/fmt/issues/268)). Thanks to + [octoploid](https://github.com/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 + ([#299](https://github.com/fmtlib/fmt/pull/299)). Thanks to + [\@niosHD](https://github.com/niosHD). +- Documentation fixes + ([#252](https://github.com/fmtlib/fmt/issues/252)). + +# 2.1.0 - 2016-03-21 + +- Project layout and build system improvements + ([#267](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 to [\@niosHD](https://github.com/niosHD). + +# 2.0.1 - 2016-03-13 + +- Improved CMake find and package support + ([#264](https://github.com/fmtlib/fmt/issues/264)). Thanks to + [\@niosHD](https://github.com/niosHD). +- Fix compile error with Android NDK and mingw32 + ([#241](https://github.com/fmtlib/fmt/issues/241)). Thanks to + [\@Gachapen (Magnus Bjerke Vik)](https://github.com/Gachapen). +- Documentation fixes + ([#248](https://github.com/fmtlib/fmt/issues/248), + [#260](https://github.com/fmtlib/fmt/issues/260)). + +# 2.0.0 - 2015-12-01 + +## General + +- \[Breaking\] Named arguments + ([#169](https://github.com/fmtlib/fmt/pull/169), + [#173](https://github.com/fmtlib/fmt/pull/173), + [#174](https://github.com/fmtlib/fmt/pull/174)): + + ```c++ + fmt::print("The answer is {answer}.", fmt::arg("answer", 42)); + ``` + + Thanks to [\@jamboree](https://github.com/jamboree). + +- \[Experimental\] User-defined literals for format and named + arguments ([#204](https://github.com/fmtlib/fmt/pull/204), + [#206](https://github.com/fmtlib/fmt/pull/206), + [#207](https://github.com/fmtlib/fmt/pull/207)): + + ```c++ + using namespace fmt::literals; + fmt::print("The answer is {answer}.", "answer"_a=42); + ``` + + Thanks to [\@dean0x7d (Dean Moldovan)](https://github.com/dean0x7d). + +- \[Breaking\] Formatting of more than 16 arguments is now supported + when using variadic templates + ([#141](https://github.com/fmtlib/fmt/issues/141)). Thanks to + [\@Shauren](https://github.com/Shauren). + +- Runtime width specification + ([#168](https://github.com/fmtlib/fmt/pull/168)): + + ```c++ + fmt::format("{0:{1}}", 42, 5); // gives " 42" + ``` + + Thanks to [\@jamboree](https://github.com/jamboree). + +- \[Breaking\] Enums are now formatted with an overloaded + `std::ostream` insertion operator (`operator<<`) if available + ([#232](https://github.com/fmtlib/fmt/issues/232)). + +- \[Breaking\] Changed default `bool` format to textual, \"true\" or + \"false\" ([#170](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\" + ([#223](https://github.com/fmtlib/fmt/pull/223)): + + ```c++ + fmt::printf("%s", true); // prints "true" + ``` + + Thanks to [\@LarsGullik](https://github.com/LarsGullik). + +- \[Breaking\] `signed char` and `unsigned char` are now formatted as + integers by default + ([#217](https://github.com/fmtlib/fmt/pull/217)). + +- \[Breaking\] Pointers to C strings can now be formatted with the `p` + specifier ([#223](https://github.com/fmtlib/fmt/pull/223)): + + ```c++ + fmt::print("{:p}", "test"); // prints pointer value + ``` + + Thanks to [\@LarsGullik](https://github.com/LarsGullik). + +- \[Breaking\] `fmt::printf` and `fmt::sprintf` now print null + pointers as `(nil)` and null strings as `(null)` for consistency + with glibc ([#226](https://github.com/fmtlib/fmt/pull/226)). Thanks + to [\@LarsGullik](https://github.com/LarsGullik). + +- \[Breaking\] `fmt::(s)printf` now supports formatting of objects of + user-defined types that provide an overloaded `std::ostream` + insertion operator (`operator<<`) + ([#201](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 + ([#140](https://github.com/fmtlib/fmt/issues/140)). Thanks to + [\@polyvertex (Jean-Charles + Lefebvre)](https://github.com/polyvertex). + +- \[Breaking\] Improved compatibility between `BasicStringRef` and + [std::experimental::basic_string_view](http://en.cppreference.com/w/cpp/experimental/basic_string_view) + ([#100](https://github.com/fmtlib/fmt/issues/100), + [#159](https://github.com/fmtlib/fmt/issues/159), + [#183](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 + ([#185](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 ([#197](https://github.com/fmtlib/fmt/issues/197), + [#198](https://github.com/fmtlib/fmt/issues/198), + [#200](https://github.com/fmtlib/fmt/issues/200)). Thanks to + [\@maddinat0r (Alex Martin)](https://github.com/maddinat0r). + +- `noexcept` is now used when compiling with MSVC2015 + ([#215](https://github.com/fmtlib/fmt/pull/215)). Thanks to + [\@dmkrepo (Dmitriy)](https://github.com/dmkrepo). + +- Added an option to disable use of `windows.h` when + `FMT_USE_WINDOWS_H` is defined as 0 before including `format.h` + ([#171](https://github.com/fmtlib/fmt/issues/171)). Thanks to + [\@alfps (Alf P. Steinbach)](https://github.com/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 ([#152](https://github.com/fmtlib/fmt/issues/152), + [#153](https://github.com/fmtlib/fmt/pull/153), + [#154](https://github.com/fmtlib/fmt/pull/154)). Thanks to + [\@DevO2012](https://github.com/DevO2012). + +- Improved support for custom character types + ([#171](https://github.com/fmtlib/fmt/issues/171)). Thanks to + [\@alfps (Alf P. Steinbach)](https://github.com/alfps). + +- Added an option to disable use of IOStreams when `FMT_USE_IOSTREAMS` + is defined as 0 before including `format.h` + ([#205](https://github.com/fmtlib/fmt/issues/205), + [#208](https://github.com/fmtlib/fmt/pull/208)). Thanks to + [\@JodiTheTigger](https://github.com/JodiTheTigger). + +- Improved detection of `isnan`, `isinf` and `signbit`. + +## Optimization + +- Made formatting of user-defined types more efficient with a custom + stream buffer ([#92](https://github.com/fmtlib/fmt/issues/92), + [#230](https://github.com/fmtlib/fmt/pull/230)). Thanks to + [\@NotImplemented](https://github.com/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 + ([#186](https://github.com/fmtlib/fmt/issues/186)). +- \[Breaking\] Reduced [compiled code + size](https://github.com/fmtlib/fmt#compile-time-and-code-bloat) + ([#143](https://github.com/fmtlib/fmt/issues/143), + [#149](https://github.com/fmtlib/fmt/pull/149)). + +## Distribution + +- \[Breaking\] Headers are now installed in + `${CMAKE_INSTALL_PREFIX}/include/cppformat` + ([#178](https://github.com/fmtlib/fmt/issues/178)). Thanks to + [\@jackyf (Eugene V. Lyubimkin)](https://github.com/jackyf). + +- \[Breaking\] Changed the library name from `format` to `cppformat` + for consistency with the project name and to avoid potential + conflicts ([#178](https://github.com/fmtlib/fmt/issues/178)). Thanks + to [\@jackyf (Eugene V. Lyubimkin)](https://github.com/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 ([#155](https://github.com/fmtlib/fmt/issues/155)): + + $ sudo apt-get install libcppformat1-dev + + Thanks to [\@jackyf (Eugene V. + Lyubimkin)](https://github.com/jackyf). + +- [Packages for Fedora and + RHEL](https://admin.fedoraproject.org/pkgdb/package/cppformat/) are + now available. Thanks to Dave Johansen. + +- C++ Format can now be installed via [Homebrew](http://brew.sh/) on + OS X ([#157](https://github.com/fmtlib/fmt/issues/157)): + + $ brew install cppformat + + Thanks to [\@ortho](https://github.com/ortho), Anatoliy Bulukin. + +## Documentation + +- Migrated from ReadTheDocs to GitHub Pages for better responsiveness + and reliability ([#128](https://github.com/fmtlib/fmt/issues/128)). + New documentation address is . +- Added [Building the + documentation](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. ([#189](https://github.com/fmtlib/fmt/pull/189), + [#209](https://github.com/fmtlib/fmt/issues/209)). Thanks to + [\@JodiTheTigger](https://github.com/JodiTheTigger) and + [\@xentec](https://github.com/xentec). +- Documentation fixes and improvements + ([#36](https://github.com/fmtlib/fmt/issues/36), + [#75](https://github.com/fmtlib/fmt/issues/75), + [#125](https://github.com/fmtlib/fmt/issues/125), + [#160](https://github.com/fmtlib/fmt/pull/160), + [#161](https://github.com/fmtlib/fmt/pull/161), + [#162](https://github.com/fmtlib/fmt/issues/162), + [#165](https://github.com/fmtlib/fmt/issues/165), + [#210](https://github.com/fmtlib/fmt/issues/210)). Thanks to + [\@syohex (Syohei YOSHIDA)](https://github.com/syohex) and bug + reporters. +- Fixed out-of-tree documentation build + ([#177](https://github.com/fmtlib/fmt/issues/177)). Thanks to + [\@jackyf (Eugene V. Lyubimkin)](https://github.com/jackyf). + +## Fixes + +- Fixed `initializer_list` detection + ([#136](https://github.com/fmtlib/fmt/issues/136)). Thanks to + [\@Gachapen (Magnus Bjerke Vik)](https://github.com/Gachapen). + +- \[Breaking\] Fixed formatting of enums with numeric format + specifiers in `fmt::(s)printf` + ([#131](https://github.com/fmtlib/fmt/issues/131), + [#139](https://github.com/fmtlib/fmt/issues/139)): + + ```c++ + enum { ANSWER = 42 }; + fmt::printf("%d", ANSWER); + ``` + + Thanks to [\@Naios](https://github.com/Naios). + +- Improved compatibility with old versions of MinGW + ([#129](https://github.com/fmtlib/fmt/issues/129), + [#130](https://github.com/fmtlib/fmt/pull/130), + [#132](https://github.com/fmtlib/fmt/issues/132)). Thanks to + [\@cstamford (Christopher Stamford)](https://github.com/cstamford). + +- Fixed a compile error on MSVC with disabled exceptions + ([#144](https://github.com/fmtlib/fmt/issues/144)). + +- Added a workaround for broken implementation of variadic templates + in MSVC2012 ([#148](https://github.com/fmtlib/fmt/issues/148)). + +- Placed the anonymous namespace within `fmt` namespace for the + header-only configuration + ([#171](https://github.com/fmtlib/fmt/issues/171)). Thanks to + [\@alfps (Alf P. Steinbach)](https://github.com/alfps). + +- Fixed issues reported by Coverity Scan + ([#187](https://github.com/fmtlib/fmt/issues/187), + [#192](https://github.com/fmtlib/fmt/issues/192)). + +- Implemented a workaround for a name lookup bug in MSVC2010 + ([#188](https://github.com/fmtlib/fmt/issues/188)). + +- Fixed compiler warnings + ([#95](https://github.com/fmtlib/fmt/issues/95), + [#96](https://github.com/fmtlib/fmt/issues/96), + [#114](https://github.com/fmtlib/fmt/pull/114), + [#135](https://github.com/fmtlib/fmt/issues/135), + [#142](https://github.com/fmtlib/fmt/issues/142), + [#145](https://github.com/fmtlib/fmt/issues/145), + [#146](https://github.com/fmtlib/fmt/issues/146), + [#158](https://github.com/fmtlib/fmt/issues/158), + [#163](https://github.com/fmtlib/fmt/issues/163), + [#175](https://github.com/fmtlib/fmt/issues/175), + [#190](https://github.com/fmtlib/fmt/issues/190), + [#191](https://github.com/fmtlib/fmt/pull/191), + [#194](https://github.com/fmtlib/fmt/issues/194), + [#196](https://github.com/fmtlib/fmt/pull/196), + [#216](https://github.com/fmtlib/fmt/issues/216), + [#218](https://github.com/fmtlib/fmt/pull/218), + [#220](https://github.com/fmtlib/fmt/pull/220), + [#229](https://github.com/fmtlib/fmt/pull/229), + [#233](https://github.com/fmtlib/fmt/issues/233), + [#234](https://github.com/fmtlib/fmt/issues/234), + [#236](https://github.com/fmtlib/fmt/pull/236), + [#281](https://github.com/fmtlib/fmt/issues/281), + [#289](https://github.com/fmtlib/fmt/issues/289)). Thanks to + [\@seanmiddleditch (Sean + Middleditch)](https://github.com/seanmiddleditch), [\@dixlorenz (Dix + Lorenz)](https://github.com/dixlorenz), [\@CarterLi + (李通洲)](https://github.com/CarterLi), + [\@Naios](https://github.com/Naios), [\@fmatthew5876 (Matthew + Fioravante)](https://github.com/fmatthew5876), [\@LevskiWeng (Levski + Weng)](https://github.com/LevskiWeng), + [\@rpopescu](https://github.com/rpopescu), [\@gabime (Gabi + Melman)](https://github.com/gabime), [\@cubicool (Jeremy + Moles)](https://github.com/cubicool), [\@jkflying (Julian + Kent)](https://github.com/jkflying), [\@LogicalKnight (Sean + L)](https://github.com/LogicalKnight), [\@inguin (Ingo van + Lil)](https://github.com/inguin) and [\@Jopie64 + (Johan)](https://github.com/Jopie64). + +- Fixed portability issues (mostly causing test failures) on ARM, + ppc64, ppc64le, s390x and SunOS 5.11 i386 + ([#138](https://github.com/fmtlib/fmt/issues/138), + [#179](https://github.com/fmtlib/fmt/issues/179), + [#180](https://github.com/fmtlib/fmt/issues/180), + [#202](https://github.com/fmtlib/fmt/issues/202), + [#225](https://github.com/fmtlib/fmt/issues/225), [Red Hat Bugzilla + Bug 1260297](https://bugzilla.redhat.com/show_bug.cgi?id=1260297)). + Thanks to [\@Naios](https://github.com/Naios), [\@jackyf (Eugene V. + Lyubimkin)](https://github.com/jackyf) and Dave Johansen. + +- Fixed a name conflict with macro `free` defined in `crtdbg.h` when + `_CRTDBG_MAP_ALLOC` is set + ([#211](https://github.com/fmtlib/fmt/issues/211)). + +- Fixed shared library build on OS X + ([#212](https://github.com/fmtlib/fmt/pull/212)). Thanks to + [\@dean0x7d (Dean Moldovan)](https://github.com/dean0x7d). + +- Fixed an overload conflict on MSVC when `/Zc:wchar_t-` option is + specified ([#214](https://github.com/fmtlib/fmt/pull/214)). Thanks + to [\@slavanap (Vyacheslav + Napadovsky)](https://github.com/slavanap). + +- Improved compatibility with MSVC 2008 + ([#236](https://github.com/fmtlib/fmt/pull/236)). Thanks to + [\@Jopie64 (Johan)](https://github.com/Jopie64). + +- Improved compatibility with bcc32 + ([#227](https://github.com/fmtlib/fmt/issues/227)). + +- Fixed `static_assert` detection on Clang + ([#228](https://github.com/fmtlib/fmt/pull/228)). Thanks to + [\@dean0x7d (Dean Moldovan)](https://github.com/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 + ([#105](https://github.com/fmtlib/fmt/issues/105) and + [#122](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 ([#115](https://github.com/fmtlib/fmt/pull/115), + [#116](https://github.com/fmtlib/fmt/pull/116), + [#118](https://github.com/fmtlib/fmt/pull/118) and + [#121](https://github.com/fmtlib/fmt/pull/121)). Previously these + optimizations where only used on GCC and Clang. Thanks to + [\@CarterLi](https://github.com/CarterLi) and + [\@objectx](https://github.com/objectx). + +- CMake install target + ([#119](https://github.com/fmtlib/fmt/pull/119)). Thanks to + [\@TrentHouliston](https://github.com/TrentHouliston). + + You can now install C++ Format with `make install` command. + +- Improved [Biicode](http://www.biicode.com/) support + ([#98](https://github.com/fmtlib/fmt/pull/98) and + [#104](https://github.com/fmtlib/fmt/pull/104)). Thanks to + [\@MariadeAnton](https://github.com/MariadeAnton) and + [\@franramirez688](https://github.com/franramirez688). + +- Improved support for building with [Android + NDK](https://developer.android.com/tools/sdk/ndk/index.html) + ([#107](https://github.com/fmtlib/fmt/pull/107)). Thanks to + [\@newnon](https://github.com/newnon). + + The + [android-ndk-example](https://github.com/fmtlib/android-ndk-example) + repository provides and example of using C++ Format with Android + NDK: + + ![image](https://raw.githubusercontent.com/fmtlib/android-ndk-example/%0Amaster/screenshot.png) + +- Improved documentation of `SystemError` and `WindowsError` + ([#54](https://github.com/fmtlib/fmt/issues/54)). + +- Various code improvements + ([#110](https://github.com/fmtlib/fmt/pull/110), + [#111](https://github.com/fmtlib/fmt/pull/111) + [#112](https://github.com/fmtlib/fmt/pull/112)). Thanks to + [\@CarterLi](https://github.com/CarterLi). + +- Improved compile-time errors when formatting wide into narrow + strings ([#117](https://github.com/fmtlib/fmt/issues/117)). + +- Fixed `BasicWriter::write` without formatting arguments when C++11 + support is disabled + ([#109](https://github.com/fmtlib/fmt/issues/109)). + +- Fixed header-only build on OS X with GCC 4.9 + ([#124](https://github.com/fmtlib/fmt/issues/124)). + +- Fixed packaging issues + ([#94](https://github.com/fmtlib/fmt/issues/94)). + +- Added + [changelog](https://github.com/fmtlib/fmt/blob/master/ChangeLog.rst) + ([#103](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 + ([#79](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` ([#86](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 + ([#89](https://github.com/fmtlib/fmt/issues/89)). + +- Allow precision specifier for non-float arguments + ([#90](https://github.com/fmtlib/fmt/issues/90)): + + ```c++ + fmt::print("{:.3}\n", "Carpet"); // prints "Car" + ``` + +- Fix build on Android NDK + ([#93](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 + ([#69](https://github.com/fmtlib/fmt/issues/69)) + +- Formatting functions now accept [signed char]{.title-ref} and + [unsigned char]{.title-ref} strings as arguments + ([#73](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 + [#55](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 + [#50](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 \'\\': 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 diff --git a/ChangeLog.rst b/ChangeLog.rst deleted file mode 100644 index 62fc8a8b..00000000 --- a/ChangeLog.rst +++ /dev/null @@ -1,5922 +0,0 @@ -10.1.1 - 2023-08-28 -------------------- - -* Added formatters for ``std::atomic`` and ``atomic_flag`` - (`#3574 `_, - `#3594 `_). - Thanks `@wangzw (Zhanwei Wang) `_ and - `@AlexGuteniev (Alex Guteniev) `_. - -* Fixed an error about partial specialization of ``formatter`` - after instantiation when compiled with gcc and C++20 - (`#3584 `_). - -* Fixed compilation as a C++20 module with gcc and clang - (`#3587 `_, - `#3597 `_, - `#3605 `_). Thanks - `@MathewBensonCode (Mathew Benson) `_. - -* Made ``fmt::to_string`` work with types that have ``format_as`` overloads - (`#3575 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Made ``formatted_size`` work with integral format specifiers at compile time - (`#3591 `_). - Thanks `@elbeno (Ben Deane) `_. - -* Fixed a warning about the ``no_unique_address`` attribute on clang-cl - (`#3599 `_). - Thanks `@lukester1975 `_. - -* Improved compatibility with the legacy GBK encoding - (`#3598 `_, - `#3599 `_). - Thanks `@YuHuanTin `_. - -* Added OpenSSF Scorecard analysis - (`#3530 `_, - `#3571 `_). - Thanks `@joycebrum (Joyce) `_. - -* Updated CI dependencies - (`#3591 `_, - `#3592 `_, - `#3593 `_, - `#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 (`#3133 `_, - `#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`` - (`#3485 `_). - Thanks `@Minty-Meeo `_. - -* Added formatters for proxy references to elements of ``std::vector`` and - ``std::bitset`` (`#3567 `_, - `#3570 `_). - For example (`godbolt `__): - - .. code:: c++ - - #include - #include - - int main() { - auto v = std::vector{true}; - fmt::print("{}", v[0]); - } - - Thanks `@phprus (Vladislav Shchapov) `_ and - `@felix642 (Félix-Antoine Constantin) `_. - -* Fixed an ambiguous formatter specialization for containers that look like - container adaptors such as ``boost::flat_set`` - (`#3556 `_, - `#3561 `_). - Thanks `@5chmidti `_. - -* Fixed compilation when formatting durations not convertible from - ``std::chrono::seconds`` (`#3430 `_). - Thanks `@patlkli (Patrick Geltinger) `_. - -* Made the ``formatter`` specialization for ``char*`` const-correct - (`#3432 `_). - Thanks `@timsong-cpp `_. - -* Made ``{}`` and ``{:}`` handled consistently during compile-time checks - (`#3526 `_). - -* Disallowed passing temporaries to ``make_format_args`` to improve API safety - by preventing dangling references. - -* Improved the compile-time error for unformattable types - (`#3478 `_). - Thanks `@BRevzin (Barry Revzin) `_. - -* Improved the floating-point formatter - (`#3448 `_, - `#3450 `_). - Thanks `@florimond-collette (Florimond Collette) - `_. - -* Fixed handling of precision for ``long double`` larger than 64 bits. - (`#3539 `_, - `#3564 `_). - -* Made floating-point and chrono tests less platform-dependent - (`#3337 `_, - `#3433 `_, - `#3434 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* 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 - (`#3551 `_). - Thanks `@mjerabek (Martin Jeřábek) `_. - -* Made ``FMT_THROW`` assert even if assertions are disabled when compiling with - exceptions disabled (`#3418 `_, - `#3439 `_). - Thanks `@BRevzin (Barry Revzin) `_. - -* Made ``format_as`` and ``std::filesystem::path`` formatter work with exotic - code unit types. - (`#3457 `_, - `#3476 `_). - Thanks `@gix (Nico Rieck) `_, - `@hmbj (Hans-Martin B. Jensen) `_. - -* 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 - (`#3468 `_). - Thanks `@danakj (Dana Jansens) `_. - -* Improved compatibility with VxWorks7 - (`#3467 `_). - Thanks `@wenshan1 (Bin Lan) `_. - -* Improved documentation - (`#3174 `_, - `#3423 `_, - `#3454 `_, - `#3458 `_, - `#3461 `_, - `#3487 `_, - `#3515 `_). - Thanks `@zencatalyst (Kasra Hashemi) `_, - `@rlalik `_, - `@mikecrowe (Mike Crowe) `_. - -* Improved build and CI configurations - (`#3449 `_, - `#3451 `_, - `#3452 `_, - `#3453 `_, - `#3459 `_, - `#3481 `_, - `#3486 `_, - `#3489 `_, - `#3496 `_, - `#3517 `_, - `#3523 `_, - `#3563 `_). - Thanks `@joycebrum (Joyce) `_, - `@glebm (Gleb Mazovetskiy) `_, - `@phprus (Vladislav Shchapov) `_, - `@petrmanek (Petr Mánek) `_, - `@setoye (Alta) `_, - `@abouvier (Alexandre Bouvier) `_. - -* Fixed various warnings and compilation issues - (`#3408 `_, - `#3424 `_, - `#3444 `_, - `#3446 `_, - `#3475 `_, - `#3482 `_, - `#3492 `_, - `#3493 `_, - `#3508 `_, - `#3509 `_, - `#3533 `_, - `#3542 `_, - `#3543 `_, - `#3540 `_, - `#3544 `_, - `#3548 `_, - `#3549 `_, - `#3550 `_, - `#3552 `_). - Thanks `@adesitter (Arnaud Desitter) `_, - `@hmbj (Hans-Martin B. Jensen) `_, - `@Minty-Meeo `_, - `@phprus (Vladislav Shchapov) `_, - `@TobiSchluter (Tobias Schlüter) `_, - `@kieranclancy (Kieran Clancy) `_, - `@alexeedm (Dmitry Alexeev) `_, - `@jurihock (Jürgen Hock) `_, - `@Ozomahtli `_, - `@razaqq `_. - -10.0.0 - 2023-05-09 -------------------- - -* Replaced Grisu with a new floating-point formatting algorithm for given - precision (`#3262 `_, - `#2750 `_, - `#3269 `_, - `#3276 `_). - The new algorithm is based on Dragonbox already used for the - shortest representation and gives substantial performance improvement: - - .. image:: https://user-images.githubusercontent.com/33922675/ - 211956670-84891a09-6867-47d9-82fc-3230da7abe0f.png - - * Red: new algorithm - * Green: new algorithm with ``FMT_USE_FULL_CACHE_DRAGONBOX`` defined to 1 - * Blue: old algorithm - - Thanks `@jk-jeon (Junekey Jeon) `_. - -* Replaced ``snprintf``-based hex float formatter with an internal - implementation (`#3179 `_, - `#3203 `_). - This removes the last usage of ``s(n)printf`` in {fmt}. - Thanks `@phprus (Vladislav Shchapov) `_. - -* Fixed alignment of floating-point numbers with localization - (`#3263 `_, - `#3272 `_). - Thanks `@ShawnZhong (Shawn Zhong) `_. - -* Made handling of ``#`` consistent with ``std::format``. - -* Improved C++20 module support - (`#3134 `_, - `#3254 `_, - `#3386 `_, - `#3387 `_, - `#3388 `_, - `#3392 `_, - `#3397 `_, - `#3399 `_, - `#3400 `_). - Thanks `@laitingsheng (Tinson Lai) `_, - `@Orvid (Orvid King) `_, - `@DanielaE (Daniela Engert) `_. - Switched to the `modules CMake library `_ - 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 `__): - - .. code:: c++ - - #include - - 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 - (`#3237 `_, - `#3260 `_, - `#3275 `_). - For example (`godbolt `__): - - .. code:: c++ - - #include - - int main() { - // prints " 2023" - fmt::print("{:>8%Y}\n", std::chrono::system_clock::now()); - } - - Thanks `@ShawnZhong (Shawn Zhong) `_. - -* Implemented formatting of subseconds - (`#2207 `_, - `#3117 `_, - `#3115 `_, - `#3143 `_, - `#3144 `_, - `#3349 `_). - For example (`godbolt `__): - - .. code:: c++ - - #include - - int main() { - // prints 01.234567 - fmt::print("{:%S}\n", std::chrono::microseconds(1234567)); - } - - Thanks `@patrickroocks (Patrick Roocks) `_ - `@phprus (Vladislav Shchapov) `_, - `@BRevzin (Barry Revzin) `_. - -* Added precision support to ``%S`` - (`#3148 `_). - Thanks `@SappyJoy (Stepan Ponomaryov) `_ - -* Added support for ``std::utc_time`` - (`#3098 `_, - `#3110 `_). - Thanks `@patrickroocks (Patrick Roocks) `_. - -* Switched formatting of ``std::chrono::system_clock`` from local time to UTC - for compatibility with the standard - (`#3199 `_, - `#3230 `_). - Thanks `@ned14 (Niall Douglas) `_. - -* Added support for ``%Ez`` and ``%Oz`` to chrono formatters. - (`#3220 `_, - `#3222 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Improved validation of format specifiers for ``std::chrono::duration`` - (`#3219 `_, - `#3232 `_). - Thanks `@ShawnZhong (Shawn Zhong) `_. - -* Fixed formatting of time points before the epoch - (`#3117 `_, - `#3261 `_). - For example (`godbolt `__): - - .. code:: c++ - - #include - - int main() { - auto t = std::chrono::system_clock::from_time_t(0) - - std::chrono::milliseconds(250); - fmt::print("{:%S}\n", t); // prints 59.750000000 - } - - Thanks `@ShawnZhong (Shawn Zhong) `_. - -* Experimental: implemented glibc extension for padding seconds, minutes and - hours (`#2959 `_, - `#3271 `_). - Thanks `@ShawnZhong (Shawn Zhong) `_. - -* Added a formatter for ``std::exception`` - (`#2977 `_, - `#3012 `_, - `#3062 `_, - `#3076 `_, - `#3119 `_). - For example (`godbolt `__): - - .. code:: c++ - - #include - #include - - int main() { - try { - std::vector().at(0); - } catch(const std::exception& e) { - fmt::print("{}", e); - } - } - - prints:: - - vector::_M_range_check: __n (which is 0) >= this->size() (which is 0) - - on libstdc++. - Thanks `@zach2good (Zach Toogood) `_ and - `@phprus (Vladislav Shchapov) `_. - -* Moved ``std::error_code`` formatter from ``fmt/os.h`` to ``fmt/std.h``. - (`#3125 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Added formatters for standard container adapters: ``std::priority_queue``, - ``std::queue`` and ``std::stack`` - (`#3215 `_, - `#3279 `_). - For example (`godbolt `__): - - .. code:: c++ - - #include - #include - #include - - int main() { - auto s = std::stack>(); - for (auto b: {true, false, true}) s.push(b); - fmt::print("{}\n", s); // prints [true, false, true] - } - - Thanks `@ShawnZhong (Shawn Zhong) `_. - -* Added a formatter for ``std::optional`` to ``fmt/std.h``. - Thanks `@tom-huntington `_. - -* Fixed formatting of valueless by exception variants - (`#3347 `_). - Thanks `@TheOmegaCarrot `_. - -* Made ``fmt::ptr`` accept ``unique_ptr`` with a custom deleter - (`#3177 `_). - Thanks `@hmbj (Hans-Martin B. Jensen) `_. - -* Fixed formatting of noncopyable ranges and nested ranges of chars - (`#3158 `_ - `#3286 `_, - `#3290 `_). - Thanks `@BRevzin (Barry Revzin) `_. - -* Fixed issues with formatting of paths and ranges of paths - (`#3319 `_, - `#3321 `_ - `#3322 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Improved handling of invalid Unicode in paths. - -* Enabled compile-time checks on Apple clang 14 and later - (`#3331 `_). - Thanks `@cloyce (Cloyce D. Spradling) `_. - -* Improved compile-time checks of named arguments - (`#3105 `_, - `#3214 `_). - Thanks `@rbrich (Radek Brich) `_. - -* Fixed formatting when both alignment and ``0`` are given - (`#3236 `_, - `#3248 `_). - Thanks `@ShawnZhong (Shawn Zhong) `_. - -* Improved Unicode support in the experimental file API on Windows - (`#3234 `_, - `#3293 `_). - Thanks `@Fros1er (Froster) `_. - -* Unified UTF transcoding - (`#3416 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Added support for UTF-8 digit separators via an experimental locale facet - (`#1861 `_). - For example (`godbolt `__): - - .. code:: c++ - - auto loc = std::locale( - std::locale(), new fmt::format_facet("’")); - auto s = fmt::format(loc, "{:L}", 1000); - - where ``’`` is U+2019 used as a digit separator in the de_CH locale. - -* Added an overload of ``formatted_size`` that takes a locale - (`#3084 `_, - `#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 - (`#3241 `_, - `#3244 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Added ``starts_with`` to the fallback ``string_view`` implementation - (`#3080 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Added ``fmt::basic_format_string::get()`` for compatibility with - ``basic_format_string`` (`#3111 `_). - Thanks `@huangqinjin `_. - -* Added ``println`` for compatibility with C++23 - (`#3267 `_). - Thanks `@ShawnZhong (Shawn Zhong) `_. - -* Renamed the ``FMT_EXPORT`` macro for shared library usage to - ``FMT_LIB_EXPORT``. - -* Improved documentation - (`#3108 `_, - `#3169 `_, - `#3243 `_). - `#3404 `_). - Thanks `@Cleroth `_ and - `@Vertexwahn `_. - -* Improved build configuration and tests - (`#3118 `_, - `#3120 `_, - `#3188 `_, - `#3189 `_, - `#3198 `_, - `#3205 `_, - `#3207 `_, - `#3210 `_, - `#3240 `_, - `#3256 `_, - `#3264 `_, - `#3299 `_, - `#3302 `_, - `#3312 `_, - `#3317 `_, - `#3328 `_, - `#3333 `_, - `#3369 `_, - `#3373 `_, - `#3395 `_, - `#3406 `_, - `#3411 `_). - Thanks `@dimztimz (Dimitrij Mijoski) `_, - `@phprus (Vladislav Shchapov) `_, - `@DavidKorczynski `_, - `@ChrisThrasher (Chris Thrasher) `_, - `@FrancoisCarouge (François Carouge) `_, - `@kennyweiss (Kenny Weiss) `_, - `@luzpaz `_, - `@codeinred (Alecto Irene Perez) `_, - `@Mixaill (Mikhail Paulyshka) `_, - `@joycebrum (Joyce) `_, - `@kevinhwang (Kevin Hwang) `_, - `@Vertexwahn `_. - -* Fixed a regression in handling empty format specifiers after a colon (``{:}``) - (`#3086 `_). - Thanks `@oxidase (Michael Krasnyk) `_. - -* Worked around a broken implementation of ``std::is_constant_evaluated`` in - some versions of libstdc++ on clang - (`#3247 `_, - `#3281 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Fixed formatting of volatile variables - (`#3068 `_). - -* Fixed various warnings and compilation issues - (`#3057 `_, - `#3066 `_, - `#3072 `_, - `#3082 `_, - `#3091 `_, - `#3092 `_, - `#3093 `_, - `#3095 `_, - `#3096 `_, - `#3097 `_, - `#3128 `_, - `#3129 `_, - `#3137 `_, - `#3139 `_, - `#3140 `_, - `#3142 `_, - `#3149 `_, - `#3150 `_, - `#3154 `_, - `#3163 `_, - `#3178 `_, - `#3184 `_, - `#3196 `_, - `#3204 `_, - `#3206 `_, - `#3208 `_, - `#3213 `_, - `#3216 `_, - `#3224 `_, - `#3226 `_, - `#3228 `_, - `#3229 `_, - `#3259 `_, - `#3274 `_, - `#3287 `_, - `#3288 `_, - `#3292 `_, - `#3295 `_, - `#3296 `_, - `#3298 `_, - `#3325 `_, - `#3326 `_, - `#3334 `_, - `#3342 `_, - `#3343 `_, - `#3351 `_, - `#3352 `_, - `#3362 `_, - `#3365 `_, - `#3366 `_, - `#3374 `_, - `#3377 `_, - `#3378 `_, - `#3381 `_, - `#3398 `_, - `#3413 `_, - `#3415 `_). - Thanks `@phprus (Vladislav Shchapov) `_, - `@gsjaardema (Greg Sjaardema) `_, - `@NewbieOrange `_, - `@EngineLessCC (VivyaCC) `_, - `@asmaloney (Andy Maloney) `_, - `@HazardyKnusperkeks (Björn Schäpers) - `_, - `@sergiud (Sergiu Deitsch) `_, - `@Youw (Ihor Dutchak) `_, - `@thesmurph `_, - `@czudziakm (Maksymilian Czudziak) `_, - `@Roman-Koshelev `_, - `@chronoxor (Ivan Shynkarenka) `_, - `@ShawnZhong (Shawn Zhong) `_, - `@russelltg (Russell Greene) `_, - `@glebm (Gleb Mazovetskiy) `_, - `@tmartin-gh `_, - `@Zhaojun-Liu (June Liu) `_, - `@louiswins (Louis Wilson) `_, - `@mogemimi `_. - -9.1.0 - 2022-08-27 ------------------- - -* ``fmt::formatted_size`` now works at compile time - (`#3026 `_). For example - (`godbolt `__): - - .. code:: c++ - - #include - - int main() { - using namespace fmt::literals; - constexpr size_t n = fmt::formatted_size("{}"_cf, 42); - fmt::print("{}\n", n); // prints 2 - } - - Thanks `@marksantaniello (Mark Santaniello) - `_. - -* Fixed handling of invalid UTF-8 - (`#3038 `_, - `#3044 `_, - `#3056 `_). - Thanks `@phprus (Vladislav Shchapov) `_ and - `@skeeto (Christopher Wellons) `_. - -* Improved Unicode support in ``ostream`` overloads of ``print`` - (`#2994 `_, - `#3001 `_, - `#3025 `_). - Thanks `@dimztimz (Dimitrij Mijoski) `_. - -* Fixed handling of the sign specifier in localized formatting on systems with - 32-bit ``wchar_t`` (`#3041 `_). - -* Added support for wide streams to ``fmt::streamed`` - (`#2994 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Added the ``n`` specifier that disables the output of delimiters when - formatting ranges (`#2981 `_, - `#2983 `_). - For example (`godbolt `__): - - .. code:: c++ - - #include - #include - - int main() { - auto v = std::vector{1, 2, 3}; - fmt::print("{:n}\n", v); // prints 1, 2, 3 - } - - Thanks `@BRevzin (Barry Revzin) `_. - -* Worked around problematic ``std::string_view`` constructors introduced in - C++23 (`#3030 `_, - `#3050 `_). - Thanks `@strega-nil-ms (nicole mazzuca) `_. - -* Improve handling (exclusion) of recursive ranges - (`#2968 `_, - `#2974 `_). - Thanks `@Dani-Hub (Daniel Krügler) `_. - -* Improved error reporting in format string compilation - (`#3055 `_). - -* Improved the implementation of - `Dragonbox `_, the algorithm used for - the default floating-point formatting - (`#2984 `_). - Thanks `@jk-jeon (Junekey Jeon) `_. - -* Fixed issues with floating-point formatting on exotic platforms. - -* Improved the implementation of chrono formatting - (`#3010 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Improved documentation - (`#2966 `_, - `#3009 `_, - `#3020 `_, - `#3037 `_). - Thanks `@mwinterb `_, - `@jcelerier (Jean-Michaël Celerier) `_ - and `@remiburtin (Rémi Burtin) `_. - -* Improved build configuration - (`#2991 `_, - `#2995 `_, - `#3004 `_, - `#3007 `_, - `#3040 `_). - Thanks `@dimztimz (Dimitrij Mijoski) `_ and - `@hwhsu1231 (Haowei Hsu) `_. - -* Fixed various warnings and compilation issues - (`#2969 `_, - `#2971 `_, - `#2975 `_, - `#2982 `_, - `#2985 `_, - `#2988 `_, - `#2989 `_, - `#3000 `_, - `#3006 `_, - `#3014 `_, - `#3015 `_, - `#3021 `_, - `#3023 `_, - `#3024 `_, - `#3029 `_, - `#3043 `_, - `#3052 `_, - `#3053 `_, - `#3054 `_). - Thanks `@h-friederich (Hannes Friederich) `_, - `@dimztimz (Dimitrij Mijoski) `_, - `@olupton (Olli Lupton) `_, - `@bernhardmgruber (Bernhard Manfred Gruber) - `_, - `@phprus (Vladislav Shchapov) `_. - -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 `__): - - .. code:: c++ - - #include - #include - - consteval auto compile_time_dtoa(double value) -> std::array { - auto result = std::array(); - fmt::format_to(result.data(), FMT_COMPILE("{}"), value); - return result; - } - - constexpr auto answer = compile_time_dtoa(0.42); - - works with the default settings. - -* Improved the implementation of - `Dragonbox `_, the algorithm used for - the default floating-point formatting - (`#2713 `_, - `#2750 `_). - Thanks `@jk-jeon (Junekey 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 `__): - - .. code:: c++ - - #include - - struct date { - int year, month, day; - - friend std::ostream& operator<<(std::ostream& os, const date& d) { - return os << d.year << '-' << d.month << '-' << d.day; - } - }; - - template <> struct fmt::formatter : 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 `__): - - .. code:: c++ - - #include - #include - - 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 - (`#2941 `_). - For example (`godbolt `__): - - .. code:: c++ - - #include - #include - - int main() { - auto v = std::variant(42); - fmt::print("{}\n", v); - } - - prints:: - - variant(42) - - Thanks `@jehelset `_. - -* Added experimental ``std::filesystem::path`` formatting support - (`#2865 `_, - `#2902 `_, - `#2917 `_, - `#2918 `_). - For example (`godbolt `__): - - .. code:: c++ - - #include - #include - - int main() { - fmt::print("There is no place like {}.", std::filesystem::path("/home")); - } - - prints:: - - There is no place like "/home". - - Thanks `@phprus (Vladislav Shchapov) `_. - -* Added a ``std::thread::id`` formatter to ``fmt/std.h``. - For example (`godbolt `__): - - .. code:: c++ - - #include - #include - - 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 - (`#2793 `_). - For example (`godbolt `__): - - .. code:: c++ - - #include - #include - - 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 - - .. image:: https://user-images.githubusercontent.com/576385/ - 175071215-12809244-dab0-4005-96d8-7cd911c964d5.png - - Thanks `@rbrugo (Riccardo Brugo) `_. - -* Made ``fmt::print`` overload for text styles correctly handle UTF-8 - (`#2681 `_, - `#2701 `_). - Thanks `@AlexGuteniev (Alex Guteniev) `_. - -* Fixed Unicode handling when writing to an ostream. - -* Added support for nested specifiers to range formatting - (`#2673 `_). - For example (`godbolt `__): - - .. code:: c++ - - #include - #include - - int main() { - fmt::print("{::#x}\n", std::vector{10, 20, 30}); - } - - prints ``[0xa, 0x14, 0x1e]``. - - Thanks `@BRevzin (Barry Revzin) `_. - -* Implemented escaping of wide strings in ranges - (`#2904 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Added support for ranges with ``begin`` / ``end`` found via the - argument-dependent lookup - (`#2807 `_). - Thanks `@rbrugo (Riccardo Brugo) `_. - -* Fixed formatting of certain kinds of ranges of ranges - (`#2787 `_). - Thanks `@BRevzin (Barry Revzin) `_. - -* Fixed handling of maps with element types other than ``std::pair`` - (`#2944 `_). - Thanks `@BrukerJWD (Jonathan W) `_. - -* Made tuple formatter enabled only if elements are formattable - (`#2939 `_, - `#2940 `_). - Thanks `@jehelset `_. - -* Made ``fmt::join`` compatible with format string compilation - (`#2719 `_, - `#2720 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Made compile-time checks work with named arguments of custom types and - ``std::ostream`` ``print`` overloads - (`#2816 `_, - `#2817 `_, - `#2819 `_). - Thanks `@timsong-cpp `_. - -* Removed ``make_args_checked`` because it is no longer needed for compile-time - checks (`#2760 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* 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`` - (`#2733 `_). - Thanks `@arogge (Andreas Rogge) `_. - -* Removed a redundant buffer resize when formatting to ``std::ostream`` - (`#2842 `_, - `#2843 `_). - Thanks `@jcelerier (Jean-Michaël Celerier) `_. - -* Made precision computation for strings consistent with width - (`#2888 `_). - -* Fixed handling of locale separators in floating point formatting - (`#2830 `_). - -* Made sign specifiers work with ``__int128_t`` - (`#2773 `_). - -* Improved support for systems such as CHERI with extra data stored in pointers - (`#2932 `_). - Thanks `@davidchisnall (David Chisnall) `_. - -* Improved documentation - (`#2706 `_, - `#2712 `_, - `#2789 `_, - `#2803 `_, - `#2805 `_, - `#2815 `_, - `#2924 `_). - Thanks `@BRevzin (Barry Revzin) `_, - `@Pokechu22 `_, - `@setoye (Alta) `_, - `@rtobar `_, - `@rbrugo (Riccardo Brugo) `_, - `@anoonD (cre) `_, - `@leha-bot (Alex) `_. - -* Improved build configuration - (`#2766 `_, - `#2772 `_, - `#2836 `_, - `#2852 `_, - `#2907 `_, - `#2913 `_, - `#2914 `_). - Thanks `@kambala-decapitator (Andrey Filipenkov) - `_, - `@mattiasljungstrom (Mattias Ljungström) - `_, - `@kieselnb (Nick Kiesel) `_, - `@nathannaveen `_, - `@Vertexwahn `_. - -* Fixed various warnings and compilation issues - (`#2408 `_, - `#2507 `_, - `#2697 `_, - `#2715 `_, - `#2717 `_, - `#2722 `_, - `#2724 `_, - `#2725 `_, - `#2726 `_, - `#2728 `_, - `#2732 `_, - `#2738 `_, - `#2742 `_, - `#2744 `_, - `#2745 `_, - `#2746 `_, - `#2754 `_, - `#2755 `_, - `#2757 `_, - `#2758 `_, - `#2761 `_, - `#2762 `_, - `#2763 `_, - `#2765 `_, - `#2769 `_, - `#2770 `_, - `#2771 `_, - `#2777 `_, - `#2779 `_, - `#2782 `_, - `#2783 `_, - `#2794 `_, - `#2796 `_, - `#2797 `_, - `#2801 `_, - `#2802 `_, - `#2808 `_, - `#2818 `_, - `#2819 `_, - `#2829 `_, - `#2835 `_, - `#2848 `_, - `#2860 `_, - `#2861 `_, - `#2882 `_, - `#2886 `_, - `#2891 `_, - `#2892 `_, - `#2895 `_, - `#2896 `_, - `#2903 `_, - `#2906 `_, - `#2908 `_, - `#2909 `_, - `#2920 `_, - `#2922 `_, - `#2927 `_, - `#2929 `_, - `#2936 `_, - `#2937 `_, - `#2938 `_, - `#2951 `_, - `#2954 `_, - `#2957 `_, - `#2958 `_, - `#2960 `_). - Thanks `@matrackif `_ - `@Tobi823 (Tobias Hellmann) `_, - `@ivan-volnov (Ivan Volnov) `_, - `@VasiliPupkin256 `_, - `@federico-busato (Federico) `_, - `@barcharcraz (Charlie Barto) `_, - `@jk-jeon (Junekey Jeon) `_, - `@HazardyKnusperkeks (Björn Schäpers) - `_, - `@dalboris (Boris Dalstein) `_, - `@seanm (Sean McBride) `_, - `@gsjaardema (Greg Sjaardema) `_, - `@timsong-cpp `_, - `@seanm (Sean McBride) `_, - `@frithrah `_, - `@chronoxor (Ivan Shynkarenka) `_, - `@Agga `_, - `@madmaxoft (Mattes D) `_, - `@JurajX (Juraj) `_, - `@phprus (Vladislav Shchapov) `_, - `@Dani-Hub (Daniel Krügler) `_. - -8.1.1 - 2022-01-06 ------------------- - -* Restored ABI compatibility with version 8.0.x - (`#2695 `_, - `#2696 `_). - Thanks `@saraedum (Julian Rüth) `_. - -* Fixed chrono formatting on big endian systems - (`#2698 `_, - `#2699 `_). - Thanks `@phprus (Vladislav Shchapov) `_ and - `@xvitaly (Vitaly Zaitsev) `_. - -* Fixed a linkage error with mingw - (`#2691 `_, - `#2692 `_). - Thanks `@rbberger (Richard Berger) `_. - -8.1.0 - 2022-01-02 ------------------- - -* Optimized chrono formatting - (`#2500 `_, - `#2537 `_, - `#2541 `_, - `#2544 `_, - `#2550 `_, - `#2551 `_, - `#2576 `_, - `#2577 `_, - `#2586 `_, - `#2591 `_, - `#2594 `_, - `#2602 `_, - `#2617 `_, - `#2628 `_, - `#2633 `_, - `#2670 `_, - `#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 (Vladislav Shchapov) `_ and - `@toughengineer (Pavel Novikov) `_. - -* Implemented subsecond formatting for chrono durations - (`#2623 `_). - For example (`godbolt `__): - - .. code:: c++ - - #include - - int main() { - fmt::print("{:%S}", std::chrono::milliseconds(1234)); - } - - prints "01.234". - - Thanks `@matrackif `_. - -* Fixed handling of precision 0 when formatting chrono durations - (`#2587 `_, - `#2588 `_). - Thanks `@lukester1975 `_. - -* Fixed an overflow on invalid inputs in the ``tm`` formatter - (`#2564 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Added ``fmt::group_digits`` that formats integers with a non-localized digit - separator (comma) for groups of three digits. - For example (`godbolt `__): - - .. code:: c++ - - #include - - int main() { - fmt::print("{} dollars", fmt::group_digits(1000000)); - } - - prints "1,000,000 dollars". - -* Added support for faint, conceal, reverse and blink text styles - (`#2394 `_): - - https://user-images.githubusercontent.com/576385/147710227-c68f5317-f8fa-42c3-9123-7c4ba3c398cb.mp4 - - Thanks `@benit8 (Benoît Lormeau) `_ and - `@data-man (Dmitry Atamanov) `_. - -* Added experimental support for compile-time floating point formatting - (`#2426 `_, - `#2470 `_). - It is currently limited to the header-only mode. - Thanks `@alexezeder (Alexey Ochapov) `_. - -* Added UDL-based named argument support to compile-time format string checks - (`#2640 `_, - `#2649 `_). - For example (`godbolt `__): - - .. code:: c++ - - #include - - 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 (Alexey Ochapov) `_. - -* Implemented escaping of string range elements. - For example (`godbolt `__): - - .. code:: c++ - - #include - #include - - int main() { - fmt::print("{}", std::vector{"\naan"}); - } - - is now printed as:: - - ["\naan"] - - instead of:: - - [" - aan"] - -* Added an experimental ``?`` specifier for escaping strings. - (`#2674 `_). - Thanks `@BRevzin (Barry Revzin) `_. - -* Switched to JSON-like representation of maps and sets for consistency with - Python's ``str.format``. - For example (`godbolt `__): - - .. code:: c++ - - #include - #include - - int main() { - fmt::print("{}", std::map{{"answer", 42}}); - } - - is now printed as:: - - {"answer": 42} - -* Extended ``fmt::join`` to support C++20-only ranges - (`#2549 `_). - Thanks `@BRevzin (Barry Revzin) `_. - -* 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 - (`#1841 `_). - -* Deprecated implicit conversion of ``[const] signed char*`` and - ``[const] unsigned char*`` to C strings. - -* Deprecated ``_format``, a legacy UDL-based format API - (`#2646 `_). - Thanks `@alexezeder (Alexey Ochapov) `_. - -* Marked ``format``, ``formatted_size`` and ``to_string`` as ``[[nodiscard]]`` - (`#2612 `_). - `@0x8000-0000 (Florin Iucha) `_. - -* Added missing diagnostic when trying to format function and member pointers - as well as objects convertible to pointers which is explicitly disallowed - (`#2598 `_, - `#2609 `_, - `#2610 `_). - Thanks `@AlexGuteniev (Alex Guteniev) `_. - -* Optimized writing to a contiguous buffer with ``format_to_n`` - (`#2489 `_). - Thanks `@Roman-Koshelev `_. - -* Optimized writing to non-``char`` buffers - (`#2477 `_). - Thanks `@Roman-Koshelev `_. - -* Decimal point is now localized when using the ``L`` specifier. - -* Improved floating point formatter implementation - (`#2498 `_, - `#2499 `_). - Thanks `@Roman-Koshelev `_. - -* Fixed handling of very large precision in fixed format - (`#2616 `_). - -* Made a table of cached powers used in FP formatting static - (`#2509 `_). - Thanks `@jk-jeon (Junekey Jeon) `_. - -* Resolved a lookup ambiguity with C++20 format-related functions due to ADL - (`#2639 `_, - `#2641 `_). - Thanks `@mkurdej (Marek Kurdej) `_. - -* Removed unnecessary inline namespace qualification - (`#2642 `_, - `#2643 `_). - Thanks `@mkurdej (Marek Kurdej) `_. - -* Implemented argument forwarding in ``format_to_n`` - (`#2462 `_, - `#2463 `_). - Thanks `@owent (WenTao Ou) `_. - -* Fixed handling of implicit conversions in ``fmt::to_string`` and format string - compilation (`#2565 `_). - -* Changed the default access mode of files created by ``fmt::output_file`` to - ``-rw-r--r--`` for consistency with ``fopen`` - (`#2530 `_). - -* Make ``fmt::ostream::flush`` public - (`#2435 `_). - -* Improved C++14/17 attribute detection - (`#2615 `_). - Thanks `@AlexGuteniev (Alex Guteniev) `_. - -* Improved ``consteval`` detection for MSVC - (`#2559 `_). - Thanks `@DanielaE (Daniela Engert) `_. - -* Improved documentation - (`#2406 `_, - `#2446 `_, - `#2493 `_, - `#2513 `_, - `#2515 `_, - `#2522 `_, - `#2562 `_, - `#2575 `_, - `#2606 `_, - `#2620 `_, - `#2676 `_). - Thanks `@sobolevn (Nikita Sobolev) `_, - `@UnePierre (Max FERGER) `_, - `@zhsj `_, - `@phprus (Vladislav Shchapov) `_, - `@ericcurtin (Eric Curtin) `_, - `@Lounarok `_. - -* Improved fuzzers and added a fuzzer for chrono timepoint formatting - (`#2461 `_, - `#2469 `_). - `@pauldreik (Paul Dreik) `_, - -* Added the ``FMT_SYSTEM_HEADERS`` CMake option setting which marks {fmt}'s - headers as system. It can be used to suppress warnings - (`#2644 `_, - `#2651 `_). - Thanks `@alexezeder (Alexey Ochapov) `_. - -* Added the Bazel build system support - (`#2505 `_, - `#2516 `_). - Thanks `@Vertexwahn `_. - -* Improved build configuration and tests - (`#2437 `_, - `#2558 `_, - `#2648 `_, - `#2650 `_, - `#2663 `_, - `#2677 `_). - Thanks `@DanielaE (Daniela Engert) `_, - `@alexezeder (Alexey Ochapov) `_, - `@phprus (Vladislav Shchapov) `_. - -* Fixed various warnings and compilation issues - (`#2353 `_, - `#2356 `_, - `#2399 `_, - `#2408 `_, - `#2414 `_, - `#2427 `_, - `#2432 `_, - `#2442 `_, - `#2434 `_, - `#2439 `_, - `#2447 `_, - `#2450 `_, - `#2455 `_, - `#2465 `_, - `#2472 `_, - `#2474 `_, - `#2476 `_, - `#2478 `_, - `#2479 `_, - `#2481 `_, - `#2482 `_, - `#2483 `_, - `#2490 `_, - `#2491 `_, - `#2510 `_, - `#2518 `_, - `#2528 `_, - `#2529 `_, - `#2539 `_, - `#2540 `_, - `#2545 `_, - `#2555 `_, - `#2557 `_, - `#2570 `_, - `#2573 `_, - `#2582 `_, - `#2605 `_, - `#2611 `_, - `#2647 `_, - `#2627 `_, - `#2630 `_, - `#2635 `_, - `#2638 `_, - `#2653 `_, - `#2654 `_, - `#2661 `_, - `#2664 `_, - `#2684 `_). - Thanks `@DanielaE (Daniela Engert) `_, - `@mwinterb `_, - `@cdacamar (Cameron DaCamara) `_, - `@TrebledJ (Johnathan) `_, - `@bodomartin (brm) `_, - `@cquammen (Cory Quammen) `_, - `@white238 (Chris White) `_, - `@mmarkeloff (Max) `_, - `@palacaze (Pierre-Antoine Lacaze) `_, - `@jcelerier (Jean-Michaël Celerier) `_, - `@mborn-adi (Mathias Born) `_, - `@BrukerJWD (Jonathan W) `_, - `@spyridon97 (Spiros Tsalikis) `_, - `@phprus (Vladislav Shchapov) `_, - `@oliverlee (Oliver Lee) `_, - `@joshessman-llnl (Josh Essman) `_, - `@akohlmey (Axel Kohlmeyer) `_, - `@timkalu `_, - `@olupton (Olli Lupton) `_, - `@Acretock `_, - `@alexezeder (Alexey Ochapov) `_, - `@andrewcorrigan (Andrew Corrigan) `_, - `@lucpelletier `_, - `@HazardyKnusperkeks (Björn Schäpers) - `_. - -8.0.1 - 2021-07-02 ------------------- - -* Fixed the version number in the inline namespace - (`#2374 `_). - -* Added a missing presentation type check for ``std::string`` - (`#2402 `_). - -* Fixed a linkage error when mixing code built with clang and gcc - (`#2377 `_). - -* Fixed documentation issues - (`#2396 `_, - `#2403 `_, - `#2406 `_). - Thanks `@mkurdej (Marek Kurdej) `_. - -* Removed dead code in FP formatter ( - `#2398 `_). - Thanks `@javierhonduco (Javier Honduvilla Coto) - `_. - -* Fixed various warnings and compilation issues - (`#2351 `_, - `#2359 `_, - `#2365 `_, - `#2368 `_, - `#2370 `_, - `#2376 `_, - `#2381 `_, - `#2382 `_, - `#2386 `_, - `#2389 `_, - `#2395 `_, - `#2397 `_, - `#2400 `_, - `#2401 `_, - `#2407 `_). - Thanks `@zx2c4 (Jason A. Donenfeld) `_, - `@AidanSun05 (Aidan Sun) `_, - `@mattiasljungstrom (Mattias Ljungström) - `_, - `@joemmett (Jonathan Emmett) `_, - `@erengy (Eren Okka) `_, - `@patlkli (Patrick Geltinger) `_, - `@gsjaardema (Greg Sjaardema) `_, - `@phprus (Vladislav Shchapov) `_. - -8.0.0 - 2021-06-21 ------------------- - -* Enabled compile-time format string checks by default. - For example (`godbolt `__): - - .. code:: c++ - - #include - - 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``: - - .. code:: c++ - - fmt::print(fmt::runtime("{:d}"), "I am not a number"); - -* Added compile-time formatting - (`#2019 `_, - `#2044 `_, - `#2056 `_, - `#2072 `_, - `#2075 `_, - `#2078 `_, - `#2129 `_, - `#2326 `_). - For example (`godbolt `__): - - .. code:: c++ - - #include - - consteval auto compile_time_itoa(int value) -> std::array { - auto result = std::array(); - fmt::format_to(result.data(), FMT_COMPILE("{}"), value); - return result; - } - - constexpr auto answer = compile_time_itoa(42); - - Most of the formatting functionality is available at compile time with a - notable exception of floating-point numbers and pointers. - Thanks `@alexezeder (Alexey Ochapov) `_. - -* 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 (`#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 - (`#2043 `_, - `#2242 `_): - - .. code:: c++ - - #include - - using namespace fmt::literals; - auto s = fmt::format(FMT_COMPILE("{}"), 42); // 🙁 not modern - auto s = fmt::format("{}"_cf, 42); // 🙂 modern as hell - - It requires compiler support for class types in non-type template parameters - (a C++20 feature) which is available in GCC 9.3+. - Thanks `@alexezeder (Alexey Ochapov) `_. - -* Format string compilation now requires ``format`` functions of ``formatter`` - specializations for user-defined types to be ``const``: - - .. code:: c++ - - template <> struct fmt::formatter: formatter { - template - auto format(my_type obj, FormatContext& ctx) const { // Note const here. - // ... - } - }; - -* Added UDL-based named argument support to format string compilation - (`#2243 `_, - `#2281 `_). For example: - - .. code:: c++ - - #include - - using namespace fmt::literals; - auto s = fmt::format(FMT_COMPILE("{answer}"), "answer"_a = 42); - - Here the argument named "answer" is resolved at compile time with no - runtime overhead. - Thanks `@alexezeder (Alexey Ochapov) `_. - -* Added format string compilation support to ``fmt::print`` - (`#2280 `_, - `#2304 `_). - Thanks `@alexezeder (Alexey Ochapov) `_. - -* Added initial support for compiling {fmt} as a C++20 module - (`#2235 `_, - `#2240 `_, - `#2260 `_, - `#2282 `_, - `#2283 `_, - `#2288 `_, - `#2298 `_, - `#2306 `_, - `#2307 `_, - `#2309 `_, - `#2318 `_, - `#2324 `_, - `#2332 `_, - `#2340 `_). - Thanks `@DanielaE (Daniela Engert) `_. - -* Made symbols private by default reducing shared library size - (`#2301 `_). For example there was - a ~15% reported reduction on one platform. - Thanks `@sergiud (Sergiu Deitsch) `_. - -* Optimized includes making the result of preprocessing ``fmt/format.h`` - ~20% smaller with libstdc++/C++20 and slightly improving build times - (`#1998 `_). - -* Added support of ranges with non-const ``begin`` / ``end`` - (`#1953 `_). - Thanks `@kitegi (sarah) `_. - -* Added support of ``std::byte`` and other formattable types to ``fmt::join`` - (`#1981 `_, - `#2040 `_, - `#2050 `_, - `#2262 `_). For example: - - .. code:: c++ - - #include - #include - #include - - int main() { - auto bytes = std::vector{std::byte(4), std::byte(2)}; - fmt::print("{}", fmt::join(bytes, "")); - } - - prints "42". - - Thanks `@kamibo (Camille Bordignon) `_. - -* Implemented the default format for ``std::chrono::system_clock`` - (`#2319 `_, - `#2345 `_). For example: - - .. code:: c++ - - #include - - int main() { - fmt::print("{}", std::chrono::system_clock::now()); - } - - prints "2021-06-18 15:22:00" (the output depends on the current date and - time). Thanks `@sunmy2019 `_. - -* Made more chrono specifiers locale independent by default. Use the ``'L'`` - specifier to get localized formatting. For example: - - .. code:: c++ - - #include - - int main() { - std::locale::global(std::locale("ru_RU.UTF-8")); - auto monday = std::chrono::weekday(1); - fmt::print("{}\n", monday); // prints "Mon" - fmt::print("{:L}\n", monday); // prints "пн" - } - -* Improved locale handling in chrono formatting - (`#2337 `_, - `#2349 `_, - `#2350 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Deprecated ``fmt/locale.h`` moving the formatting functions that take a - locale to ``fmt/format.h`` (``char``) and ``fmt/xchar`` (other overloads). - This doesn't introduce a dependency on ```` so there is virtually no - compile time effect. - -* Deprecated an undocumented ``format_to`` overload that takes - ``basic_memory_buffer``. - -* Made parameter order in ``vformat_to`` consistent with ``format_to`` - (`#2327 `_). - -* Added support for time points with arbitrary durations - (`#2208 `_). For example: - - .. code:: c++ - - #include - - int main() { - using tp = std::chrono::time_point< - std::chrono::system_clock, std::chrono::seconds>; - fmt::print("{:%S}", tp(std::chrono::seconds(42))); - } - - prints "42". - -* Formatting floating-point numbers no longer produces trailing zeros by default - for consistency with ``std::format``. For example: - - .. code:: c++ - - #include - - 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: - - .. code:: c++ - - #include - #include - - 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 - (`#2305 `_, - `#2310 `_). - Thanks `@Liedtke (Matthias Liedtke) `_. - -* Made the hexfloat formatting use the right alignment by default - (`#2308 `_, - `#2317 `_). - Thanks `@Liedtke (Matthias 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 - (`#2133 `_). - -* Added support for the ``'s'`` format specifier that gives textual - representation of ``bool`` - (`#2094 `_, - `#2109 `_). For example: - - .. code:: c++ - - #include - - int main() { - fmt::print("{:s}", true); - } - - prints "true". - Thanks `@powercoderlol (Ivan Polyakov) `_. - -* Made ``fmt::ptr`` work with function pointers - (`#2131 `_). For example: - - .. code:: c++ - - #include - - int main() { - fmt::print("My main: {}\n", fmt::ptr(main)); - } - - Thanks `@mikecrowe (Mike Crowe) `_. - -* The undocumented support for specializing ``formatter`` for pointer types - has been removed. - -* Fixed ``fmt::formatted_size`` with format string compilation - (`#2141 `_, - `#2161 `_). - Thanks `@alexezeder (Alexey Ochapov) `_. - -* Fixed handling of empty format strings during format string compilation - (`#2042 `_): - - .. code:: c++ - - auto s = fmt::format(FMT_COMPILE("")); - - Thanks `@alexezeder (Alexey Ochapov) `_. - -* Fixed handling of enums in ``fmt::to_string`` - (`#2036 `_). - -* Improved width computation - (`#2033 `_, - `#2091 `_). For example: - - .. code:: c++ - - #include - - int main() { - fmt::print("{:-<10}{}\n", "你好", "世界"); - fmt::print("{:-<10}{}\n", "hello", "world"); - } - - prints - - .. image:: https://user-images.githubusercontent.com/576385/ - 119840373-cea3ca80-beb9-11eb-91e0-54266c48e181.png - - on a modern terminal. - -* The experimental fast output stream (``fmt::ostream``) is now truncated by - default for consistency with ``fopen`` - (`#2018 `_). For example: - - .. code:: c++ - - #include - - int main() { - fmt::ostream out1 = fmt::output_file("guide"); - out1.print("Zaphod"); - out1.close(); - fmt::ostream out2 = fmt::output_file("guide"); - out2.print("Ford"); - } - - writes "Ford" to the file "guide". To preserve the old file content if any - pass ``fmt::file::WRONLY | fmt::file::CREATE`` flags to ``fmt::output_file``. - -* Fixed moving of ``fmt::ostream`` that holds buffered data - (`#2197 `_, - `#2198 `_). - Thanks `@vtta `_. - -* Replaced the ``fmt::system_error`` exception with a function of the same - name that constructs ``std::system_error`` - (`#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()`` - (`#2274 `_, - `#2275 `_). - The latter is similar to ``std::sytem_category`` but correctly handles UTF-8. - Thanks `@phprus (Vladislav Shchapov) `_. - -* Replaced ``fmt::error_code`` with ``std::error_code`` and made it formattable - (`#2269 `_, - `#2270 `_, - `#2273 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Added speech synthesis support - (`#2206 `_). - -* Made ``format_to`` work with a memory buffer that has a custom allocator - (`#2300 `_). - Thanks `@voxmea `_. - -* Added ``Allocator::max_size`` support to ``basic_memory_buffer``. - (`#1960 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Added wide string support to ``fmt::join`` - (`#2236 `_). - Thanks `@crbrz `_. - -* Made iterators passed to ``formatter`` specializations via a format context - satisfy C++20 ``std::output_iterator`` requirements - (`#2156 `_, - `#2158 `_, - `#2195 `_, - `#2204 `_). - Thanks `@randomnetcat (Jason Cobb) `_. - -* Optimized the ``printf`` implementation - (`#1982 `_, - `#1984 `_, - `#2016 `_, - `#2164 `_). - Thanks `@rimathia `_ and - `@moiwi `_. - -* Improved detection of ``constexpr`` ``char_traits`` - (`#2246 `_, - `#2257 `_). - Thanks `@phprus (Vladislav Shchapov) `_. - -* Fixed writing to ``stdout`` when it is redirected to ``NUL`` on Windows - (`#2080 `_). - -* Fixed exception propagation from iterators - (`#2097 `_). - -* Improved ``strftime`` error handling - (`#2238 `_, - `#2244 `_). - Thanks `@yumeyao `_. - -* Stopped using deprecated GCC UDL template extension. - -* Added ``fmt/args.h`` to the install target - (`#2096 `_). - -* Error messages are now passed to assert when exceptions are disabled - (`#2145 `_). - Thanks `@NobodyXu (Jiahao XU) `_. - -* Added the ``FMT_MASTER_PROJECT`` CMake option to control build and install - targets when {fmt} is included via ``add_subdirectory`` - (`#2098 `_, - `#2100 `_). - Thanks `@randomizedthinking `_. - -* Improved build configuration - (`#2026 `_, - `#2122 `_). - Thanks `@luncliff (Park DongHa) `_ and - `@ibaned (Dan Ibanez) `_. - -* Fixed various warnings and compilation issues - (`#1947 `_, - `#1959 `_, - `#1963 `_, - `#1965 `_, - `#1966 `_, - `#1974 `_, - `#1975 `_, - `#1990 `_, - `#2000 `_, - `#2001 `_, - `#2002 `_, - `#2004 `_, - `#2006 `_, - `#2009 `_, - `#2010 `_, - `#2038 `_, - `#2039 `_, - `#2047 `_, - `#2053 `_, - `#2059 `_, - `#2065 `_, - `#2067 `_, - `#2068 `_, - `#2073 `_, - `#2103 `_, - `#2105 `_, - `#2106 `_, - `#2107 `_, - `#2116 `_, - `#2117 `_, - `#2118 `_, - `#2119 `_, - `#2127 `_, - `#2128 `_, - `#2140 `_, - `#2142 `_, - `#2143 `_, - `#2144 `_, - `#2147 `_, - `#2148 `_, - `#2149 `_, - `#2152 `_, - `#2160 `_, - `#2170 `_, - `#2175 `_, - `#2176 `_, - `#2177 `_, - `#2178 `_, - `#2179 `_, - `#2180 `_, - `#2181 `_, - `#2183 `_, - `#2184 `_, - `#2185 `_, - `#2186 `_, - `#2187 `_, - `#2190 `_, - `#2192 `_, - `#2194 `_, - `#2205 `_, - `#2210 `_, - `#2211 `_, - `#2215 `_, - `#2216 `_, - `#2218 `_, - `#2220 `_, - `#2228 `_, - `#2229 `_, - `#2230 `_, - `#2233 `_, - `#2239 `_, - `#2248 `_, - `#2252 `_, - `#2253 `_, - `#2255 `_, - `#2261 `_, - `#2278 `_, - `#2284 `_, - `#2287 `_, - `#2289 `_, - `#2290 `_, - `#2293 `_, - `#2295 `_, - `#2296 `_, - `#2297 `_, - `#2311 `_, - `#2313 `_, - `#2315 `_, - `#2320 `_, - `#2321 `_, - `#2323 `_, - `#2328 `_, - `#2329 `_, - `#2333 `_, - `#2338 `_, - `#2341 `_). - Thanks `@darklukee `_, - `@fagg (Ashton Fagg) `_, - `@killerbot242 (Lieven de Cock) `_, - `@jgopel (Jonathan Gopel) `_, - `@yeswalrus (Walter Gray) `_, - `@Finkman `_, - `@HazardyKnusperkeks (Björn Schäpers) `_, - `@dkavolis (Daumantas Kavolis) `_, - `@concatime (Issam Maghni) `_, - `@chronoxor (Ivan Shynkarenka) `_, - `@summivox (Yin Zhong) `_, - `@yNeo `_, - `@Apache-HB (Elliot) `_, - `@alexezeder (Alexey Ochapov) `_, - `@toojays (John Steele Scott) `_, - `@Brainy0207 `_, - `@vadz (VZ) `_, - `@imsherlock (Ryan Sherlock) `_, - `@phprus (Vladislav Shchapov) `_, - `@white238 (Chris White) `_, - `@yafshar (Yaser Afshar) `_, - `@BillyDonahue (Billy Donahue) `_, - `@jstaahl `_, - `@denchat `_, - `@DanielaE (Daniela Engert) `_, - `@ilyakurdyukov (Ilya Kurdyukov) `_, - `@ilmai `_, - `@JessyDL (Jessy De Lannoit) `_, - `@sergiud (Sergiu Deitsch) `_, - `@mwinterb `_, - `@sven-herrmann `_, - `@jmelas (John Melas) `_, - `@twoixter (Jose Miguel Pérez) `_, - `@crbrz `_, - `@upsj (Tobias Ribizel) `_. - -* Improved documentation - (`#1986 `_, - `#2051 `_, - `#2057 `_, - `#2081 `_, - `#2084 `_, - `#2312 `_). - Thanks `@imba-tjd (谭九鼎) `_, - `@0x416c69 (AlιAѕѕaѕѕιN) `_, - `@mordante `_. - -* Continuous integration and test improvements - (`#1969 `_, - `#1991 `_, - `#2020 `_, - `#2110 `_, - `#2114 `_, - `#2196 `_, - `#2217 `_, - `#2247 `_, - `#2256 `_, - `#2336 `_, - `#2346 `_). - Thanks `@jgopel (Jonathan Gopel) `_, - `@alexezeder (Alexey Ochapov) `_ and - `@DanielaE (Daniela Engert) `_. - -7.1.3 - 2020-11-24 ------------------- - -* Fixed handling of buffer boundaries in ``format_to_n`` - (`#1996 `_, - `#2029 `_). - -* Fixed linkage errors when linking with a shared library - (`#2011 `_). - -* Reintroduced ostream support to range formatters - (`#2014 `_). - -* Worked around an issue with mixing std versions in gcc - (`#2017 `_). - -7.1.2 - 2020-11-04 ------------------- - -* Fixed floating point formatting with large precision - (`#1976 `_). - -7.1.1 - 2020-11-01 ------------------- - -* Fixed ABI compatibility with 7.0.x - (`#1961 `_). - -* Added the ``FMT_ARM_ABI_COMPATIBILITY`` macro to work around ABI - incompatibility between GCC and Clang on ARM - (`#1919 `_). - -* Worked around a SFINAE bug in GCC 8 - (`#1957 `_). - -* Fixed linkage errors when building with GCC's LTO - (`#1955 `_). - -* Fixed a compilation error when building without ``__builtin_clz`` or equivalent - (`#1968 `_). - Thanks `@tohammer (Tobias Hammer) `_. - -* Fixed a sign conversion warning - (`#1964 `_). - Thanks `@OptoCloud `_. - -7.1.0 - 2020-10-25 ------------------- - -* Switched from `Grisu3 - `_ - to `Dragonbox `_ for the default - floating-point formatting which gives the shortest decimal representation - with round-trip guarantee and correct rounding - (`#1882 `_, - `#1887 `_, - `#1894 `_). This makes {fmt} up to - 20-30x faster than common implementations of ``std::ostringstream`` and - ``sprintf`` on `dtoa-benchmark `_ - and faster than double-conversion and Ryū: - - .. image:: https://user-images.githubusercontent.com/576385/ - 95684665-11719600-0ba8-11eb-8e5b-972ff4e49428.png - - It is possible to get even better performance at the cost of larger binary - size by compiling with the ``FMT_USE_FULL_CACHE_DRAGONBOX`` macro set to 1. - - Thanks `@jk-jeon (Junekey Jeon) `_. - -* Added an experimental unsynchronized file output API which, together with - `format string compilation `_, - can give `5-9 times speed up compared to fprintf - `_ - on common platforms (`godbolt `__): - - .. code:: c++ - - #include - - int main() { - auto f = fmt::output_file("guide"); - f.print("The answer is {}.", 42); - } - -* Added a formatter for ``std::chrono::time_point`` - (`#1819 `_, - `#1837 `_). For example - (`godbolt `__): - - .. code:: c++ - - #include - - int main() { - auto now = std::chrono::system_clock::now(); - fmt::print("The time is {:%H:%M:%S}.\n", now); - } - - Thanks `@adamburgess (Adam Burgess) `_. - -* Added support for ranges with non-const ``begin``/``end`` to ``fmt::join`` - (`#1784 `_, - `#1786 `_). For example - (`godbolt `__): - - .. code:: c++ - - #include - #include - - int main() { - using std::literals::string_literals::operator""s; - auto strs = std::array{"a"s, "bb"s, "ccc"s}; - auto range = strs | ranges::views::filter( - [] (const std::string &x) { return x.size() != 2; } - ); - fmt::print("{}\n", fmt::join(range, "")); - } - - prints "accc". - - Thanks `@tonyelewis (Tony E Lewis) `_. - -* Added a ``memory_buffer::append`` overload that takes a range - (`#1806 `_). - Thanks `@BRevzin (Barry Revzin) `_. - -* Improved handling of single code units in ``FMT_COMPILE``. For example: - - .. code:: c++ - - #include - - char* f(char* buf) { - return fmt::format_to(buf, FMT_COMPILE("x{}"), 42); - } - - compiles to just (`godbolt `__): - - .. code:: 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 - (`#1809 `_). - -* Improved error reporting for unformattable types: now you'll get the type name - directly in the error message instead of the note: - - .. code:: c++ - - #include - - struct how_about_no {}; - - int main() { - fmt::print("{}", how_about_no()); - } - - Error (`godbolt `__): - - ``fmt/core.h:1438:3: error: static_assert failed due to requirement - 'fmt::v7::formattable()' "Cannot format an argument. - To make type T formattable provide a formatter specialization: - https://fmt.dev/latest/api.html#udt" - ...`` - -* Added the `make_args_checked `_ - function template that allows you to write formatting functions with - compile-time format string checks and avoid binary code bloat - (`godbolt `__): - - .. code:: c++ - - void vlog(const char* file, int line, fmt::string_view format, - fmt::format_args args) { - fmt::print("{}: {}: ", file, line); - fmt::vprint(format, args); - } - - template - void log(const char* file, int line, const S& format, Args&&... args) { - vlog(file, line, format, - fmt::make_args_checked(format, args...)); - } - - #define MY_LOG(format, ...) \ - log(__FILE__, __LINE__, FMT_STRING(format), __VA_ARGS__) - - MY_LOG("invalid squishiness: {}", 42); - -* Replaced ``snprintf`` fallback with a faster internal IEEE 754 ``float`` and - ``double`` formatter for arbitrary precision. For example - (`godbolt `__): - - .. code:: c++ - - #include - - int main() { - fmt::print("{:.500}\n", 4.9406564584124654E-324); - } - - prints - - ``4.9406564584124654417656879286822137236505980261432476442558568250067550727020875186529983636163599237979656469544571773092665671035593979639877479601078187812630071319031140452784581716784898210368871863605699873072305000638740915356498438731247339727316961514003171538539807412623856559117102665855668676818703956031062493194527159149245532930545654440112748012970999954193198940908041656332452475714786901472678015935523861155013480352649347201937902681071074917033322268447533357208324319360923829e-324``. - -* Made ``format_to_n`` and ``formatted_size`` part of the `core API - `__ - (`godbolt `__): - - .. code:: c++ - - #include - - int main() { - char buffer[10]; - auto result = fmt::format_to_n(buffer, sizeof(buffer), "{}", 42); - } - -* Added ``fmt::format_to_n`` overload with format string compilation - (`#1764 `_, - `#1767 `_, - `#1869 `_). For example - (`godbolt `__): - - .. code:: c++ - - #include - - int main() { - char buffer[8]; - fmt::format_to_n(buffer, sizeof(buffer), FMT_COMPILE("{}"), 42); - } - - Thanks `@Kurkin (Dmitry Kurkin) `_, - `@alexezeder (Alexey Ochapov) `_. - -* Added ``fmt::format_to`` overload that take ``text_style`` - (`#1593 `_, - `#1842 `_, - `#1843 `_). For example - (`godbolt `__): - - .. code:: c++ - - #include - - int main() { - std::string out; - fmt::format_to(std::back_inserter(out), - fmt::emphasis::bold | fg(fmt::color::red), - "The answer is {}.", 42); - } - - Thanks `@Naios (Denis Blank) `_. - -* Made the ``'#'`` specifier emit trailing zeros in addition to the decimal - point (`#1797 `_). For example - (`godbolt `__): - - .. code:: c++ - - #include - - int main() { - fmt::print("{:#.2g}", 0.5); - } - - prints ``0.50``. - -* Changed the default floating point format to not include ``.0`` for - consistency with ``std::format`` and ``std::to_chars`` - (`#1893 `_, - `#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`` (`#1873 `_, - `#1917 `_). - -* Made ``fmt::to_string`` fallback on ``ostream`` insertion operator if - the ``formatter`` specialization is not provided - (`#1815 `_, - `#1829 `_). - Thanks `@alexezeder (Alexey Ochapov) `_. - -* Added support for the append mode to the experimental file API and - improved ``fcntl.h`` detection. - (`#1847 `_, - `#1848 `_). - Thanks `@t-wiser `_. - -* Fixed handling of types that have both an implicit conversion operator and - an overloaded ``ostream`` insertion operator - (`#1766 `_). - -* Fixed a slicing issue in an internal iterator type - (`#1822 `_). - Thanks `@BRevzin (Barry Revzin) `_. - -* Fixed an issue in locale-specific integer formatting - (`#1927 `_). - -* Fixed handling of exotic code unit types - (`#1870 `_, - `#1932 `_). - -* Improved ``FMT_ALWAYS_INLINE`` - (`#1878 `_). - Thanks `@jk-jeon (Junekey Jeon) `_. - -* Removed dependency on ``windows.h`` - (`#1900 `_). - Thanks `@bernd5 (Bernd Baumanns) `_. - -* Optimized counting of decimal digits on MSVC - (`#1890 `_). - Thanks `@mwinterb `_. - -* Improved documentation - (`#1772 `_, - `#1775 `_, - `#1792 `_, - `#1838 `_, - `#1888 `_, - `#1918 `_, - `#1939 `_). - Thanks `@leolchat (Léonard Gérard) `_, - `@pepsiman (Malcolm Parsons) `_, - `@Klaim (Joël Lamotte) `_, - `@ravijanjam (Ravi J) `_, - `@francesco-st `_, - `@udnaan (Adnan) `_. - -* 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 - (`#1778 `_, - `#1781 `_). - Thanks `@kammce (Khalil Estell) `_. - -* Added the ``FMT_USE_INLINE_NAMESPACES`` macro to control usage of inline - namespaces (`#1945 `_). - Thanks `@darklukee `_. - -* Improved build configuration - (`#1760 `_, - `#1770 `_, - `#1779 `_, - `#1783 `_, - `#1823 `_). - Thanks `@dvetutnev (Dmitriy Vetutnev) `_, - `@xvitaly (Vitaly Zaitsev) `_, - `@tambry (Raul Tambre) `_, - `@medithe `_, - `@martinwuehrer (Martin Wührer) `_. - -* Fixed various warnings and compilation issues - (`#1790 `_, - `#1802 `_, - `#1808 `_, - `#1810 `_, - `#1811 `_, - `#1812 `_, - `#1814 `_, - `#1816 `_, - `#1817 `_, - `#1818 `_, - `#1825 `_, - `#1836 `_, - `#1855 `_, - `#1856 `_, - `#1860 `_, - `#1877 `_, - `#1879 `_, - `#1880 `_, - `#1896 `_, - `#1897 `_, - `#1898 `_, - `#1904 `_, - `#1908 `_, - `#1911 `_, - `#1912 `_, - `#1928 `_, - `#1929 `_, - `#1935 `_, - `#1937 `_, - `#1942 `_, - `#1949 `_). - Thanks `@TheQwertiest `_, - `@medithe `_, - `@martinwuehrer (Martin Wührer) `_, - `@n16h7hunt3r `_, - `@Othereum (Seokjin Lee) `_, - `@gsjaardema (Greg Sjaardema) `_, - `@AlexanderLanin (Alexander Lanin) `_, - `@gcerretani (Giovanni Cerretani) `_, - `@chronoxor (Ivan Shynkarenka) `_, - `@noizefloor (Jan Schwers) `_, - `@akohlmey (Axel Kohlmeyer) `_, - `@jk-jeon (Junekey Jeon) `_, - `@rimathia `_, - `@rglarix (Riccardo Ghetta (larix)) `_, - `@moiwi `_, - `@heckad (Kazantcev Andrey) `_, - `@MarcDirven `_. - `@BartSiwek (Bart Siwek) `_, - `@darklukee `_. - -7.0.3 - 2020-08-06 ------------------- - -* Worked around broken ``numeric_limits`` for 128-bit integers - (`#1787 `_). - -* Added error reporting on missing named arguments - (`#1796 `_). - -* Stopped using 128-bit integers with clang-cl - (`#1800 `_). - Thanks `@Kingcom `_. - -* Fixed issues in locale-specific integer formatting - (`#1782 `_, - `#1801 `_). - -7.0.2 - 2020-07-29 ------------------- - -* Worked around broken ``numeric_limits`` for 128-bit integers - (`#1725 `_). - -* Fixed compatibility with CMake 3.4 - (`#1779 `_). - -* Fixed handling of digit separators in locale-specific formatting - (`#1782 `_). - -7.0.1 - 2020-07-07 ------------------- - -* Updated the inline version namespace name. - -* Worked around a gcc bug in mangling of alias templates - (`#1753 `_). - -* Fixed a linkage error on Windows - (`#1757 `_). - Thanks `@Kurkin (Dmitry 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 - `_. - -* Added a simpler and more efficient `format string compilation API - `_: - - .. code:: c++ - - #include - - // Converts 42 into std::string using the most efficient method and no - // runtime format string processing. - std::string s = fmt::format(FMT_COMPILE("{}"), 42); - - 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++ - `_. - -* Optimized handling of small format strings. For example, - - .. code:: c++ - - fmt::format("Result: {}: ({},{},{},{})", str1, str2, str3, str4, str5) - - is now ~40% faster (`#1685 `_). - -* Applied extern templates to improve compile times when using the core API - and ``fmt/format.h`` (`#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 - - .. code:: c++ - - #include - - int main() { - fmt::print("The answer is {answer}\n", fmt::arg("answer", 42)); - } - - compiles to just (`godbolt `__) - - .. code:: asm - - .LC0: - .string "answer" - .LC1: - .string "The answer is {answer}\n" - main: - sub rsp, 56 - mov edi, OFFSET FLAT:.LC1 - mov esi, 23 - movabs rdx, 4611686018427387905 - lea rax, [rsp+32] - lea rcx, [rsp+16] - mov QWORD PTR [rsp+8], 1 - mov QWORD PTR [rsp], rax - mov DWORD PTR [rsp+16], 42 - mov QWORD PTR [rsp+32], OFFSET FLAT:.LC0 - mov DWORD PTR [rsp+40], 0 - call fmt::v6::vprint(fmt::v6::basic_string_view, - fmt::v6::format_args) - xor eax, eax - add rsp, 56 - ret - - .L.str.1: - .asciz "answer" - -* Implemented compile-time checks for dynamic width and precision - (`#1614 `_): - - .. code:: c++ - - #include - - 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`` - (`#1689 `_) - - .. code:: 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 (Barry Revzin) `_. - -* Added support for named arguments, ``clear`` and ``reserve`` to - ``dynamic_format_arg_store`` - (`#1655 `_, - `#1663 `_, - `#1674 `_, - `#1677 `_). - Thanks `@vsolontsov-ll (Vladimir Solontsov) - `_. - -* Added support for the ``'c'`` format specifier to integral types for - compatibility with ``std::format`` - (`#1652 `_). - -* Replaced the ``'n'`` format specifier with ``'L'`` for compatibility with - ``std::format`` (`#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`` - (`#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 - (`#1595 `_, - `#1682 `_, - `#1683 `_, - `#1687 `_, - `#1699 `_). - Thanks `@rimathia `_. - -* Fixed handling of ``operator<<`` overloads that use ``copyfmt`` - (`#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 - (`#1654 `_, - `#1656 `_). - Thanks `@kwesolowski (Krzysztof Wesolowski) - `_. - -* Replaced ``FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION`` with the ``FMT_FUZZ`` - macro to prevent interfering with fuzzing of projects using {fmt} - (`#1650 `_). - Thanks `@asraa (Asra Ali) `_. - -* Fixed compatibility with emscripten - (`#1636 `_, - `#1637 `_). - Thanks `@ArthurSonzogni (Arthur Sonzogni) - `_. - -* Improved documentation - (`#704 `_, - `#1643 `_, - `#1660 `_, - `#1681 `_, - `#1691 `_, - `#1706 `_, - `#1714 `_, - `#1721 `_, - `#1739 `_, - `#1740 `_, - `#1741 `_, - `#1751 `_). - Thanks `@senior7515 (Alexander Gallego) `_, - `@lsr0 (Lindsay Roberts) `_, - `@puetzk (Kevin Puetz) `_, - `@fpelliccioni (Fernando Pelliccioni) `_, - Alexey Kuzmenko, `@jelly (jelle van der Waa) `_, - `@claremacrae (Clare Macrae) `_, - `@jiapengwen (文佳鹏) `_, - `@gsjaardema (Greg Sjaardema) `_, - `@alexey-milovidov `_. - -* Implemented various build configuration fixes and improvements - (`#1603 `_, - `#1657 `_, - `#1702 `_, - `#1728 `_). - Thanks `@scramsby (Scott Ramsby) `_, - `@jtojnar (Jan Tojnar) `_, - `@orivej (Orivej Desh) `_, - `@flagarde `_. - -* Fixed various warnings and compilation issues - (`#1616 `_, - `#1620 `_, - `#1622 `_, - `#1625 `_, - `#1627 `_, - `#1628 `_, - `#1629 `_, - `#1631 `_, - `#1633 `_, - `#1649 `_, - `#1658 `_, - `#1661 `_, - `#1667 `_, - `#1668 `_, - `#1669 `_, - `#1692 `_, - `#1696 `_, - `#1697 `_, - `#1707 `_, - `#1712 `_, - `#1716 `_, - `#1722 `_, - `#1724 `_, - `#1729 `_, - `#1738 `_, - `#1742 `_, - `#1743 `_, - `#1744 `_, - `#1747 `_, - `#1750 `_). - Thanks `@gsjaardema (Greg Sjaardema) `_, - `@gabime (Gabi Melman) `_, - `@johnor (Johan) `_, - `@Kurkin (Dmitry Kurkin) `_, - `@invexed (James Beach) `_, - `@peterbell10 `_, - `@daixtrose (Markus Werle) `_, - `@petrutlucian94 (Lucian Petrut) `_, - `@Neargye (Daniil Goncharov) `_, - `@ambitslix (Attila M. Szilagyi) `_, - `@gabime (Gabi Melman) `_, - `@erthink (Leonid Yuriev) `_, - `@tohammer (Tobias Hammer) `_, - `@0x8000-0000 (Florin Iucha) `_. - -6.2.1 - 2020-05-09 ------------------- - -* Fixed ostream support in ``sprintf`` - (`#1631 `_). - -* Fixed type detection when using implicit conversion to ``string_view`` and - ostream ``operator<<`` inconsistently - (`#1662 `_). - -6.2.0 - 2020-04-05 ------------------- - -* Improved error reporting when trying to format an object of a non-formattable - type: - - .. code:: 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 specialization: - https://fmt.dev/latest/api.html#formatting-user-defined-types" - static_assert( - ^ - ... - note: in instantiation of function template specialization - 'fmt::v6::format' requested here - fmt::format("{}", S()); - ^ - - if ``S`` is not formattable. - -* Reduced the library size by ~10%. - -* Always print decimal point if ``#`` is specified - (`#1476 `_, - `#1498 `_): - - .. code:: 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 - (`#1109 `_): - - .. code:: 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 - (`#1170 `_, - `#1584 `_): - - .. code:: c++ - - fmt::dynamic_format_arg_store store; - store.push_back("answer"); - store.push_back(42); - fmt::vprint("The {} is {}.\n", store); - - prints:: - - The answer is 42. - - Thanks `@vsolontsov-ll (Vladimir Solontsov) - `_. - -* Made ``fmt::join`` accept ``initializer_list`` - (`#1591 `_). - Thanks `@Rapotkinnik (Nikolay Rapotkin) `_. - -* Fixed handling of empty tuples - (`#1588 `_). - -* Fixed handling of output iterators in ``format_to_n`` - (`#1506 `_). - -* Fixed formatting of ``std::chrono::duration`` types to wide output - (`#1533 `_). - Thanks `@zeffy (pilao) `_. - -* Added const ``begin`` and ``end`` overload to buffers - (`#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 - (`#1590 `_). - Thanks `@albaguirre (Alberto Aguirre) `_. - -* Made ``FMT_STRING`` work with ``constexpr`` ``string_view`` - (`#1589 `_). - Thanks `@scramsby (Scott Ramsby) `_. - -* Implemented a minor optimization in the format string parser - (`#1560 `_). - Thanks `@IkarusDeveloper `_. - -* Improved attribute detection - (`#1469 `_, - `#1475 `_, - `#1576 `_). - Thanks `@federico-busato (Federico) `_, - `@chronoxor (Ivan Shynkarenka) `_, - `@refnum `_. - -* Improved documentation - (`#1481 `_, - `#1523 `_). - Thanks `@JackBoosY (Jack·Boos·Yu) `_, - `@imba-tjd (谭九鼎) `_. - -* Fixed symbol visibility on Linux when compiling with ``-fvisibility=hidden`` - (`#1535 `_). - Thanks `@milianw (Milian Wolff) `_. - -* Implemented various build configuration fixes and improvements - (`#1264 `_, - `#1460 `_, - `#1534 `_, - `#1536 `_, - `#1545 `_, - `#1546 `_, - `#1566 `_, - `#1582 `_, - `#1597 `_, - `#1598 `_). - Thanks `@ambitslix (Attila M. Szilagyi) `_, - `@jwillikers (Jordan Williams) `_, - `@stac47 (Laurent Stacul) `_. - -* Fixed various warnings and compilation issues - (`#1433 `_, - `#1461 `_, - `#1470 `_, - `#1480 `_, - `#1485 `_, - `#1492 `_, - `#1493 `_, - `#1504 `_, - `#1505 `_, - `#1512 `_, - `#1515 `_, - `#1516 `_, - `#1518 `_, - `#1519 `_, - `#1520 `_, - `#1521 `_, - `#1522 `_, - `#1524 `_, - `#1530 `_, - `#1531 `_, - `#1532 `_, - `#1539 `_, - `#1547 `_, - `#1548 `_, - `#1554 `_, - `#1567 `_, - `#1568 `_, - `#1569 `_, - `#1571 `_, - `#1573 `_, - `#1575 `_, - `#1581 `_, - `#1583 `_, - `#1586 `_, - `#1587 `_, - `#1594 `_, - `#1596 `_, - `#1604 `_, - `#1606 `_, - `#1607 `_, - `#1609 `_). - Thanks `@marti4d (Chris Martin) `_, - `@iPherian `_, - `@parkertomatoes `_, - `@gsjaardema (Greg Sjaardema) `_, - `@chronoxor (Ivan Shynkarenka) `_, - `@DanielaE (Daniela Engert) `_, - `@torsten48 `_, - `@tohammer (Tobias Hammer) `_, - `@lefticus (Jason Turner) `_, - `@ryusakki (Haise) `_, - `@adnsv (Alex Denisov) `_, - `@fghzxm `_, - `@refnum `_, - `@pramodk (Pramod Kumbhar) `_, - `@Spirrwell `_, - `@scramsby (Scott Ramsby) `_. - -6.1.2 - 2019-12-11 ------------------- - -* Fixed ABI compatibility with ``libfmt.so.6.0.0`` - (`#1471 `_). - -* Fixed handling types convertible to ``std::string_view`` - (`#1451 `_). - Thanks `@denizevrenci (Deniz Evrenci) `_. - -* Made CUDA test an opt-in enabled via the ``FMT_CUDA_TEST`` CMake option. - -* Fixed sign conversion warnings - (`#1440 `_). - Thanks `@0x8000-0000 (Florin Iucha) `_. - -6.1.1 - 2019-12-04 ------------------- - -* Fixed shared library build on Windows - (`#1443 `_, - `#1445 `_, - `#1446 `_, - `#1450 `_). - Thanks `@egorpugin (Egor Pugin) `_, - `@bbolli (Beat Bolli) `_. - -* 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: - - .. code:: c++ - - #include - #include - - 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 - `_: - - ================== ========= ======= - 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 - ================== ========= ======= - - .. image:: https://user-images.githubusercontent.com/576385/ - 69767160-cdaca400-112f-11ea-9fc5-347c9f83caad.png - -* {fmt} no longer converts ``float`` arguments to ``double``. In particular this - improves the default (shortest) representation of floats and makes - ``fmt::format`` consistent with ``std::format`` specs - (`#1336 `_, - `#1353 `_, - `#1360 `_, - `#1361 `_): - - .. code:: c++ - - fmt::print("{}", 0.1f); - - prints ``0.1`` instead of ``0.10000000149011612``. - - Thanks `@orivej (Orivej Desh) `_. - -* Made floating-point formatting output consistent with ``printf``/iostreams - (`#1376 `_, - `#1417 `_). - -* Added support for 128-bit integers - (`#1287 `_): - - .. code:: c++ - - fmt::print("{}", std::numeric_limits<__int128_t>::max()); - - prints ``170141183460469231731687303715884105727``. - - Thanks `@denizevrenci (Deniz Evrenci) `_. - -* The overload of ``print`` that takes ``text_style`` is now atomic, i.e. the - output from different threads doesn't interleave - (`#1351 `_). - Thanks `@tankiJong (Tanki Zhang) `_. - -* 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 - (`#1322 `_, - `#1330 `_): - - .. code:: c++ - - #include - #include - - int main() { - std::tuple t{'a', 1, 2.0f}; - fmt::print("{}", t); - } - - prints ``('a', 1, 2.0)``. - - Thanks `@jeremyong (Jeremy Ong) `_. - -* Changed formatting of octal zero with prefix from "00" to "0": - - .. code:: c++ - - fmt::print("{:#o}", 0); - - prints ``0``. - -* The locale is now passed to ostream insertion (``<<``) operators - (`#1406 `_): - - .. code:: c++ - - #include - #include - - 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 (Daniel Laügt) `_. - -* Locale-specific number formatting now uses grouping - (`#1393 `_ - `#1394 `_). - Thanks `@skrdaniel `_. - -* Fixed handling of types with deleted implicit rvalue conversion to - ``const char**`` (`#1421 `_): - - .. code:: 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`` - (`#1286 `_). - Thanks `@agmt (Egor Seredin) `_. - -* Enum classes are no longer implicitly converted to ``int`` - (`#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 - (`#1389 `_, - `#1390 `_). - Thanks `@tajtiattila (Attila Tajti) `_. - -* {fmt} can now be installed on Linux, macOS and Windows with - `Conda `__ using its - `conda-forge `__ - `package `__ - (`#1410 `_):: - - conda install -c conda-forge fmt - - Thanks `@tdegeus (Tom de Geus) `_. - -* Added a CUDA test (`#1285 `_, - `#1317 `_). - Thanks `@luncliff (Park DongHa) `_ and - `@risa2000 `_. - -* Improved documentation (`#1276 `_, - `#1291 `_, - `#1296 `_, - `#1315 `_, - `#1332 `_, - `#1337 `_, - `#1395 `_ - `#1418 `_). - Thanks - `@waywardmonkeys (Bruce Mitchener) `_, - `@pauldreik (Paul Dreik) `_, - `@jackoalan (Jack Andersen) `_. - -* Various code improvements - (`#1358 `_, - `#1407 `_). - Thanks `@orivej (Orivej Desh) `_, - `@dpacbach (David P. Sicilia) `_, - -* Fixed compile-time format string checks for user-defined types - (`#1292 `_). - -* Worked around a false positive in ``unsigned-integer-overflow`` sanitizer - (`#1377 `_). - -* Fixed various warnings and compilation issues - (`#1273 `_, - `#1278 `_, - `#1280 `_, - `#1281 `_, - `#1288 `_, - `#1290 `_, - `#1301 `_, - `#1305 `_, - `#1306 `_, - `#1309 `_, - `#1312 `_, - `#1313 `_, - `#1316 `_, - `#1319 `_, - `#1320 `_, - `#1326 `_, - `#1328 `_, - `#1344 `_, - `#1345 `_, - `#1347 `_, - `#1349 `_, - `#1354 `_, - `#1362 `_, - `#1366 `_, - `#1364 `_, - `#1370 `_, - `#1371 `_, - `#1385 `_, - `#1388 `_, - `#1397 `_, - `#1414 `_, - `#1416 `_, - `#1422 `_ - `#1427 `_, - `#1431 `_, - `#1433 `_). - Thanks `@hhb `_, - `@gsjaardema (Greg Sjaardema) `_, - `@gabime (Gabi Melman) `_, - `@neheb (Rosen Penev) `_, - `@vedranmiletic (Vedran Miletić) `_, - `@dkavolis (Daumantas Kavolis) `_, - `@mwinterb `_, - `@orivej (Orivej Desh) `_, - `@denizevrenci (Deniz Evrenci) `_ - `@leonklingele `_, - `@chronoxor (Ivan Shynkarenka) `_, - `@kent-tri `_, - `@0x8000-0000 (Florin Iucha) `_, - `@marti4d (Chris Martin) `_. - -6.0.0 - 2019-08-26 ------------------- - -* Switched to the `MIT license - `_ - with an optional exception that allows distributing binary code without - attribution. - -* Floating-point formatting is now locale-independent by default: - - .. code:: c++ - - #include - #include - - int main() { - std::locale::global(std::locale("ru_RU.UTF-8")); - fmt::print("value = {}", 4.2); - } - - prints "value = 4.2" regardless of the locale. - - For locale-specific formatting use the ``n`` specifier: - - .. code:: 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: - - .. code:: c++ - - #define FMT_USE_GRISU 1 - #include - - 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 - `_ (`full results - `_): - - .. image:: https://user-images.githubusercontent.com/576385/ - 54883977-9fe8c000-4e28-11e9-8bde-272d122e7c52.jpg - -* Separated formatting and parsing contexts for consistency with - `C++20 std::format `_, removing the - undocumented ``basic_format_context::parse_context()`` function. - -* Added `oss-fuzz `_ support - (`#1199 `_). - Thanks `@pauldreik (Paul Dreik) `_. - -* ``formatter`` specializations now always take precedence over ``operator<<`` - (`#952 `_): - - .. code:: c++ - - #include - #include - - struct S {}; - - std::ostream& operator<<(std::ostream& os, S) { - return os << 1; - } - - template <> - struct fmt::formatter : fmt::formatter { - auto format(S, format_context& ctx) { - return formatter::format(2, ctx); - } - }; - - 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 (`#618 `_, - `#1169 `_, - `#1171 `_): - - .. code:: c++ - - #include - - auto f = fmt::compile("{}"); - std::string s = fmt::format(f, 42); // can be called multiple times to - // format different values - // s == "42" - - It moves the cost of parsing a format string outside of the format function - which can be beneficial when identically formatting many objects of the same - types. Thanks `@stryku (Mateusz Janek) `_. - -* Added experimental ``%`` format specifier that formats floating-point values - as percentages (`#1060 `_, - `#1069 `_, - `#1071 `_): - - .. code:: c++ - - auto s = fmt::format("{:.1%}", 0.42); // s == "42.0%" - - Thanks `@gawain-bolton (Gawain Bolton) `_. - -* Implemented precision for floating-point durations - (`#1004 `_, - `#1012 `_): - - .. code:: c++ - - auto s = fmt::format("{:.1}", std::chrono::duration(1.234)); - // s == 1.2s - - Thanks `@DanielaE (Daniela Engert) `_. - -* Implemented ``chrono`` format specifiers ``%Q`` and ``%q`` that give the value - and the unit respectively (`#1019 `_): - - .. code:: c++ - - auto value = fmt::format("{:%Q}", 42s); // value == "42" - auto unit = fmt::format("{:%q}", 42s); // unit == "s" - - Thanks `@DanielaE (Daniela Engert) `_. - -* Fixed handling of dynamic width in chrono formatter: - - .. code:: 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`` - (`#993 `_, - `#994 `_): - - .. code:: c++ - - #include - - std::string message = fmt::format(fmt::emphasis::bold | fg(fmt::color::red), - "The answer is {}.", 42); - - Thanks `@Naios (Denis Blank) `_. - -* 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`` (`#1121 `_): - - .. code:: c++ - - std::unique_ptr p = ...; - fmt::print("{}", fmt::ptr(p)); // prints p as a pointer - - Thanks `@sighingnow (Tao He) `_. - -* Made ``print`` and ``vprint`` report I/O errors - (`#1098 `_, - `#1099 `_). - Thanks `@BillyDonahue (Billy Donahue) `_. - -* Marked deprecated APIs with the ``[[deprecated]]`` attribute and removed - internal uses of deprecated APIs - (`#1022 `_). - Thanks `@eliaskosunen (Elias Kosunen) `_. - -* Modernized the codebase using more C++11 features and removing workarounds. - Most importantly, ``buffer_context`` is now an alias template, so - use ``buffer_context`` instead of ``buffer_context::type``. - These features require GCC 4.8 or later. - -* ``formatter`` specializations now always take precedence over implicit - conversions to ``int`` and the undocumented ``convert_to_int`` trait - is now deprecated. - -* 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 - (`#1229 `_, - `#1243 `_). - Thanks `@jackoalan (Jack Andersen) `_. - -* Improved literal-based API - (`#1254 `_). - Thanks `@sylveon (Charles Milette) `_. - -* Added support for exotic platforms without ``uintptr_t`` such as IBM i - (AS/400) which has 128-bit pointers and only 64-bit integers - (`#1059 `_). - -* Added `Sublime Text syntax highlighting config - `_ - (`#1037 `_). - Thanks `@Kronuz (Germán Méndez Bravo) `_. - -* Added the ``FMT_ENFORCE_COMPILE_STRING`` macro to enforce the use of - compile-time format strings - (`#1231 `_). - Thanks `@jackoalan (Jack Andersen) `_. - -* Stopped setting ``CMAKE_BUILD_TYPE`` if {fmt} is a subproject - (`#1081 `_). - -* Various build improvements - (`#1039 `_, - `#1078 `_, - `#1091 `_, - `#1103 `_, - `#1177 `_). - Thanks `@luncliff (Park DongHa) `_, - `@jasonszang (Jason Shuo Zang) `_, - `@olafhering (Olaf Hering) `_, - `@Lecetem `_, - `@pauldreik (Paul Dreik) `_. - -* Improved documentation - (`#1049 `_, - `#1051 `_, - `#1083 `_, - `#1113 `_, - `#1114 `_, - `#1146 `_, - `#1180 `_, - `#1250 `_, - `#1252 `_, - `#1265 `_). - Thanks `@mikelui (Michael Lui) `_, - `@foonathan (Jonathan Müller) `_, - `@BillyDonahue (Billy Donahue) `_, - `@jwakely (Jonathan Wakely) `_, - `@kaisbe (Kais Ben Salah) `_, - `@sdebionne (Samuel Debionne) `_. - -* Fixed ambiguous formatter specialization in ``fmt/ranges.h`` - (`#1123 `_). - -* Fixed formatting of a non-empty ``std::filesystem::path`` which is an - infinitely deep range of its components - (`#1268 `_). - -* Fixed handling of general output iterators when formatting characters - (`#1056 `_, - `#1058 `_). - Thanks `@abolz (Alexander Bolz) `_. - -* Fixed handling of output iterators in ``formatter`` specialization for - ranges (`#1064 `_). - -* Fixed handling of exotic character types - (`#1188 `_). - -* Made chrono formatting work with exceptions disabled - (`#1062 `_). - -* Fixed DLL visibility issues - (`#1134 `_, - `#1147 `_). - Thanks `@denchat `_. - -* Disabled the use of UDL template extension on GCC 9 - (`#1148 `_). - -* Removed misplaced ``format`` compile-time checks from ``printf`` - (`#1173 `_). - -* Fixed issues in the experimental floating-point formatter - (`#1072 `_, - `#1129 `_, - `#1153 `_, - `#1155 `_, - `#1210 `_, - `#1222 `_). - Thanks `@alabuzhev (Alex Alabuzhev) `_. - -* Fixed bugs discovered by fuzzing or during fuzzing integration - (`#1124 `_, - `#1127 `_, - `#1132 `_, - `#1135 `_, - `#1136 `_, - `#1141 `_, - `#1142 `_, - `#1178 `_, - `#1179 `_, - `#1194 `_). - Thanks `@pauldreik (Paul Dreik) `_. - -* Fixed building tests on FreeBSD and Hurd - (`#1043 `_). - Thanks `@jackyf (Eugene V. Lyubimkin) `_. - -* Fixed various warnings and compilation issues - (`#998 `_, - `#1006 `_, - `#1008 `_, - `#1011 `_, - `#1025 `_, - `#1027 `_, - `#1028 `_, - `#1029 `_, - `#1030 `_, - `#1031 `_, - `#1054 `_, - `#1063 `_, - `#1068 `_, - `#1074 `_, - `#1075 `_, - `#1079 `_, - `#1086 `_, - `#1088 `_, - `#1089 `_, - `#1094 `_, - `#1101 `_, - `#1102 `_, - `#1105 `_, - `#1107 `_, - `#1115 `_, - `#1117 `_, - `#1118 `_, - `#1120 `_, - `#1123 `_, - `#1139 `_, - `#1140 `_, - `#1143 `_, - `#1144 `_, - `#1150 `_, - `#1151 `_, - `#1152 `_, - `#1154 `_, - `#1156 `_, - `#1159 `_, - `#1175 `_, - `#1181 `_, - `#1186 `_, - `#1187 `_, - `#1191 `_, - `#1197 `_, - `#1200 `_, - `#1203 `_, - `#1205 `_, - `#1206 `_, - `#1213 `_, - `#1214 `_, - `#1217 `_, - `#1228 `_, - `#1230 `_, - `#1232 `_, - `#1235 `_, - `#1236 `_, - `#1240 `_). - Thanks `@DanielaE (Daniela Engert) `_, - `@mwinterb `_, - `@eliaskosunen (Elias Kosunen) `_, - `@morinmorin `_, - `@ricco19 (Brian Ricciardelli) `_, - `@waywardmonkeys (Bruce Mitchener) `_, - `@chronoxor (Ivan Shynkarenka) `_, - `@remyabel `_, - `@pauldreik (Paul Dreik) `_, - `@gsjaardema (Greg Sjaardema) `_, - `@rcane (Ronny Krüger) `_, - `@mocabe `_, - `@denchat `_, - `@cjdb (Christopher Di Bella) `_, - `@HazardyKnusperkeks (Björn Schäpers) `_, - `@vedranmiletic (Vedran Miletić) `_, - `@jackoalan (Jack Andersen) `_, - `@DaanDeMeyer (Daan De Meyer) `_, - `@starkmapper (Mark Stapper) `_. - -5.3.0 - 2018-12-28 ------------------- - -* Introduced experimental chrono formatting support: - - .. code:: c++ - - #include - - int main() { - using namespace std::literals::chrono_literals; - fmt::print("Default format: {} {}\n", 42s, 100ms); - fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s); - } - - 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 - (`#961 `_, - `#967 `_, - `#973 `_): - - .. code:: c++ - - #include - - int main() { - print(fg(fmt::color::crimson) | fmt::emphasis::bold, - "Hello, {}!\n", "world"); - print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) | - fmt::emphasis::underline, "Hello, {}!\n", "мир"); - print(fg(fmt::color::steel_blue) | fmt::emphasis::italic, - "Hello, {}!\n", "世界"); - } - - prints the following on modern terminals with RGB color support: - - .. image:: https://user-images.githubusercontent.com/576385/ - 50405788-b66e7500-076e-11e9-9592-7324d1f951d8.png - - Thanks `@Rakete1111 (Nicolas) `_. - -* Added support for 4-bit terminal colors - (`#968 `_, - `#974 `_) - - .. code:: c++ - - #include - - int main() { - print(fg(fmt::terminal_color::red), "stop\n"); - } - - Note that these colors vary by terminal: - - .. image:: https://user-images.githubusercontent.com/576385/ - 50405925-dbfc7e00-0770-11e9-9b85-333fab0af9ac.png - - Thanks `@Rakete1111 (Nicolas) `_. - -* Parameterized formatting functions on the type of the format string - (`#880 `_, - `#881 `_, - `#883 `_, - `#885 `_, - `#897 `_, - `#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: - - .. code:: 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 (Daniela Engert) `_. - -* Made ``std::string_view`` work as a format string - (`#898 `_): - - .. code:: c++ - - auto message = fmt::format(std::string_view("The answer is {}."), 42); - - Thanks `@DanielaE (Daniela Engert) `_. - -* Added wide string support to compile-time format string checks - (`#924 `_): - - .. code:: c++ - - print(fmt(L"{:f}"), 42); // compile-time error: invalid type specifier - - Thanks `@XZiar `_. - -* Made colored print functions work with wide strings - (`#867 `_): - - .. code:: c++ - - #include - - int main() { - print(fg(fmt::color::red), L"{}\n", 42); - } - - Thanks `@DanielaE (Daniela Engert) `_. - -* Introduced experimental Unicode support - (`#628 `_, - `#891 `_): - - .. code:: c++ - - using namespace fmt::literals; - auto s = fmt::format("{:*^5}"_u, "🤡"_u); // s == "**🤡**"_u - -* Improved locale support: - - .. code:: c++ - - #include - - struct numpunct : std::numpunct { - protected: - char do_thousands_sep() const override { return '~'; } - }; - - std::locale loc; - auto s = fmt::format(std::locale(loc, new numpunct()), "{:n}", 1234567); - // s == "1~234~567" - -* Constrained formatting functions on proper iterator types - (`#921 `_). - Thanks `@DanielaE (Daniela Engert) `_. - -* Added ``make_printf_args`` and ``make_wprintf_args`` functions - (`#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 - (`#873 `_, - `#902 `_). - Thanks `@superfunc (hollywood programmer) `_. - -* Disallowed repeated leading zeros in an argument ID: - - .. code:: c++ - - fmt::print("{000}", 42); // error - -* Reintroduced support for gcc 4.4. - -* Fixed compilation on platforms with exotic ``double`` - (`#878 `_). - -* Improved documentation - (`#164 `_, - `#877 `_, - `#901 `_, - `#906 `_, - `#979 `_). - Thanks `@kookjr (Mathew Cucuzella) `_, - `@DarkDimius (Dmitry Petrashko) `_, - `@HecticSerenity `_. - -* Added pkgconfig support which makes it easier to consume the library from - meson and other build systems - (`#916 `_). - Thanks `@colemickens (Cole Mickens) `_. - -* Various build improvements - (`#909 `_, - `#926 `_, - `#937 `_, - `#953 `_, - `#959 `_). - Thanks `@tchaikov (Kefu Chai) `_, - `@luncliff (Park DongHa) `_, - `@AndreasSchoenle (Andreas Schönle) `_, - `@hotwatermorning `_, - `@Zefz (JohanJansen) `_. - -* Improved ``string_view`` construction performance - (`#914 `_). - Thanks `@gabime (Gabi Melman) `_. - -* Fixed non-matching char types - (`#895 `_). - Thanks `@DanielaE (Daniela Engert) `_. - -* Fixed ``format_to_n`` with ``std::back_insert_iterator`` - (`#913 `_). - Thanks `@DanielaE (Daniela Engert) `_. - -* Fixed locale-dependent formatting - (`#905 `_). - -* Fixed various compiler warnings and errors - (`#882 `_, - `#886 `_, - `#933 `_, - `#941 `_, - `#931 `_, - `#943 `_, - `#954 `_, - `#956 `_, - `#962 `_, - `#965 `_, - `#977 `_, - `#983 `_, - `#989 `_). - Thanks `@Luthaf (Guillaume Fraux) `_, - `@stevenhoving (Steven Hoving) `_, - `@christinaa (Kristina Brooks) `_, - `@lgritz (Larry Gritz) `_, - `@DanielaE (Daniela Engert) `_, - `@0x8000-0000 (Sign Bit) `_, - `@liuping1997 `_. - -5.2.1 - 2018-09-21 ------------------- - -* Fixed ``visit`` lookup issues on gcc 7 & 8 - (`#870 `_). - Thanks `@medithe `_. - -* Fixed linkage errors on older gcc. - -* Prevented ``fmt/range.h`` from specializing ``fmt::basic_string_view`` - (`#865 `_, - `#868 `_). - Thanks `@hhggit (dual) `_. - -* Improved error message when formatting unknown types - (`#872 `_). - Thanks `@foonathan (Jonathan Müller) `_, - -* Disabled templated user-defined literals when compiled under nvcc - (`#875 `_). - Thanks `@CandyGumdrop (Candy Gumdrop) `_, - -* Fixed ``format_to`` formatting to ``wmemory_buffer`` - (`#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``: - - .. code:: c++ - - #define FMT_STRING_ALIAS 1 - #include - std::string answer = format(fmt("{}"), 42); - -* Added compile-time format string checks to ``format_to`` overload that takes - ``fmt::memory_buffer`` (`#783 `_): - - .. code:: 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``: - - .. code:: 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 - (`#814 `_, - `#819 `_). - Thanks `@MikePopoloski (Michael Popoloski) - `_. - -* Reduced executable size overhead for embedded targets using newlib nano by - making locale dependency optional - (`#839 `_). - Thanks `@teajay-fr (Thomas Benard) `_. - -* Keep ``noexcept`` specifier when exceptions are disabled - (`#801 `_, - `#810 `_). - Thanks `@qis (Alexej Harm) `_. - -* Fixed formatting of user-defined types providing ``operator<<`` with - ``format_to_n`` - (`#806 `_). - Thanks `@mkurdej (Marek Kurdej) `_. - -* Fixed dynamic linkage of new symbols - (`#808 `_). - -* Fixed global initialization issue - (`#807 `_): - - .. code:: c++ - - // This works on compilers with constexpr support. - static const std::string answer = fmt::format("{}", 42); - -* Fixed various compiler warnings and errors - (`#804 `_, - `#809 `_, - `#811 `_, - `#822 `_, - `#827 `_, - `#830 `_, - `#838 `_, - `#843 `_, - `#844 `_, - `#851 `_, - `#852 `_, - `#854 `_). - Thanks `@henryiii (Henry Schreiner) `_, - `@medithe `_, and - `@eliasdaler (Elias Daler) `_. - -5.1.0 - 2018-07-05 ------------------- - -* Added experimental support for RGB color output enabled with - the ``FMT_EXTENDED_COLORS`` macro: - - .. code:: c++ - - #define FMT_EXTENDED_COLORS - #define FMT_HEADER_ONLY // or compile fmt with FMT_EXTENDED_COLORS defined - #include - - fmt::print(fmt::color::steel_blue, "Some beautiful text"); - - The old API (the ``print_colored`` and ``vprint_colored`` functions and the - ``color`` enum) is now deprecated. - (`#762 `_ - `#767 `_). - thanks `@Remotion (Remo) `_. - -* Added quotes to strings in ranges and tuples - (`#766 `_). - Thanks `@Remotion (Remo) `_. - -* Made ``format_to`` work with ``basic_memory_buffer`` - (`#776 `_). - -* Added ``vformat_to_n`` and ``wchar_t`` overload of ``format_to_n`` - (`#764 `_, - `#769 `_). - -* Made ``is_range`` and ``is_tuple_like`` part of public (experimental) API - to allow specialization for user-defined types - (`#751 `_, - `#759 `_). - Thanks `@drrlvn (Dror Levin) `_. - -* Added more compilers to continuous integration and increased ``FMT_PEDANTIC`` - warning levels - (`#736 `_). - Thanks `@eliaskosunen (Elias Kosunen) `_. - -* Fixed compilation with MSVC 2013. - -* Fixed handling of user-defined types in ``format_to`` - (`#793 `_). - -* Forced linking of inline ``vformat`` functions into the library - (`#795 `_). - -* Fixed incorrect call to on_align in ``'{:}='`` - (`#750 `_). - -* Fixed floating-point formatting to a non-back_insert_iterator with sign & - numeric alignment specified - (`#756 `_). - -* Fixed formatting to an array with ``format_to_n`` - (`#778 `_). - -* Fixed formatting of more than 15 named arguments - (`#754 `_). - -* Fixed handling of compile-time strings when including ``fmt/ostream.h``. - (`#768 `_). - -* Fixed various compiler warnings and errors - (`#742 `_, - `#748 `_, - `#752 `_, - `#770 `_, - `#775 `_, - `#779 `_, - `#780 `_, - `#790 `_, - `#792 `_, - `#800 `_). - Thanks `@Remotion (Remo) `_, - `@gabime (Gabi Melman) `_, - `@foonathan (Jonathan Müller) `_, - `@Dark-Passenger (Dhruv Paranjape) `_, and - `@0x8000-0000 (Sign Bit) `_. - -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 - `_ 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 - `_. - -* Implemented ``constexpr`` parsing of format strings and `compile-time format - string checks - `_. For - example - - .. code:: c++ - - #include - - std::string s = format(fmt("{:d}"), "foo"); - - gives a compile-time error because ``d`` is an invalid specifier for strings - (`godbolt `__):: - - ... - :4:19: note: in instantiation of function template specialization 'fmt::v5::format' requested here - std::string s = format(fmt("{:d}"), "foo"); - ^ - format.h:1337:13: note: non-constexpr function 'on_error' cannot be used in a constant expression - handler.on_error("invalid type specifier"); - - Compile-time checks require relaxed ``constexpr`` (C++14 feature) support. If - the latter is not available, checks will be performed at runtime. - -* Separated format string parsing and formatting in the extension API to enable - compile-time format string processing. For example - - .. code:: c++ - - struct Answer {}; - - namespace fmt { - template <> - struct formatter { - constexpr auto parse(parse_context& ctx) { - auto it = ctx.begin(); - spec = *it; - if (spec != 'd' && spec != 's') - throw format_error("invalid specifier"); - return ++it; - } - - template - auto format(Answer, FormatContext& ctx) { - return spec == 's' ? - format_to(ctx.begin(), "{}", "fourty-two") : - format_to(ctx.begin(), "{}", 42); - } - - char spec = 0; - }; - } - - std::string s = format(fmt("{:x}"), Answer()); - - gives a compile-time error due to invalid format specifier (`godbolt - `__):: - - ... - :12:45: error: expression '' is not a constant expression - throw format_error("invalid specifier"); - -* Added `iterator support - `_: - - .. code:: c++ - - #include - #include - - std::vector out; - fmt::format_to(std::back_inserter(out), "{}", 42); - -* Added the `format_to_n - `_ - function that restricts the output to the specified number of characters - (`#298 `_): - - .. code:: c++ - - char out[4]; - fmt::format_to_n(out, sizeof(out), "{}", 12345); - // out == "1234" (without terminating '\0') - -* Added the `formatted_size - `_ - function for computing the output size: - - .. code:: c++ - - #include - - auto size = fmt::formatted_size("{}", 12345); // size == 5 - -* Improved compile times by reducing dependencies on standard headers and - providing a lightweight `core API `_: - - .. code:: c++ - - #include - - fmt::print("The answer is {}.", 42); - - See `Compile time and code bloat - `_. - -* Added the `make_format_args - `_ - function for capturing formatting arguments: - - .. code:: c++ - - // Prints formatted error message. - void vreport_error(const char *format, fmt::format_args args) { - fmt::print("Error: "); - fmt::vprint(format, args); - } - template - void report_error(const char *format, const Args & ... args) { - vreport_error(format, fmt::make_format_args(args...)); - } - -* Added the ``make_printf_args`` function for capturing ``printf`` arguments - (`#687 `_, - `#694 `_). - Thanks `@Kronuz (Germán Méndez Bravo) `_. - -* Added prefix ``v`` to non-variadic functions taking ``format_args`` to - distinguish them from variadic ones: - - .. code:: c++ - - std::string vformat(string_view format_str, format_args args); - - template - 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`` (`#735 `_): - - .. code:: c++ - - #include - - std::vector v = {1, 2, 3}; - fmt::print("{}", v); // prints {1, 2, 3} - - Thanks `@Remotion (Remo) `_. - -* Implemented ``wchar_t`` date and time formatting - (`#712 `_): - - .. code:: c++ - - #include - - std::time_t t = std::time(nullptr); - auto s = fmt::format(L"The date is {:%Y-%m-%d}.", *std::localtime(&t)); - - Thanks `@DanielaE (Daniela Engert) `_. - -* Provided more wide string overloads - (`#724 `_). - Thanks `@DanielaE (Daniela Engert) `_. - -* 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`` - (`#607 `_): - - .. code:: c++ - - #include - #include - - fmt::print("{}", std::experimental::string_view("foo")); - - Thanks `@virgiliofornazin (Virgilio Alexandre Fornazin) - `__. - -* Allowed mixing named and automatic arguments: - - .. code:: c++ - - fmt::format("{} {two}", 1, fmt::arg("two", 2)); - -* Removed the write API in favor of the `format API - `_ with compile-time handling of - format strings. - -* Disallowed formatting of multibyte strings into a wide character target - (`#606 `_). - -* Improved documentation - (`#515 `_, - `#614 `_, - `#617 `_, - `#661 `_, - `#680 `_). - Thanks `@ibell (Ian Bell) `_, - `@mihaitodor (Mihai Todor) `_, 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 - (`#636 `_). - -* Removed unnecessary ``fmt/`` prefix in includes - (`#397 `_). - Thanks `@chronoxor (Ivan Shynkarenka) `_. - -* 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`` - (`#641 `_). - Thanks `@cowo78 (Giuseppe Corbelli) `_. - -* Added Gradle build file ``support/build.gradle`` - (`#649 `_). - Thanks `@luncliff (Park DongHa) `_. - -* Removed ``FMT_CPPFORMAT`` CMake option. - -* Fixed a name conflict with the macro ``CHAR_WIDTH`` in glibc - (`#616 `_). - Thanks `@aroig (Abdó Roig-Maranges) `_. - -* Fixed handling of nested braces in ``fmt::join`` - (`#638 `_). - -* Added ``SOURCELINK_SUFFIX`` for compatibility with Sphinx 1.5 - (`#497 `_). - Thanks `@ginggs (Graham Inggs) `_. - -* Added a missing ``inline`` in the header-only mode - (`#626 `_). - Thanks `@aroig (Abdó Roig-Maranges) `_. - -* Fixed various compiler warnings - (`#640 `_, - `#656 `_, - `#679 `_, - `#681 `_, - `#705 `__, - `#715 `_, - `#717 `_, - `#720 `_, - `#723 `_, - `#726 `_, - `#730 `_, - `#739 `_). - Thanks `@peterbell10 `_, - `@LarsGullik `_, - `@foonathan (Jonathan Müller) `_, - `@eliaskosunen (Elias Kosunen) `_, - `@christianparpart (Christian Parpart) `_, - `@DanielaE (Daniela Engert) `_, - and `@mwinterb `_. - -* Worked around an MSVC bug and fixed several warnings - (`#653 `_). - Thanks `@alabuzhev (Alex Alabuzhev) `_. - -* Worked around GCC bug 67371 - (`#682 `_). - -* Fixed compilation with ``-fno-exceptions`` - (`#655 `_). - Thanks `@chenxiaolong (Andrew Gunnerson) `_. - -* Made ``constexpr remove_prefix`` gcc version check tighter - (`#648 `_). - -* Renamed internal type enum constants to prevent collision with poorly written - C libraries (`#644 `_). - -* Added detection of ``wostream operator<<`` - (`#650 `_). - -* Fixed compilation on OpenBSD - (`#660 `_). - Thanks `@hubslave `_. - -* Fixed compilation on FreeBSD 12 - (`#732 `_). - Thanks `@dankm `_. - -* Fixed compilation when there is a mismatch between ``-std`` options between - the library and user code - (`#664 `_). - -* Fixed compilation with GCC 7 and ``-std=c++11`` - (`#734 `_). - -* Improved generated binary code on GCC 7 and older - (`#668 `_). - -* Fixed handling of numeric alignment with no width - (`#675 `_). - -* Fixed handling of empty strings in UTF8/16 converters - (`#676 `_). - Thanks `@vgalka-sl (Vasili Galka) `_. - -* Fixed formatting of an empty ``string_view`` - (`#689 `_). - -* Fixed detection of ``string_view`` on libc++ - (`#686 `_). - -* Fixed DLL issues (`#696 `_). - Thanks `@sebkoenig `_. - -* Fixed compile checks for mixing narrow and wide strings - (`#690 `_). - -* Disabled unsafe implicit conversion to ``std::string`` - (`#729 `_). - -* Fixed handling of reused format specs (as in ``fmt::join``) for pointers - (`#725 `_). - Thanks `@mwinterb `_. - -* Fixed installation of ``fmt/ranges.h`` - (`#738 `_). - Thanks `@sv1990 `_. - -4.1.0 - 2017-12-20 ------------------- - -* Added ``fmt::to_wstring()`` in addition to ``fmt::to_string()`` - (`#559 `_). - Thanks `@alabuzhev (Alex Alabuzhev) `_. - -* Added support for C++17 ``std::string_view`` - (`#571 `_ and - `#578 `_). - Thanks `@thelostt (Mário Feroldi) `_ and - `@mwinterb `_. - -* Enabled stream exceptions to catch errors - (`#581 `_). - Thanks `@crusader-mike `_. - -* Allowed formatting of class hierarchies with ``fmt::format_arg()`` - (`#547 `_). - Thanks `@rollbear (Björn Fahller) `_. - -* Removed limitations on character types - (`#563 `_). - Thanks `@Yelnats321 (Elnar Dakeshov) `_. - -* Conditionally enabled use of ``std::allocator_traits`` - (`#583 `_). - Thanks `@mwinterb `_. - -* Added support for ``const`` variadic member function emulation with - ``FMT_VARIADIC_CONST`` (`#591 `_). - Thanks `@ludekvodicka (Ludek Vodicka) `_. - -* Various bugfixes: bad overflow check, unsupported implicit type conversion - when determining formatting function, test segfaults - (`#551 `_), ill-formed macros - (`#542 `_) and ambiguous overloads - (`#580 `_). - Thanks `@xylosper (Byoung-young Lee) `_. - -* Prevented warnings on MSVC (`#605 `_, - `#602 `_, and - `#545 `_), - clang (`#582 `_), - GCC (`#573 `_), - various conversion warnings (`#609 `_, - `#567 `_, - `#553 `_ and - `#553 `_), and added ``override`` and - ``[[noreturn]]`` (`#549 `_ and - `#555 `_). - Thanks `@alabuzhev (Alex Alabuzhev) `_, - `@virgiliofornazin (Virgilio Alexandre Fornazin) - `_, - `@alexanderbock (Alexander Bock) `_, - `@yumetodo `_, - `@VaderY (Császár Mátyás) `_, - `@jpcima (JP Cimalando) `_, - `@thelostt (Mário Feroldi) `_, and - `@Manu343726 (Manu Sánchez) `_. - -* Improved CMake: Used ``GNUInstallDirs`` to set installation location - (`#610 `_) and fixed warnings - (`#536 `_ and - `#556 `_). - Thanks `@mikecrowe (Mike Crowe) `_, - `@evgen231 `_ and - `@henryiii (Henry Schreiner) `_. - -4.0.0 - 2017-06-27 ------------------- - -* Removed old compatibility headers ``cppformat/*.h`` and CMake options - (`#527 `_). - Thanks `@maddinat0r (Alex Martin) `_. - -* Added ``string.h`` containing ``fmt::to_string()`` as alternative to - ``std::to_string()`` as well as other string writer functionality - (`#326 `_ and - `#441 `_): - - .. code:: c++ - - #include "fmt/string.h" - - std::string answer = fmt::to_string(42); - - Thanks to `@glebov-andrey (Andrey Glebov) - `_. - -* Moved ``fmt::printf()`` to new ``printf.h`` header and allowed ``%s`` as - generic specifier (`#453 `_), - made ``%.f`` more conformant to regular ``printf()`` - (`#490 `_), added custom writer - support (`#476 `_) and implemented - missing custom argument formatting - (`#339 `_ and - `#340 `_): - - .. code:: c++ - - #include "fmt/printf.h" - - // %s format specifier can be used with any argument type. - fmt::printf("%s", 42); - - Thanks `@mojoBrendan `_, - `@manylegged (Arthur Danskin) `_ and - `@spacemoose (Glen Stark) `_. - See also `#360 `_, - `#335 `_ and - `#331 `_. - -* Added ``container.h`` containing a ``BasicContainerWriter`` - to write to containers like ``std::vector`` - (`#450 `_). - Thanks `@polyvertex (Jean-Charles Lefebvre) `_. - -* Added ``fmt::join()`` function that takes a range and formats - its elements separated by a given string - (`#466 `_): - - .. code:: c++ - - #include "fmt/format.h" - - std::vector v = {1.2, 3.4, 5.6}; - // Prints "(+01.20, +03.40, +05.60)". - fmt::print("({:+06.2f})", fmt::join(v.begin(), v.end(), ", ")); - - Thanks `@olivier80 `_. - -* Added support for custom formatting specifications to simplify customization - of built-in formatting (`#444 `_). - Thanks `@polyvertex (Jean-Charles Lefebvre) `_. - See also `#439 `_. - -* Added ``fmt::format_system_error()`` for error code formatting - (`#323 `_ and - `#526 `_). - Thanks `@maddinat0r (Alex Martin) `_. - -* Added thread-safe ``fmt::localtime()`` and ``fmt::gmtime()`` - as replacement for the standard version to ``time.h`` - (`#396 `_). - Thanks `@codicodi `_. - -* Internal improvements to ``NamedArg`` and ``ArgLists`` - (`#389 `_ and - `#390 `_). - Thanks `@chronoxor `_. - -* Fixed crash due to bug in ``FormatBuf`` - (`#493 `_). - Thanks `@effzeh `_. See also - `#480 `_ and - `#491 `_. - -* Fixed handling of wide strings in ``fmt::StringWriter``. - -* Improved compiler error messages - (`#357 `_). - -* Fixed various warnings and issues with various compilers - (`#494 `_, - `#499 `_, - `#483 `_, - `#485 `_, - `#482 `_, - `#475 `_, - `#473 `_ and - `#414 `_). - Thanks `@chronoxor `_, - `@zhaohuaxishi `_, - `@pkestene (Pierre Kestener) `_, - `@dschmidt (Dominik Schmidt) `_ and - `@0x414c (Alexey Gorishny) `_ . - -* Improved CMake: targets are now namespaced - (`#511 `_ and - `#513 `_), supported header-only - ``printf.h`` (`#354 `_), fixed issue - with minimal supported library subset - (`#418 `_, - `#419 `_ and - `#420 `_). - Thanks `@bjoernthiel (Bjoern Thiel) `_, - `@niosHD (Mario Werner) `_, - `@LogicalKnight (Sean LK) `_ and - `@alabuzhev (Alex Alabuzhev) `_. - -* Improved documentation. Thanks to - `@pwm1234 (Phil) `_ for - `#393 `_. - -3.0.2 - 2017-06-14 ------------------- - -* Added ``FMT_VERSION`` macro - (`#411 `_). - -* Used ``FMT_NULL`` instead of literal ``0`` - (`#409 `_). - Thanks `@alabuzhev (Alex Alabuzhev) `_. - -* Added extern templates for ``format_float`` - (`#413 `_). - -* Fixed implicit conversion issue - (`#507 `_). - -* Fixed signbit detection (`#423 `_). - -* Fixed naming collision (`#425 `_). - -* Fixed missing intrinsic for C++/CLI - (`#457 `_). - Thanks `@calumr (Calum Robinson) `_ - -* Fixed Android detection (`#458 `_). - Thanks `@Gachapen (Magnus Bjerke Vik) `_. - -* Use lean ``windows.h`` if not in header-only mode - (`#503 `_). - Thanks `@Quentin01 (Quentin Buathier) `_. - -* Fixed issue with CMake exporting C++11 flag - (`#445 `_). - Thanks `@EricWF (Eric) `_. - -* Fixed issue with nvcc and MSVC compiler bug and MinGW - (`#505 `_). - -* Fixed DLL issues (`#469 `_ and - `#502 `_). - Thanks `@richardeakin (Richard Eakin) `_ and - `@AndreasSchoenle (Andreas Schönle) `_. - -* Fixed test compilation under FreeBSD - (`#433 `_). - -* Fixed various warnings (`#403 `_, - `#410 `_ and - `#510 `_). - Thanks `@Lecetem `_, - `@chenhayat (Chen Hayat) `_ and - `@trozen `_. - -* Worked around a broken ``__builtin_clz`` in clang with MS codegen - (`#519 `_). - -* Removed redundant include - (`#479 `_). - -* Fixed documentation issues. - -3.0.1 - 2016-11-01 ------------------- -* Fixed handling of thousands separator - (`#353 `_). - -* Fixed handling of ``unsigned char`` strings - (`#373 `_). - -* Corrected buffer growth when formatting time - (`#367 `_). - -* Removed warnings under MSVC and clang - (`#318 `_, - `#250 `_, also merged - `#385 `_ and - `#361 `_). - Thanks `@jcelerier (Jean-Michaël Celerier) `_ - and `@nmoehrle (Nils Moehrle) `_. - -* Fixed compilation issues under Android - (`#327 `_, - `#345 `_ and - `#381 `_), - FreeBSD (`#358 `_), - Cygwin (`#388 `_), - MinGW (`#355 `_) as well as other - issues (`#350 `_, - `#366 `_, - `#348 `_, - `#402 `_, - `#405 `_). - Thanks to `@dpantele (Dmitry) `_, - `@hghwng (Hugh Wang) `_, - `@arvedarved (Tilman Keskinöz) `_, - `@LogicalKnight (Sean) `_ and - `@JanHellwig (Jan Hellwig) `_. - -* Fixed some documentation issues and extended specification - (`#320 `_, - `#333 `_, - `#347 `_, - `#362 `_). - Thanks to `@smellman (Taro Matsuzawa aka. btm) - `_. - -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 - (`#307 `_). - Library headers are now located in the ``fmt`` directory: - - .. code:: 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 `_-like - `date and time formatting `_ - (`#283 `_): - - .. code:: 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``: - - .. code:: 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 - `_ - (`#235 `_). - -* Added support for locale-specific integer formatting with the ``n`` specifier - (`#305 `_): - - .. code:: 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 (`#265 `_): - - .. code:: 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 - (`#255 `_): - - .. code:: c++ - - fmt::printf("%d", std::numeric_limits::max()); - - Note that it would be an undefined behavior in ``std::printf``. - -* Added initial support for custom formatters - (`#231 `_). - -* Fixed detection of user-defined literal support on Intel C++ compiler - (`#311 `_, - `#312 `_). - Thanks to `@dean0x7d (Dean Moldovan) `_ and - `@speth (Ray Speth) `_. - -* Reduced compile time - (`#243 `_, - `#249 `_, - `#317 `_): - - .. image:: https://cloud.githubusercontent.com/assets/4831417/11614060/ - b9e826d2-9c36-11e5-8666-d4131bf503ef.png - - .. image:: https://cloud.githubusercontent.com/assets/4831417/11614080/ - 6ac903cc-9c37-11e5-8165-26df6efae364.png - - Thanks to `@dean0x7d (Dean Moldovan) `_. - -* Compile test fixes (`#313 `_). - Thanks to `@dean0x7d (Dean Moldovan) `_. - -* Documentation fixes (`#239 `_, - `#248 `_, - `#252 `_, - `#258 `_, - `#260 `_, - `#301 `_, - `#309 `_). - Thanks to `@ReadmeCritic `_ - `@Gachapen (Magnus Bjerke Vik) `_ and - `@jwilk (Jakub Wilk) `_. - -* Fixed compiler and sanitizer warnings - (`#244 `_, - `#256 `_, - `#259 `_, - `#263 `_, - `#274 `_, - `#277 `_, - `#286 `_, - `#291 `_, - `#296 `_, - `#308 `_) - Thanks to `@mwinterb `_, - `@pweiskircher (Patrik Weiskircher) `_, - `@Naios `_. - -* Improved compatibility with Windows Store apps - (`#280 `_, - `#285 `_) - Thanks to `@mwinterb `_. - -* Added tests of compatibility with older C++ standards - (`#273 `_). - Thanks to `@niosHD `_. - -* Fixed Android build (`#271 `_). - Thanks to `@newnon `_. - -* Changed ``ArgMap`` to be backed by a vector instead of a map. - (`#261 `_, - `#262 `_). - Thanks to `@mwinterb `_. - -* Added ``fprintf`` overload that writes to a ``std::ostream`` - (`#251 `_). - Thanks to `nickhutchinson (Nicholas Hutchinson) `_. - -* Export symbols when building a Windows DLL - (`#245 `_). - Thanks to `macdems (Maciek Dems) `_. - -* Fixed compilation on Cygwin (`#304 `_). - -* Implemented a workaround for a bug in Apple LLVM version 4.2 of clang - (`#276 `_). - -* Implemented a workaround for Google Test bug - `#705 `_ on gcc 6 - (`#268 `_). - Thanks to `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 - (`#299 `_). - Thanks to `@niosHD `_. - -* Documentation fixes (`#252 `_). - -2.1.0 - 2016-03-21 ------------------- - -* Project layout and build system improvements - (`#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 to `@niosHD `_. - -2.0.1 - 2016-03-13 ------------------- - -* Improved CMake find and package support - (`#264 `_). - Thanks to `@niosHD `_. - -* Fix compile error with Android NDK and mingw32 - (`#241 `_). - Thanks to `@Gachapen (Magnus Bjerke Vik) `_. - -* Documentation fixes - (`#248 `_, - `#260 `_). - -2.0.0 - 2015-12-01 ------------------- - -General -~~~~~~~ - -* [Breaking] Named arguments - (`#169 `_, - `#173 `_, - `#174 `_): - - .. code:: c++ - - fmt::print("The answer is {answer}.", fmt::arg("answer", 42)); - - Thanks to `@jamboree `_. - -* [Experimental] User-defined literals for format and named arguments - (`#204 `_, - `#206 `_, - `#207 `_): - - .. code:: c++ - - using namespace fmt::literals; - fmt::print("The answer is {answer}.", "answer"_a=42); - - Thanks to `@dean0x7d (Dean Moldovan) `_. - -* [Breaking] Formatting of more than 16 arguments is now supported when using - variadic templates - (`#141 `_). - Thanks to `@Shauren `_. - -* Runtime width specification - (`#168 `_): - - .. code:: c++ - - fmt::format("{0:{1}}", 42, 5); // gives " 42" - - Thanks to `@jamboree `_. - -* [Breaking] Enums are now formatted with an overloaded ``std::ostream`` insertion - operator (``operator<<``) if available - (`#232 `_). - -* [Breaking] Changed default ``bool`` format to textual, "true" or "false" - (`#170 `_): - - .. code:: c++ - - fmt::print("{}", true); // prints "true" - - To print ``bool`` as a number use numeric format specifier such as ``d``: - - .. code:: 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" - (`#223 `_): - - .. code:: c++ - - fmt::printf("%s", true); // prints "true" - - Thanks to `@LarsGullik `_. - -* [Breaking] ``signed char`` and ``unsigned char`` are now formatted as integers by default - (`#217 `_). - -* [Breaking] Pointers to C strings can now be formatted with the ``p`` specifier - (`#223 `_): - - .. code:: c++ - - fmt::print("{:p}", "test"); // prints pointer value - - Thanks to `@LarsGullik `_. - -* [Breaking] ``fmt::printf`` and ``fmt::sprintf`` now print null pointers as ``(nil)`` - and null strings as ``(null)`` for consistency with glibc - (`#226 `_). - Thanks to `@LarsGullik `_. - -* [Breaking] ``fmt::(s)printf`` now supports formatting of objects of user-defined types - that provide an overloaded ``std::ostream`` insertion operator (``operator<<``) - (`#201 `_): - - .. code:: 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 - (`#140 `_). - Thanks to `@polyvertex (Jean-Charles Lefebvre) `_. - -* [Breaking] Improved compatibility between ``BasicStringRef`` and - `std::experimental::basic_string_view - `_ - (`#100 `_, - `#159 `_, - `#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 - (`#185 `_). - -* New CMake options ``FMT_DOC``, ``FMT_INSTALL`` and ``FMT_TEST`` to control - generation of ``doc``, ``install`` and ``test`` targets respectively, on by default - (`#197 `_, - `#198 `_, - `#200 `_). - Thanks to `@maddinat0r (Alex Martin) `_. - -* ``noexcept`` is now used when compiling with MSVC2015 - (`#215 `_). - Thanks to `@dmkrepo (Dmitriy) `_. - -* Added an option to disable use of ``windows.h`` when ``FMT_USE_WINDOWS_H`` - is defined as 0 before including ``format.h`` - (`#171 `_). - Thanks to `@alfps (Alf P. Steinbach) `_. - -* [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 - (`#152 `_, - `#153 `_, - `#154 `_). - Thanks to `@DevO2012 `_. - -* Improved support for custom character types - (`#171 `_). - Thanks to `@alfps (Alf P. Steinbach) `_. - -* Added an option to disable use of IOStreams when ``FMT_USE_IOSTREAMS`` - is defined as 0 before including ``format.h`` - (`#205 `_, - `#208 `_). - Thanks to `@JodiTheTigger `_. - -* Improved detection of ``isnan``, ``isinf`` and ``signbit``. - -Optimization -~~~~~~~~~~~~ - -* Made formatting of user-defined types more efficient with a custom stream buffer - (`#92 `_, - `#230 `_). - Thanks to `@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 - (`#186 `_). - -* [Breaking] Reduced `compiled code size - `_ - (`#143 `_, - `#149 `_). - -Distribution -~~~~~~~~~~~~ - -* [Breaking] Headers are now installed in - ``${CMAKE_INSTALL_PREFIX}/include/cppformat`` - (`#178 `_). - Thanks to `@jackyf (Eugene V. Lyubimkin) `_. - -* [Breaking] Changed the library name from ``format`` to ``cppformat`` - for consistency with the project name and to avoid potential conflicts - (`#178 `_). - Thanks to `@jackyf (Eugene V. Lyubimkin) `_. - -* C++ Format is now available in `Debian `_ GNU/Linux - (`stretch `_, - `sid `_) and - derived distributions such as - `Ubuntu `_ 15.10 and later - (`#155 `_):: - - $ sudo apt-get install libcppformat1-dev - - Thanks to `@jackyf (Eugene V. Lyubimkin) `_. - -* `Packages for Fedora and RHEL `_ - are now available. Thanks to Dave Johansen. - -* C++ Format can now be installed via `Homebrew `_ on OS X - (`#157 `_):: - - $ brew install cppformat - - Thanks to `@ortho `_, Anatoliy Bulukin. - -Documentation -~~~~~~~~~~~~~ - -* Migrated from ReadTheDocs to GitHub Pages for better responsiveness - and reliability - (`#128 `_). - New documentation address is http://cppformat.github.io/. - - -* Added `Building the documentation - `_ - section to the documentation. - -* Documentation build script is now compatible with Python 3 and newer pip versions. - (`#189 `_, - `#209 `_). - Thanks to `@JodiTheTigger `_ and - `@xentec `_. - -* Documentation fixes and improvements - (`#36 `_, - `#75 `_, - `#125 `_, - `#160 `_, - `#161 `_, - `#162 `_, - `#165 `_, - `#210 `_). - Thanks to `@syohex (Syohei YOSHIDA) `_ and - bug reporters. - -* Fixed out-of-tree documentation build - (`#177 `_). - Thanks to `@jackyf (Eugene V. Lyubimkin) `_. - -Fixes -~~~~~ - -* Fixed ``initializer_list`` detection - (`#136 `_). - Thanks to `@Gachapen (Magnus Bjerke Vik) `_. - -* [Breaking] Fixed formatting of enums with numeric format specifiers in - ``fmt::(s)printf`` - (`#131 `_, - `#139 `_): - - .. code:: c++ - - enum { ANSWER = 42 }; - fmt::printf("%d", ANSWER); - - Thanks to `@Naios `_. - -* Improved compatibility with old versions of MinGW - (`#129 `_, - `#130 `_, - `#132 `_). - Thanks to `@cstamford (Christopher Stamford) `_. - -* Fixed a compile error on MSVC with disabled exceptions - (`#144 `_). - -* Added a workaround for broken implementation of variadic templates in MSVC2012 - (`#148 `_). - -* Placed the anonymous namespace within ``fmt`` namespace for the header-only - configuration - (`#171 `_). - Thanks to `@alfps (Alf P. Steinbach) `_. - -* Fixed issues reported by Coverity Scan - (`#187 `_, - `#192 `_). - -* Implemented a workaround for a name lookup bug in MSVC2010 - (`#188 `_). - -* Fixed compiler warnings - (`#95 `_, - `#96 `_, - `#114 `_, - `#135 `_, - `#142 `_, - `#145 `_, - `#146 `_, - `#158 `_, - `#163 `_, - `#175 `_, - `#190 `_, - `#191 `_, - `#194 `_, - `#196 `_, - `#216 `_, - `#218 `_, - `#220 `_, - `#229 `_, - `#233 `_, - `#234 `_, - `#236 `_, - `#281 `_, - `#289 `_). - Thanks to `@seanmiddleditch (Sean Middleditch) `_, - `@dixlorenz (Dix Lorenz) `_, - `@CarterLi (李通洲) `_, - `@Naios `_, - `@fmatthew5876 (Matthew Fioravante) `_, - `@LevskiWeng (Levski Weng) `_, - `@rpopescu `_, - `@gabime (Gabi Melman) `_, - `@cubicool (Jeremy Moles) `_, - `@jkflying (Julian Kent) `_, - `@LogicalKnight (Sean L) `_, - `@inguin (Ingo van Lil) `_ and - `@Jopie64 (Johan) `_. - -* Fixed portability issues (mostly causing test failures) on ARM, ppc64, ppc64le, - s390x and SunOS 5.11 i386 - (`#138 `_, - `#179 `_, - `#180 `_, - `#202 `_, - `#225 `_, - `Red Hat Bugzilla Bug 1260297 `_). - Thanks to `@Naios `_, - `@jackyf (Eugene V. Lyubimkin) `_ and Dave Johansen. - -* Fixed a name conflict with macro ``free`` defined in - ``crtdbg.h`` when ``_CRTDBG_MAP_ALLOC`` is set - (`#211 `_). - -* Fixed shared library build on OS X - (`#212 `_). - Thanks to `@dean0x7d (Dean Moldovan) `_. - -* Fixed an overload conflict on MSVC when ``/Zc:wchar_t-`` option is specified - (`#214 `_). - Thanks to `@slavanap (Vyacheslav Napadovsky) `_. - -* Improved compatibility with MSVC 2008 - (`#236 `_). - Thanks to `@Jopie64 (Johan) `_. - -* Improved compatibility with bcc32 - (`#227 `_). - -* Fixed ``static_assert`` detection on Clang - (`#228 `_). - Thanks to `@dean0x7d (Dean Moldovan) `_. - -1.1.0 - 2015-03-06 ------------------- - -* Added ``BasicArrayWriter``, a class template that provides operations for - formatting and writing data into a fixed-size array - (`#105 `_ and - `#122 `_): - - .. code:: c++ - - char buffer[100]; - fmt::ArrayWriter w(buffer); - w.write("The answer is {}", 42); - -* Added `0 A.D. `_ and `PenUltima Online (POL) - `_ to the list of notable projects using C++ Format. - -* C++ Format now uses MSVC intrinsics for better formatting performance - (`#115 `_, - `#116 `_, - `#118 `_ and - `#121 `_). - Previously these optimizations where only used on GCC and Clang. - Thanks to `@CarterLi `_ and - `@objectx `_. - -* CMake install target (`#119 `_). - Thanks to `@TrentHouliston `_. - - You can now install C++ Format with ``make install`` command. - -* Improved `Biicode `_ support - (`#98 `_ and - `#104 `_). Thanks to - `@MariadeAnton `_ and - `@franramirez688 `_. - -* Improved support for building with `Android NDK - `_ - (`#107 `_). - Thanks to `@newnon `_. - - The `android-ndk-example `_ - repository provides and example of using C++ Format with Android NDK: - - .. image:: https://raw.githubusercontent.com/fmtlib/android-ndk-example/ - master/screenshot.png - -* Improved documentation of ``SystemError`` and ``WindowsError`` - (`#54 `_). - -* Various code improvements - (`#110 `_, - `#111 `_ - `#112 `_). - Thanks to `@CarterLi `_. - -* Improved compile-time errors when formatting wide into narrow strings - (`#117 `_). - -* Fixed ``BasicWriter::write`` without formatting arguments when C++11 support - is disabled (`#109 `_). - -* Fixed header-only build on OS X with GCC 4.9 - (`#124 `_). - -* Fixed packaging issues (`#94 `_). - -* Added `changelog `_ - (`#103 `_). - -1.0.0 - 2015-02-05 ------------------- - -* Add support for a header-only configuration when ``FMT_HEADER_ONLY`` is - defined before including ``format.h``: - - .. code:: c++ - - #define FMT_HEADER_ONLY - #include "format.h" - -* Compute string length in the constructor of ``BasicStringRef`` - instead of the ``size`` method - (`#79 `_). - This eliminates size computation for string literals on reasonable optimizing - compilers. - -* Fix formatting of types with overloaded ``operator <<`` for ``std::wostream`` - (`#86 `_): - - .. code:: c++ - - fmt::format(L"The date is {0}", Date(2012, 12, 9)); - -* Fix linkage of tests on Arch Linux - (`#89 `_). - -* Allow precision specifier for non-float arguments - (`#90 `_): - - .. code:: c++ - - fmt::print("{:.3}\n", "Carpet"); // prints "Car" - -* Fix build on Android NDK - (`#93 `_) - -* Improvements to documentation build procedure. - -* Remove ``FMT_SHARED`` CMake variable in favor of standard `BUILD_SHARED_LIBS - `_. - -* 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: - - .. code:: c++ - - fmt::Writer w; - - New code: - - .. code:: c++ - - fmt::MemoryWriter w; - - If you pass ``fmt::Writer`` by reference, you can continue to do so: - - .. code:: c++ - - void f(fmt::Writer &w); - - This doesn't affect the formatting API. - -* Support for custom memory allocators - (`#69 `_) - -* Formatting functions now accept `signed char` and `unsigned char` strings as - arguments (`#73 `_): - - .. code:: c++ - - auto s = format("GLSL version: {}", glGetString(GL_VERSION)); - -* Reduced code bloat. According to the new `benchmark results - `_, - 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 `_: - - .. |old| image:: https://cloud.githubusercontent.com/assets/576385/4792130/ - cd256436-5de3-11e4-9a62-c077d0c2b003.png - - .. |new| image:: https://cloud.githubusercontent.com/assets/576385/4792131/ - cd29896c-5de3-11e4-8f59-cac952942bf0.png - - +-------+-------+ - | Old | New | - +-------+-------+ - | |old| | |new| | - +-------+-------+ - -0.11.0 - 2014-08-21 -------------------- - -* Safe printf implementation with a POSIX extension for positional arguments: - - .. code:: 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 `#55 `_): - - .. code:: 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: - - .. code:: 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: - - .. code:: c++ - - std::string s = format("The answer is {}.", 42); - - Previously it required 2 function calls: - - .. code:: 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``: - - .. code:: 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 `#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): - - .. code:: 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``: - - .. code:: 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: - - .. code:: 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``: - - .. code:: 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 - - .. 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 '': 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