mirror of
https://github.com/fmtlib/fmt.git
synced 2025-12-24 12:35:00 +08:00
5286 lines
202 KiB
Markdown
5286 lines
202 KiB
Markdown
# 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 and @AlexGuteniev.
|
||
- Fixed an error about partial specialization of `formatter<string>`
|
||
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.
|
||
- Made `fmt::to_string` work with types that have `format_as`
|
||
overloads ([#3575](https://github.com/fmtlib/fmt/pull/3575)).
|
||
Thanks @phprus.
|
||
- Made `formatted_size` work with integral format specifiers at
|
||
compile time ([#3591](https://github.com/fmtlib/fmt/pull/3591)).
|
||
Thanks @elbeno.
|
||
- Fixed a warning about the `no_unique_address` attribute on clang-cl
|
||
([#3599](https://github.com/fmtlib/fmt/pull/3599)). Thanks @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.
|
||
- Added OpenSSF Scorecard analysis
|
||
([#3530](https://github.com/fmtlib/fmt/issues/3530),
|
||
[#3571](https://github.com/fmtlib/fmt/pull/3571)). Thanks @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.
|
||
|
||
- Added formatters for proxy references to elements of
|
||
`std::vector<bool>` and `std::bitset<N>`
|
||
([#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 <vector>
|
||
#include <fmt/std.h>
|
||
|
||
int main() {
|
||
auto v = std::vector<bool>{true};
|
||
fmt::print("{}", v[0]);
|
||
}
|
||
```
|
||
|
||
Thanks @phprus and @felix642.
|
||
|
||
- Fixed an ambiguous formatter specialization for containers that look
|
||
like container adaptors such as `boost::flat_set`
|
||
([#3556](https://github.com/fmtlib/fmt/issues/3556),
|
||
[#3561](https://github.com/fmtlib/fmt/pull/3561)). Thanks @5chmidti.
|
||
|
||
- Fixed compilation when formatting durations not convertible from
|
||
`std::chrono::seconds`
|
||
([#3430](https://github.com/fmtlib/fmt/pull/3430)). Thanks @patlkli.
|
||
|
||
- Made the `formatter` specialization for `char*` const-correct
|
||
([#3432](https://github.com/fmtlib/fmt/pull/3432)). Thanks @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.
|
||
|
||
- Improved the floating-point formatter
|
||
([#3448](https://github.com/fmtlib/fmt/pull/3448),
|
||
[#3450](https://github.com/fmtlib/fmt/pull/3450)).
|
||
Thanks @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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- 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 and @hmbj.
|
||
|
||
- Added support for the `?` format specifier to
|
||
`std::filesystem::path` and made the default unescaped for
|
||
consistency with strings.
|
||
|
||
- Deprecated the wide stream overload of `printf`.
|
||
|
||
- Removed unused `basic_printf_parse_context`.
|
||
|
||
- Improved RTTI detection used when formatting exceptions
|
||
([#3468](https://github.com/fmtlib/fmt/pull/3468)). Thanks @danakj.
|
||
|
||
- Improved compatibility with VxWorks7
|
||
([#3467](https://github.com/fmtlib/fmt/pull/3467)). Thanks @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, @rlalik and @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, @glebm, @phprus, @petrmanek, @setoye and @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, @hmbj, @Minty-Meeo, @phprus, @TobiSchluter,
|
||
@kieranclancy, @alexeedm, @jurihock, @Ozomahtli and @razaqq.
|
||
|
||
# 10.0.0 - 2023-05-09
|
||
|
||
- Replaced Grisu with a new floating-point formatting algorithm for
|
||
given precision ([#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:
|
||
|
||

|
||
|
||
- Red: new algorithm
|
||
- Green: new algorithm with `FMT_USE_FULL_CACHE_DRAGONBOX` defined
|
||
to 1
|
||
- Blue: old algorithm
|
||
|
||
Thanks @jk-jeon.
|
||
|
||
- Replaced `snprintf`-based hex float formatter with an internal
|
||
implementation ([#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.
|
||
|
||
- 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.
|
||
|
||
- 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, @Orvid and @DanielaE.
|
||
|
||
- Switched to the [modules CMake library](https://github.com/vitaut/modules)
|
||
which allows building {fmt} as a C++20 module with clang:
|
||
|
||
CXX=clang++ cmake -DFMT_MODULE=ON .
|
||
make
|
||
|
||
- Made `format_as` work with any user-defined type and not just enums.
|
||
For example ([godbolt](https://godbolt.org/z/b7rqhq5Kh)):
|
||
|
||
```c++
|
||
#include <fmt/format.h>
|
||
|
||
struct floaty_mc_floatface {
|
||
double value;
|
||
};
|
||
|
||
auto format_as(floaty_mc_floatface f) { return f.value; }
|
||
|
||
int main() {
|
||
fmt::print("{:8}\n", floaty_mc_floatface{0.42}); // prints " 0.42"
|
||
}
|
||
```
|
||
|
||
- Removed deprecated implicit conversions for enums and conversions to
|
||
primitive types for compatibility with `std::format` and to prevent
|
||
potential ODR violations. Use `format_as` instead.
|
||
|
||
- Added support for fill, align and width to the time point formatter
|
||
([#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 <fmt/chrono.h>
|
||
|
||
int main() {
|
||
// prints " 2023"
|
||
fmt::print("{:>8%Y}\n", std::chrono::system_clock::now());
|
||
}
|
||
```
|
||
|
||
Thanks @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 <fmt/chrono.h>
|
||
|
||
int main() {
|
||
// prints 01.234567
|
||
fmt::print("{:%S}\n", std::chrono::microseconds(1234567));
|
||
}
|
||
```
|
||
|
||
Thanks @patrickroocks @phprus and @BRevzin.
|
||
|
||
- Added precision support to `%S`
|
||
([#3148](https://github.com/fmtlib/fmt/pull/3148)). Thanks @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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- 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 <fmt/chrono.h>
|
||
|
||
int main() {
|
||
auto t = std::chrono::system_clock::from_time_t(0) -
|
||
std::chrono::milliseconds(250);
|
||
fmt::print("{:%S}\n", t); // prints 59.750000000
|
||
}
|
||
```
|
||
|
||
Thanks @ShawnZhong.
|
||
|
||
- Experimental: implemented glibc extension for padding seconds,
|
||
minutes and hours
|
||
([#2959](https://github.com/fmtlib/fmt/issues/2959),
|
||
[#3271](https://github.com/fmtlib/fmt/pull/3271)). Thanks @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 <fmt/std.h>
|
||
#include <vector>
|
||
|
||
int main() {
|
||
try {
|
||
std::vector<bool>().at(0);
|
||
} catch(const std::exception& e) {
|
||
fmt::print("{}", e);
|
||
}
|
||
}
|
||
```
|
||
|
||
prints:
|
||
|
||
vector<bool>::_M_range_check: __n (which is 0) >= this->size() (which is 0)
|
||
|
||
on libstdc++. Thanks @zach2good and @phprus.
|
||
|
||
- Moved `std::error_code` formatter from `fmt/os.h` to `fmt/std.h`.
|
||
([#3125](https://github.com/fmtlib/fmt/pull/3125)). Thanks @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 <fmt/ranges.h>
|
||
#include <stack>
|
||
#include <vector>
|
||
|
||
int main() {
|
||
auto s = std::stack<bool, std::vector<bool>>();
|
||
for (auto b: {true, false, true}) s.push(b);
|
||
fmt::print("{}\n", s); // prints [true, false, true]
|
||
}
|
||
```
|
||
|
||
Thanks @ShawnZhong.
|
||
|
||
- Added a formatter for `std::optional` to `fmt/std.h`.
|
||
Thanks @tom-huntington.
|
||
|
||
- Fixed formatting of valueless by exception variants
|
||
([#3347](https://github.com/fmtlib/fmt/pull/3347)). Thanks @TheOmegaCarrot.
|
||
|
||
- Made `fmt::ptr` accept `unique_ptr` with a custom deleter
|
||
([#3177](https://github.com/fmtlib/fmt/pull/3177)). Thanks @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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- Unified UTF transcoding
|
||
([#3416](https://github.com/fmtlib/fmt/pull/3416)). Thanks @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<std::locale>("’"));
|
||
auto s = fmt::format(loc, "{:L}", 1000);
|
||
```
|
||
|
||
where `’` is U+2019 used as a digit separator in the de_CH locale.
|
||
|
||
- Added an overload of `formatted_size` that takes a locale
|
||
([#3084](https://github.com/fmtlib/fmt/issues/3084),
|
||
[#3087](https://github.com/fmtlib/fmt/pull/3087)). Thanks @gerboengels.
|
||
|
||
- Removed the deprecated `FMT_DEPRECATED_OSTREAM`.
|
||
|
||
- Fixed a UB when using a null `std::string_view` with
|
||
`fmt::to_string` or format string compilation
|
||
([#3241](https://github.com/fmtlib/fmt/issues/3241),
|
||
[#3244](https://github.com/fmtlib/fmt/pull/3244)). Thanks @phprus.
|
||
|
||
- Added `starts_with` to the fallback `string_view` implementation
|
||
([#3080](https://github.com/fmtlib/fmt/pull/3080)). Thanks @phprus.
|
||
|
||
- Added `fmt::basic_format_string::get()` for compatibility with
|
||
`basic_format_string`
|
||
([#3111](https://github.com/fmtlib/fmt/pull/3111)). Thanks @huangqinjin.
|
||
|
||
- Added `println` for compatibility with C++23
|
||
([#3267](https://github.com/fmtlib/fmt/pull/3267)). Thanks @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 and @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, @phprus, @DavidKorczynski, @ChrisThrasher,
|
||
@FrancoisCarouge, @kennyweiss, @luzpaz, @codeinred, @Mixaill, @joycebrum,
|
||
@kevinhwang and @Vertexwahn.
|
||
|
||
- Fixed a regression in handling empty format specifiers after a colon
|
||
(`{:}`) ([#3086](https://github.com/fmtlib/fmt/pull/3086)). Thanks @oxidase.
|
||
|
||
- Worked around a broken implementation of
|
||
`std::is_constant_evaluated` in some versions of libstdc++ on clang
|
||
([#3247](https://github.com/fmtlib/fmt/issues/3247),
|
||
[#3281](https://github.com/fmtlib/fmt/pull/3281)). Thanks @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, @gsjaardema, @NewbieOrange, @EngineLessCC, @asmaloney,
|
||
@HazardyKnusperkeks, @sergiud, @Youw, @thesmurph, @czudziakm,
|
||
@Roman-Koshelev, @chronoxor, @ShawnZhong, @russelltg, @glebm, @tmartin-gh,
|
||
@Zhaojun-Liu, @louiswins and @mogemimi.
|
||
|
||
# 9.1.0 - 2022-08-27
|
||
|
||
- `fmt::formatted_size` now works at compile time
|
||
([#3026](https://github.com/fmtlib/fmt/pull/3026)). For example
|
||
([godbolt](https://godbolt.org/z/1MW5rMdf8)):
|
||
|
||
```c++
|
||
#include <fmt/compile.h>
|
||
|
||
int main() {
|
||
using namespace fmt::literals;
|
||
constexpr size_t n = fmt::formatted_size("{}"_cf, 42);
|
||
fmt::print("{}\n", n); // prints 2
|
||
}
|
||
```
|
||
|
||
Thanks @marksantaniello.
|
||
|
||
- Fixed handling of invalid UTF-8
|
||
([#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 and @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.
|
||
|
||
- 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.
|
||
|
||
- 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 <fmt/ranges.h>
|
||
#include <vector>
|
||
|
||
int main() {
|
||
auto v = std::vector{1, 2, 3};
|
||
fmt::print("{:n}\n", v); // prints 1, 2, 3
|
||
}
|
||
```
|
||
|
||
Thanks @BRevzin.
|
||
|
||
- Worked around problematic `std::string_view` constructors introduced
|
||
in C++23 ([#3030](https://github.com/fmtlib/fmt/issues/3030),
|
||
[#3050](https://github.com/fmtlib/fmt/issues/3050)). Thanks @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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- 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, @jcelerier and @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 and @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, @dimztimz, @olupton, @bernhardmgruber and @phprus.
|
||
|
||
# 9.0.0 - 2022-07-04
|
||
|
||
- Switched to the internal floating point formatter for all decimal
|
||
presentation formats. In particular this results in consistent
|
||
rounding on all platforms and removing the `s[n]printf` fallback for
|
||
decimal FP formatting.
|
||
|
||
- Compile-time floating point formatting no longer requires the
|
||
header-only mode. For example
|
||
([godbolt](https://godbolt.org/z/G37PTeG3b)):
|
||
|
||
```c++
|
||
#include <array>
|
||
#include <fmt/compile.h>
|
||
|
||
consteval auto compile_time_dtoa(double value) -> std::array<char, 10> {
|
||
auto result = std::array<char, 10>();
|
||
fmt::format_to(result.data(), FMT_COMPILE("{}"), value);
|
||
return result;
|
||
}
|
||
|
||
constexpr auto answer = compile_time_dtoa(0.42);
|
||
```
|
||
|
||
works with the default settings.
|
||
|
||
- Improved the implementation of
|
||
[Dragonbox](https://github.com/jk-jeon/dragonbox), the algorithm
|
||
used for the default floating-point formatting
|
||
([#2713](https://github.com/fmtlib/fmt/pull/2713),
|
||
[#2750](https://github.com/fmtlib/fmt/pull/2750)). Thanks @jk-jeon.
|
||
|
||
- Made `fmt::to_string` work with `__float128`. This uses the internal
|
||
FP formatter and works even on system without `__float128` support
|
||
in `[s]printf`.
|
||
|
||
- Disabled automatic `std::ostream` insertion operator (`operator<<`)
|
||
discovery when `fmt/ostream.h` is included to prevent ODR
|
||
violations. You can get the old behavior by defining
|
||
`FMT_DEPRECATED_OSTREAM` but this will be removed in the next major
|
||
release. Use `fmt::streamed` or `fmt::ostream_formatter` to enable
|
||
formatting via `std::ostream` instead.
|
||
|
||
- Added `fmt::ostream_formatter` that can be used to write `formatter`
|
||
specializations that perform formatting via `std::ostream`. For
|
||
example ([godbolt](https://godbolt.org/z/5sEc5qMsf)):
|
||
|
||
```c++
|
||
#include <fmt/ostream.h>
|
||
|
||
struct date {
|
||
int year, month, day;
|
||
|
||
friend std::ostream& operator<<(std::ostream& os, const date& d) {
|
||
return os << d.year << '-' << d.month << '-' << d.day;
|
||
}
|
||
};
|
||
|
||
template <> struct fmt::formatter<date> : ostream_formatter {};
|
||
|
||
std::string s = fmt::format("The date is {}", date{2012, 12, 9});
|
||
// s == "The date is 2012-12-9"
|
||
```
|
||
|
||
- Added the `fmt::streamed` function that takes an object and formats
|
||
it via `std::ostream`. For example
|
||
([godbolt](https://godbolt.org/z/5G3346G1f)):
|
||
|
||
```c++
|
||
#include <thread>
|
||
#include <fmt/ostream.h>
|
||
|
||
int main() {
|
||
fmt::print("Current thread id: {}\n",
|
||
fmt::streamed(std::this_thread::get_id()));
|
||
}
|
||
```
|
||
|
||
Note that `fmt/std.h` provides a `formatter` specialization for
|
||
`std::thread::id` so you don\'t need to format it via
|
||
`std::ostream`.
|
||
|
||
- Deprecated implicit conversions of unscoped enums to integers for
|
||
consistency with scoped enums.
|
||
|
||
- Added an argument-dependent lookup based `format_as` extension API
|
||
to simplify formatting of enums.
|
||
|
||
- Added experimental `std::variant` formatting support
|
||
([#2941](https://github.com/fmtlib/fmt/pull/2941)). For example
|
||
([godbolt](https://godbolt.org/z/KG9z6cq68)):
|
||
|
||
```c++
|
||
#include <variant>
|
||
#include <fmt/std.h>
|
||
|
||
int main() {
|
||
auto v = std::variant<int, std::string>(42);
|
||
fmt::print("{}\n", v);
|
||
}
|
||
```
|
||
|
||
prints:
|
||
|
||
variant(42)
|
||
|
||
Thanks @jehelset.
|
||
|
||
- Added experimental `std::filesystem::path` formatting support
|
||
([#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 <filesystem>
|
||
#include <fmt/std.h>
|
||
|
||
int main() {
|
||
fmt::print("There is no place like {}.", std::filesystem::path("/home"));
|
||
}
|
||
```
|
||
|
||
prints:
|
||
|
||
There is no place like "/home".
|
||
|
||
Thanks @phprus.
|
||
|
||
- Added a `std::thread::id` formatter to `fmt/std.h`. For example
|
||
([godbolt](https://godbolt.org/z/j1azbYf3E)):
|
||
|
||
```c++
|
||
#include <thread>
|
||
#include <fmt/std.h>
|
||
|
||
int main() {
|
||
fmt::print("Current thread id: {}\n", std::this_thread::get_id());
|
||
}
|
||
```
|
||
|
||
- Added `fmt::styled` that applies a text style to an individual
|
||
argument ([#2793](https://github.com/fmtlib/fmt/pull/2793)). For
|
||
example ([godbolt](https://godbolt.org/z/vWGW7v5M6)):
|
||
|
||
```c++
|
||
#include <fmt/chrono.h>
|
||
#include <fmt/color.h>
|
||
|
||
int main() {
|
||
auto now = std::chrono::system_clock::now();
|
||
fmt::print(
|
||
"[{}] {}: {}\n",
|
||
fmt::styled(now, fmt::emphasis::bold),
|
||
fmt::styled("error", fg(fmt::color::red)),
|
||
"something went wrong");
|
||
}
|
||
```
|
||
|
||
prints
|
||
|
||

|
||
|
||
Thanks @rbrugo.
|
||
|
||
- Made `fmt::print` overload for text styles correctly handle UTF-8
|
||
([#2681](https://github.com/fmtlib/fmt/issues/2681),
|
||
[#2701](https://github.com/fmtlib/fmt/pull/2701)). Thanks @AlexGuteniev.
|
||
|
||
- Fixed Unicode handling when writing to an ostream.
|
||
|
||
- Added support for nested specifiers to range formatting
|
||
([#2673](https://github.com/fmtlib/fmt/pull/2673)). For example
|
||
([godbolt](https://godbolt.org/z/xd3Gj38cf)):
|
||
|
||
```c++
|
||
#include <vector>
|
||
#include <fmt/ranges.h>
|
||
|
||
int main() {
|
||
fmt::print("{::#x}\n", std::vector{10, 20, 30});
|
||
}
|
||
```
|
||
|
||
prints `[0xa, 0x14, 0x1e]`.
|
||
|
||
Thanks @BRevzin.
|
||
|
||
- Implemented escaping of wide strings in ranges
|
||
([#2904](https://github.com/fmtlib/fmt/pull/2904)). Thanks @phprus.
|
||
|
||
- Added support for ranges with `begin` / `end` found via the
|
||
argument-dependent lookup
|
||
([#2807](https://github.com/fmtlib/fmt/pull/2807)). Thanks @rbrugo.
|
||
|
||
- Fixed formatting of certain kinds of ranges of ranges
|
||
([#2787](https://github.com/fmtlib/fmt/pull/2787)). Thanks @BRevzin.
|
||
|
||
- Fixed handling of maps with element types other than `std::pair`
|
||
([#2944](https://github.com/fmtlib/fmt/pull/2944)). Thanks @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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- Removed `make_args_checked` because it is no longer needed for
|
||
compile-time checks
|
||
([#2760](https://github.com/fmtlib/fmt/pull/2760)). Thanks @phprus.
|
||
|
||
- Removed the following deprecated APIs: `_format`, `arg_join`, the
|
||
`format_to` overload that takes a memory buffer, `[v]fprintf` that
|
||
takes an `ostream`.
|
||
|
||
- Removed the deprecated implicit conversion of `[const] signed char*`
|
||
and `[const] unsigned char*` to C strings.
|
||
|
||
- Removed the deprecated `fmt/locale.h`.
|
||
|
||
- Replaced the deprecated `fileno()` with `descriptor()` in
|
||
`buffered_file`.
|
||
|
||
- Moved `to_string_view` to the `detail` namespace since it\'s an
|
||
implementation detail.
|
||
|
||
- Made access mode of a created file consistent with `fopen` by
|
||
setting `S_IWGRP` and `S_IWOTH`
|
||
([#2733](https://github.com/fmtlib/fmt/pull/2733)). Thanks @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.
|
||
|
||
- 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.
|
||
|
||
- 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, @Pokechu22, @setoye, @rtobar, @rbrugo, @anoonD and
|
||
@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, @mattiasljungstrom, @kieselnb, @nathannaveen
|
||
and @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 @Tobi823, @ivan-volnov, @VasiliPupkin256,
|
||
@federico-busato, @barcharcraz, @jk-jeon, @HazardyKnusperkeks, @dalboris,
|
||
@seanm, @gsjaardema, @timsong-cpp, @seanm, @frithrah, @chronoxor, @Agga,
|
||
@madmaxoft, @JurajX, @phprus and @Dani-Hub.
|
||
|
||
# 8.1.1 - 2022-01-06
|
||
|
||
- Restored ABI compatibility with version 8.0.x
|
||
([#2695](https://github.com/fmtlib/fmt/issues/2695),
|
||
[#2696](https://github.com/fmtlib/fmt/pull/2696)). Thanks @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 and @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.
|
||
|
||
# 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 and @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 <fmt/chrono.h>
|
||
|
||
int main() {
|
||
fmt::print("{:%S}", std::chrono::milliseconds(1234));
|
||
}
|
||
```
|
||
|
||
prints \"01.234\".
|
||
|
||
Thanks @matrackif.
|
||
|
||
- Fixed handling of precision 0 when formatting chrono durations
|
||
([#2587](https://github.com/fmtlib/fmt/issues/2587),
|
||
[#2588](https://github.com/fmtlib/fmt/pull/2588)). Thanks @lukester1975.
|
||
|
||
- Fixed an overflow on invalid inputs in the `tm` formatter
|
||
([#2564](https://github.com/fmtlib/fmt/pull/2564)). Thanks @phprus.
|
||
|
||
- Added `fmt::group_digits` that formats integers with a non-localized
|
||
digit separator (comma) for groups of three digits. For example
|
||
([godbolt](https://godbolt.org/z/TxGxG9Poq)):
|
||
|
||
```c++
|
||
#include <fmt/format.h>
|
||
|
||
int main() {
|
||
fmt::print("{} dollars", fmt::group_digits(1000000));
|
||
}
|
||
```
|
||
|
||
prints \"1,000,000 dollars\".
|
||
|
||
- Added support for faint, conceal, reverse and blink text styles
|
||
([#2394](https://github.com/fmtlib/fmt/pull/2394)):
|
||
|
||
<https://user-images.githubusercontent.com/576385/147710227-c68f5317-f8fa-42c3-9123-7c4ba3c398cb.mp4>
|
||
|
||
Thanks @benit8 and @data-man.
|
||
|
||
- Added experimental support for compile-time floating point
|
||
formatting ([#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.
|
||
|
||
- 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 <fmt/format.h>
|
||
|
||
int main() {
|
||
using namespace fmt::literals;
|
||
fmt::print("{answer:s}", "answer"_a=42);
|
||
}
|
||
```
|
||
|
||
gives a compile-time error on compilers with C++20 `consteval` and
|
||
non-type template parameter support (gcc 10+) because `s` is not a
|
||
valid format specifier for an integer.
|
||
|
||
Thanks @alexezeder.
|
||
|
||
- Implemented escaping of string range elements. For example
|
||
([godbolt](https://godbolt.org/z/rKvM1vKf3)):
|
||
|
||
```c++
|
||
#include <fmt/ranges.h>
|
||
#include <vector>
|
||
|
||
int main() {
|
||
fmt::print("{}", std::vector<std::string>{"\naan"});
|
||
}
|
||
```
|
||
|
||
is now printed as:
|
||
|
||
["\naan"]
|
||
|
||
instead of:
|
||
|
||
["
|
||
aan"]
|
||
|
||
- Added an experimental `?` specifier for escaping strings.
|
||
([#2674](https://github.com/fmtlib/fmt/pull/2674)). Thanks @BRevzin.
|
||
|
||
- Switched to JSON-like representation of maps and sets for
|
||
consistency with Python\'s `str.format`. For example
|
||
([godbolt](https://godbolt.org/z/seKjoY9W5)):
|
||
|
||
```c++
|
||
#include <fmt/ranges.h>
|
||
#include <map>
|
||
|
||
int main() {
|
||
fmt::print("{}", std::map<std::string, int>{{"answer", 42}});
|
||
}
|
||
```
|
||
|
||
is now printed as:
|
||
|
||
{"answer": 42}
|
||
|
||
- Extended `fmt::join` to support C++20-only ranges
|
||
([#2549](https://github.com/fmtlib/fmt/pull/2549)). Thanks @BRevzin.
|
||
|
||
- Optimized handling of non-const-iterable ranges and implemented
|
||
initial support for non-const-formattable types.
|
||
|
||
- Disabled implicit conversions of scoped enums to integers that was
|
||
accidentally introduced in earlier versions
|
||
([#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.
|
||
|
||
- Marked `format`, `formatted_size` and `to_string` as `[[nodiscard]]`
|
||
([#2612](https://github.com/fmtlib/fmt/pull/2612)). @0x8000-0000.
|
||
|
||
- Added missing diagnostic when trying to format function and member
|
||
pointers as well as objects convertible to pointers which is
|
||
explicitly disallowed
|
||
([#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.
|
||
|
||
- Optimized writing to a contiguous buffer with `format_to_n`
|
||
([#2489](https://github.com/fmtlib/fmt/pull/2489)). Thanks @Roman-Koshelev.
|
||
|
||
- Optimized writing to non-`char` buffers
|
||
([#2477](https://github.com/fmtlib/fmt/pull/2477)). Thanks @Roman-Koshelev.
|
||
|
||
- Decimal point is now localized when using the `L` specifier.
|
||
|
||
- Improved floating point formatter implementation
|
||
([#2498](https://github.com/fmtlib/fmt/pull/2498),
|
||
[#2499](https://github.com/fmtlib/fmt/pull/2499)). Thanks @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.
|
||
|
||
- 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.
|
||
|
||
- Removed unnecessary inline namespace qualification
|
||
([#2642](https://github.com/fmtlib/fmt/issues/2642),
|
||
[#2643](https://github.com/fmtlib/fmt/pull/2643)). Thanks @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.
|
||
|
||
- 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.
|
||
|
||
- Improved `consteval` detection for MSVC
|
||
([#2559](https://github.com/fmtlib/fmt/pull/2559)). Thanks @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, @UnePierre, @zhsj, @phprus, @ericcurtin and @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,
|
||
|
||
- 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.
|
||
|
||
- Added the Bazel build system support
|
||
([#2505](https://github.com/fmtlib/fmt/pull/2505),
|
||
[#2516](https://github.com/fmtlib/fmt/pull/2516)). Thanks @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, @alexezeder and @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, @mwinterb, @cdacamar, @TrebledJ, @bodomartin, @cquammen,
|
||
@white238, @mmarkeloff, @palacaze, @jcelerier, @mborn-adi, @BrukerJWD,
|
||
@spyridon97, @phprus, @oliverlee, @joshessman-llnl, @akohlmey, @timkalu,
|
||
@olupton, @Acretock, @alexezeder, @andrewcorrigan, @lucpelletier and
|
||
@HazardyKnusperkeks.
|
||
|
||
# 8.0.1 - 2021-07-02
|
||
|
||
- Fixed the version number in the inline namespace
|
||
([#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.
|
||
- Removed dead code in FP formatter (
|
||
[#2398](https://github.com/fmtlib/fmt/pull/2398)). Thanks @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, @AidanSun05, @mattiasljungstrom, @joemmett, @erengy,
|
||
@patlkli, @gsjaardema and @phprus.
|
||
|
||
# 8.0.0 - 2021-06-21
|
||
|
||
- Enabled compile-time format string checks by default. For example
|
||
([godbolt](https://godbolt.org/z/sMxcohGjz)):
|
||
|
||
```c++
|
||
#include <fmt/core.h>
|
||
|
||
int main() {
|
||
fmt::print("{:d}", "I am not a number");
|
||
}
|
||
```
|
||
|
||
gives a compile-time error on compilers with C++20 `consteval`
|
||
support (gcc 10+, clang 11+) because `d` is not a valid format
|
||
specifier for a string.
|
||
|
||
To pass a runtime string wrap it in `fmt::runtime`:
|
||
|
||
```c++
|
||
fmt::print(fmt::runtime("{:d}"), "I am not a number");
|
||
```
|
||
|
||
- Added compile-time formatting
|
||
([#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 <fmt/compile.h>
|
||
|
||
consteval auto compile_time_itoa(int value) -> std::array<char, 10> {
|
||
auto result = std::array<char, 10>();
|
||
fmt::format_to(result.data(), FMT_COMPILE("{}"), value);
|
||
return result;
|
||
}
|
||
|
||
constexpr auto answer = compile_time_itoa(42);
|
||
```
|
||
|
||
Most of the formatting functionality is available at compile time
|
||
with a notable exception of floating-point numbers and pointers.
|
||
Thanks @alexezeder.
|
||
|
||
- Optimized handling of format specifiers during format string
|
||
compilation. For example, hexadecimal formatting (`"{:x}"`) is now
|
||
3-7x faster than before when using `format_to` with format string
|
||
compilation and a stack-allocated buffer
|
||
([#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 <fmt/compile.h>
|
||
|
||
using namespace fmt::literals;
|
||
auto s = fmt::format(FMT_COMPILE("{}"), 42); // 🙁 not modern
|
||
auto s = fmt::format("{}"_cf, 42); // 🙂 modern as hell
|
||
```
|
||
|
||
It requires compiler support for class types in non-type template
|
||
parameters (a C++20 feature) which is available in GCC 9.3+.
|
||
Thanks @alexezeder.
|
||
|
||
- Format string compilation now requires `format` functions of
|
||
`formatter` specializations for user-defined types to be `const`:
|
||
|
||
```c++
|
||
template <> struct fmt::formatter<my_type>: formatter<string_view> {
|
||
template <typename FormatContext>
|
||
auto format(my_type obj, FormatContext& ctx) const { // Note const here.
|
||
// ...
|
||
}
|
||
};
|
||
```
|
||
|
||
- Added UDL-based named argument support to format string compilation
|
||
([#2243](https://github.com/fmtlib/fmt/pull/2243),
|
||
[#2281](https://github.com/fmtlib/fmt/pull/2281)). For example:
|
||
|
||
```c++
|
||
#include <fmt/compile.h>
|
||
|
||
using namespace fmt::literals;
|
||
auto s = fmt::format(FMT_COMPILE("{answer}"), "answer"_a = 42);
|
||
```
|
||
|
||
Here the argument named \"answer\" is resolved at compile time with
|
||
no runtime overhead. Thanks @alexezeder.
|
||
|
||
- Added format string compilation support to `fmt::print`
|
||
([#2280](https://github.com/fmtlib/fmt/issues/2280),
|
||
[#2304](https://github.com/fmtlib/fmt/pull/2304)). Thanks @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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- 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 <fmt/format.h>
|
||
#include <cstddef>
|
||
#include <vector>
|
||
|
||
int main() {
|
||
auto bytes = std::vector{std::byte(4), std::byte(2)};
|
||
fmt::print("{}", fmt::join(bytes, ""));
|
||
}
|
||
```
|
||
|
||
prints \"42\".
|
||
|
||
Thanks @kamibo.
|
||
|
||
- Implemented the default format for `std::chrono::system_clock`
|
||
([#2319](https://github.com/fmtlib/fmt/issues/2319),
|
||
[#2345](https://github.com/fmtlib/fmt/pull/2345)). For example:
|
||
|
||
```c++
|
||
#include <fmt/chrono.h>
|
||
|
||
int main() {
|
||
fmt::print("{}", std::chrono::system_clock::now());
|
||
}
|
||
```
|
||
|
||
prints \"2021-06-18 15:22:00\" (the output depends on the current
|
||
date and time). Thanks @sunmy2019.
|
||
|
||
- Made more chrono specifiers locale independent by default. Use the
|
||
`'L'` specifier to get localized formatting. For example:
|
||
|
||
```c++
|
||
#include <fmt/chrono.h>
|
||
|
||
int main() {
|
||
std::locale::global(std::locale("ru_RU.UTF-8"));
|
||
auto monday = std::chrono::weekday(1);
|
||
fmt::print("{}\n", monday); // prints "Mon"
|
||
fmt::print("{:L}\n", monday); // prints "пн"
|
||
}
|
||
```
|
||
|
||
- Improved locale handling in chrono formatting
|
||
([#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.
|
||
|
||
- Deprecated `fmt/locale.h` moving the formatting functions that take
|
||
a locale to `fmt/format.h` (`char`) and `fmt/xchar` (other
|
||
overloads). This doesn\'t introduce a dependency on `<locale>` so
|
||
there is virtually no compile time effect.
|
||
|
||
- Deprecated an undocumented `format_to` overload that takes
|
||
`basic_memory_buffer`.
|
||
|
||
- Made parameter order in `vformat_to` consistent with `format_to`
|
||
([#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 <fmt/chrono.h>
|
||
|
||
int main() {
|
||
using tp = std::chrono::time_point<
|
||
std::chrono::system_clock, std::chrono::seconds>;
|
||
fmt::print("{:%S}", tp(std::chrono::seconds(42)));
|
||
}
|
||
```
|
||
|
||
prints \"42\".
|
||
|
||
- Formatting floating-point numbers no longer produces trailing zeros
|
||
by default for consistency with `std::format`. For example:
|
||
|
||
```c++
|
||
#include <fmt/core.h>
|
||
|
||
int main() {
|
||
fmt::print("{0:.3}", 1.1);
|
||
}
|
||
```
|
||
|
||
prints \"1.1\". Use the `'#'` specifier to keep trailing zeros.
|
||
|
||
- Dropped a limit on the number of elements in a range and replaced
|
||
`{}` with `[]` as range delimiters for consistency with Python\'s
|
||
`str.format`.
|
||
|
||
- The `'L'` specifier for locale-specific numeric formatting can now
|
||
be combined with presentation specifiers as in `std::format`. For
|
||
example:
|
||
|
||
```c++
|
||
#include <fmt/core.h>
|
||
#include <locale>
|
||
|
||
int main() {
|
||
std::locale::global(std::locale("fr_FR.UTF-8"));
|
||
fmt::print("{0:.2Lf}", 0.42);
|
||
}
|
||
```
|
||
|
||
prints \"0,42\". The deprecated `'n'` specifier has been removed.
|
||
|
||
- Made the `0` specifier ignored for infinity and NaN
|
||
([#2305](https://github.com/fmtlib/fmt/issues/2305),
|
||
[#2310](https://github.com/fmtlib/fmt/pull/2310)). Thanks @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.
|
||
|
||
- 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 <fmt/core.h>
|
||
|
||
int main() {
|
||
fmt::print("{:s}", true);
|
||
}
|
||
```
|
||
|
||
prints \"true\". Thanks @powercoderlol.
|
||
|
||
- Made `fmt::ptr` work with function pointers
|
||
([#2131](https://github.com/fmtlib/fmt/pull/2131)). For example:
|
||
|
||
```c++
|
||
#include <fmt/format.h>
|
||
|
||
int main() {
|
||
fmt::print("My main: {}\n", fmt::ptr(main));
|
||
}
|
||
```
|
||
|
||
Thanks @mikecrowe.
|
||
|
||
- The undocumented support for specializing `formatter` for pointer
|
||
types has been removed.
|
||
|
||
- Fixed `fmt::formatted_size` with format string compilation
|
||
([#2141](https://github.com/fmtlib/fmt/pull/2141),
|
||
[#2161](https://github.com/fmtlib/fmt/pull/2161)). Thanks @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.
|
||
|
||
- 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 <fmt/core.h>
|
||
|
||
int main() {
|
||
fmt::print("{:-<10}{}\n", "你好", "世界");
|
||
fmt::print("{:-<10}{}\n", "hello", "world");
|
||
}
|
||
```
|
||
|
||
prints
|
||
|
||

|
||
|
||
on a modern terminal.
|
||
|
||
- The experimental fast output stream (`fmt::ostream`) is now
|
||
truncated by default for consistency with `fopen`
|
||
([#2018](https://github.com/fmtlib/fmt/issues/2018)). For example:
|
||
|
||
```c++
|
||
#include <fmt/os.h>
|
||
|
||
int main() {
|
||
fmt::ostream out1 = fmt::output_file("guide");
|
||
out1.print("Zaphod");
|
||
out1.close();
|
||
fmt::ostream out2 = fmt::output_file("guide");
|
||
out2.print("Ford");
|
||
}
|
||
```
|
||
|
||
writes \"Ford\" to the file \"guide\". To preserve the old file
|
||
content if any pass `fmt::file::WRONLY | fmt::file::CREATE` flags to
|
||
`fmt::output_file`.
|
||
|
||
- Fixed moving of `fmt::ostream` that holds buffered data
|
||
([#2197](https://github.com/fmtlib/fmt/issues/2197),
|
||
[#2198](https://github.com/fmtlib/fmt/pull/2198)). Thanks @vtta.
|
||
|
||
- Replaced the `fmt::system_error` exception with a function of the
|
||
same name that constructs `std::system_error`
|
||
([#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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- Added `Allocator::max_size` support to `basic_memory_buffer`.
|
||
([#1960](https://github.com/fmtlib/fmt/pull/1960)). Thanks @phprus.
|
||
|
||
- Added wide string support to `fmt::join`
|
||
([#2236](https://github.com/fmtlib/fmt/pull/2236)). Thanks @crbrz.
|
||
|
||
- Made iterators passed to `formatter` specializations via a format
|
||
context satisfy C++20 `std::output_iterator` requirements
|
||
([#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.
|
||
|
||
- 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 and @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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- Improved build configuration
|
||
([#2026](https://github.com/fmtlib/fmt/pull/2026),
|
||
[#2122](https://github.com/fmtlib/fmt/pull/2122)).
|
||
Thanks @luncliff and @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, @fagg, @killerbot242, @jgopel, @yeswalrus, @Finkman,
|
||
@HazardyKnusperkeks, @dkavolis, @concatime, @chronoxor, @summivox, @yNeo,
|
||
@Apache-HB, @alexezeder, @toojays, @Brainy0207, @vadz, @imsherlock, @phprus,
|
||
@white238, @yafshar, @BillyDonahue, @jstaahl, @denchat, @DanielaE,
|
||
@ilyakurdyukov, @ilmai, @JessyDL, @sergiud, @mwinterb, @sven-herrmann,
|
||
@jmelas, @twoixter, @crbrz and @upsj.
|
||
|
||
- Improved documentation
|
||
([#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, @0x416c69 and @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, @alexezeder and @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.
|
||
- Fixed a sign conversion warning
|
||
([#1964](https://github.com/fmtlib/fmt/pull/1964)). Thanks @OptoCloud.
|
||
|
||
# 7.1.0 - 2020-10-25
|
||
|
||
- Switched from
|
||
[Grisu3](https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf)
|
||
to [Dragonbox](https://github.com/jk-jeon/dragonbox) for the default
|
||
floating-point formatting which gives the shortest decimal
|
||
representation with round-trip guarantee and correct rounding
|
||
([#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ū:
|
||
|
||

|
||
|
||
It is possible to get even better performance at the cost of larger
|
||
binary size by compiling with the `FMT_USE_FULL_CACHE_DRAGONBOX`
|
||
macro set to 1.
|
||
|
||
Thanks @jk-jeon.
|
||
|
||
- Added an experimental unsynchronized file output API which, together
|
||
with [format string
|
||
compilation](https://fmt.dev/latest/api.html#compile-api), can give
|
||
[5-9 times speed up compared to
|
||
fprintf](https://www.zverovich.net/2020/08/04/optimal-file-buffer-size.html)
|
||
on common platforms ([godbolt](https://godbolt.org/z/nsTcG8)):
|
||
|
||
```c++
|
||
#include <fmt/os.h>
|
||
|
||
int main() {
|
||
auto f = fmt::output_file("guide");
|
||
f.print("The answer is {}.", 42);
|
||
}
|
||
```
|
||
|
||
- Added a formatter for `std::chrono::time_point<system_clock>`
|
||
([#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 <fmt/chrono.h>
|
||
|
||
int main() {
|
||
auto now = std::chrono::system_clock::now();
|
||
fmt::print("The time is {:%H:%M:%S}.\n", now);
|
||
}
|
||
```
|
||
|
||
Thanks @adamburgess.
|
||
|
||
- Added support for ranges with non-const `begin`/`end` to `fmt::join`
|
||
([#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 <fmt/ranges.h>
|
||
#include <range/v3/view/filter.hpp>
|
||
|
||
int main() {
|
||
using std::literals::string_literals::operator""s;
|
||
auto strs = std::array{"a"s, "bb"s, "ccc"s};
|
||
auto range = strs | ranges::views::filter(
|
||
[] (const std::string &x) { return x.size() != 2; }
|
||
);
|
||
fmt::print("{}\n", fmt::join(range, ""));
|
||
}
|
||
```
|
||
|
||
prints \"accc\".
|
||
|
||
Thanks @tonyelewis.
|
||
|
||
- Added a `memory_buffer::append` overload that takes a range
|
||
([#1806](https://github.com/fmtlib/fmt/pull/1806)). Thanks @BRevzin.
|
||
|
||
- Improved handling of single code units in `FMT_COMPILE`. For
|
||
example:
|
||
|
||
```c++
|
||
#include <fmt/compile.h>
|
||
|
||
char* f(char* buf) {
|
||
return fmt::format_to(buf, FMT_COMPILE("x{}"), 42);
|
||
}
|
||
```
|
||
|
||
compiles to just ([godbolt](https://godbolt.org/z/5vncz3)):
|
||
|
||
```asm
|
||
_Z1fPc:
|
||
movb $120, (%rdi)
|
||
xorl %edx, %edx
|
||
cmpl $42, _ZN3fmt2v76detail10basic_dataIvE23zero_or_powers_of_10_32E+8(%rip)
|
||
movl $3, %eax
|
||
seta %dl
|
||
subl %edx, %eax
|
||
movzwl _ZN3fmt2v76detail10basic_dataIvE6digitsE+84(%rip), %edx
|
||
cltq
|
||
addq %rdi, %rax
|
||
movw %dx, -2(%rax)
|
||
ret
|
||
```
|
||
|
||
Here a single `mov` instruction writes `'x'` (`$120`) to the output
|
||
buffer.
|
||
|
||
- Added dynamic width support to format string compilation
|
||
([#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 <fmt/core.h>
|
||
|
||
struct how_about_no {};
|
||
|
||
int main() {
|
||
fmt::print("{}", how_about_no());
|
||
}
|
||
```
|
||
|
||
Error ([godbolt](https://godbolt.org/z/GoxM4e)):
|
||
|
||
`fmt/core.h:1438:3: error: static_assert failed due to requirement 'fmt::v7::formattable<how_about_no>()' "Cannot format an argument. To make type T formattable provide a formatter<T> specialization: https://fmt.dev/latest/api.html#udt" ...`
|
||
|
||
- Added the
|
||
[make_args_checked](https://fmt.dev/7.1.0/api.html#argument-lists)
|
||
function template that allows you to write formatting functions with
|
||
compile-time format string checks and avoid binary code bloat
|
||
([godbolt](https://godbolt.org/z/PEf9qr)):
|
||
|
||
```c++
|
||
void vlog(const char* file, int line, fmt::string_view format,
|
||
fmt::format_args args) {
|
||
fmt::print("{}: {}: ", file, line);
|
||
fmt::vprint(format, args);
|
||
}
|
||
|
||
template <typename S, typename... Args>
|
||
void log(const char* file, int line, const S& format, Args&&... args) {
|
||
vlog(file, line, format,
|
||
fmt::make_args_checked<Args...>(format, args...));
|
||
}
|
||
|
||
#define MY_LOG(format, ...) \
|
||
log(__FILE__, __LINE__, FMT_STRING(format), __VA_ARGS__)
|
||
|
||
MY_LOG("invalid squishiness: {}", 42);
|
||
```
|
||
|
||
- Replaced `snprintf` fallback with a faster internal IEEE 754 `float`
|
||
and `double` formatter for arbitrary precision. For example
|
||
([godbolt](https://godbolt.org/z/dPhWvj)):
|
||
|
||
```c++
|
||
#include <fmt/core.h>
|
||
|
||
int main() {
|
||
fmt::print("{:.500}\n", 4.9406564584124654E-324);
|
||
}
|
||
```
|
||
|
||
prints
|
||
|
||
`4.9406564584124654417656879286822137236505980261432476442558568250067550727020875186529983636163599237979656469544571773092665671035593979639877479601078187812630071319031140452784581716784898210368871863605699873072305000638740915356498438731247339727316961514003171538539807412623856559117102665855668676818703956031062493194527159149245532930545654440112748012970999954193198940908041656332452475714786901472678015935523861155013480352649347201937902681071074917033322268447533357208324319360923829e-324`.
|
||
|
||
- Made `format_to_n` and `formatted_size` part of the [core
|
||
API](https://fmt.dev/latest/api.html#core-api)
|
||
([godbolt](https://godbolt.org/z/sPjY1K)):
|
||
|
||
```c++
|
||
#include <fmt/core.h>
|
||
|
||
int main() {
|
||
char buffer[10];
|
||
auto result = fmt::format_to_n(buffer, sizeof(buffer), "{}", 42);
|
||
}
|
||
```
|
||
|
||
- Added `fmt::format_to_n` overload with format string compilation
|
||
([#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 <fmt/compile.h>
|
||
|
||
int main() {
|
||
char buffer[8];
|
||
fmt::format_to_n(buffer, sizeof(buffer), FMT_COMPILE("{}"), 42);
|
||
}
|
||
```
|
||
|
||
Thanks @Kurkin and @alexezeder.
|
||
|
||
- Added `fmt::format_to` overload that take `text_style`
|
||
([#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 <fmt/color.h>
|
||
|
||
int main() {
|
||
std::string out;
|
||
fmt::format_to(std::back_inserter(out),
|
||
fmt::emphasis::bold | fg(fmt::color::red),
|
||
"The answer is {}.", 42);
|
||
}
|
||
```
|
||
|
||
Thanks @Naios.
|
||
|
||
- Made the `'#'` specifier emit trailing zeros in addition to the
|
||
decimal point ([#1797](https://github.com/fmtlib/fmt/issues/1797)).
|
||
For example ([godbolt](https://godbolt.org/z/bhdcW9)):
|
||
|
||
```c++
|
||
#include <fmt/core.h>
|
||
|
||
int main() {
|
||
fmt::print("{:#.2g}", 0.5);
|
||
}
|
||
```
|
||
|
||
prints `0.50`.
|
||
|
||
- Changed the default floating point format to not include `.0` for
|
||
consistency with `std::format` and `std::to_chars`
|
||
([#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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- Removed dependency on `windows.h`
|
||
([#1900](https://github.com/fmtlib/fmt/pull/1900)). Thanks @bernd5.
|
||
|
||
- Optimized counting of decimal digits on MSVC
|
||
([#1890](https://github.com/fmtlib/fmt/pull/1890)). Thanks @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, @pepsiman, @Klaim, @ravijanjam, @francesco-st and @udnaan.
|
||
|
||
- Added the `FMT_REDUCE_INT_INSTANTIATIONS` CMake option that reduces
|
||
the binary code size at the cost of some integer formatting
|
||
performance. This can be useful for extremely memory-constrained
|
||
embedded systems
|
||
([#1778](https://github.com/fmtlib/fmt/issues/1778),
|
||
[#1781](https://github.com/fmtlib/fmt/pull/1781)). Thanks @kammce.
|
||
|
||
- Added the `FMT_USE_INLINE_NAMESPACES` macro to control usage of
|
||
inline namespaces
|
||
([#1945](https://github.com/fmtlib/fmt/pull/1945)). Thanks @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, @xvitaly, @tambry, @medithe and @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, @medithe, @martinwuehrer, @n16h7hunt3r, @Othereum,
|
||
@gsjaardema, @AlexanderLanin, @gcerretani, @chronoxor, @noizefloor,
|
||
@akohlmey, @jk-jeon, @rimathia, @rglarix, @moiwi, @heckad, @MarcDirven.
|
||
@BartSiwek and @darklukee.
|
||
|
||
# 7.0.3 - 2020-08-06
|
||
|
||
- Worked around broken `numeric_limits` for 128-bit integers
|
||
([#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.
|
||
- 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.
|
||
- Fixed minor issues with the documentation.
|
||
|
||
# 7.0.0 - 2020-07-05
|
||
|
||
- Reduced the library size. For example, on macOS a stripped test
|
||
binary statically linked with {fmt} [shrank from \~368k to less than
|
||
100k](http://www.zverovich.net/2020/05/21/reducing-library-size.html).
|
||
|
||
- Added a simpler and more efficient [format string compilation
|
||
API](https://fmt.dev/7.0.0/api.html#compile-api):
|
||
|
||
```c++
|
||
#include <fmt/compile.h>
|
||
|
||
// Converts 42 into std::string using the most efficient method and no
|
||
// runtime format string processing.
|
||
std::string s = fmt::format(FMT_COMPILE("{}"), 42);
|
||
```
|
||
|
||
The old `fmt::compile` API is now deprecated.
|
||
|
||
- Optimized integer formatting: `format_to` with format string
|
||
compilation and a stack-allocated buffer is now [faster than
|
||
to_chars on both libc++ and
|
||
libstdc++](http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html).
|
||
|
||
- Optimized handling of small format strings. For example,
|
||
|
||
```c++
|
||
fmt::format("Result: {}: ({},{},{},{})", str1, str2, str3, str4, str5)
|
||
```
|
||
|
||
is now \~40% faster
|
||
([#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 for the suggestion.
|
||
|
||
- Named arguments are now stored on stack (no dynamic memory
|
||
allocations) and the compiled code is more compact and efficient.
|
||
For example
|
||
|
||
```c++
|
||
#include <fmt/core.h>
|
||
|
||
int main() {
|
||
fmt::print("The answer is {answer}\n", fmt::arg("answer", 42));
|
||
}
|
||
```
|
||
|
||
compiles to just ([godbolt](https://godbolt.org/z/NcfEp_))
|
||
|
||
```asm
|
||
.LC0:
|
||
.string "answer"
|
||
.LC1:
|
||
.string "The answer is {answer}\n"
|
||
main:
|
||
sub rsp, 56
|
||
mov edi, OFFSET FLAT:.LC1
|
||
mov esi, 23
|
||
movabs rdx, 4611686018427387905
|
||
lea rax, [rsp+32]
|
||
lea rcx, [rsp+16]
|
||
mov QWORD PTR [rsp+8], 1
|
||
mov QWORD PTR [rsp], rax
|
||
mov DWORD PTR [rsp+16], 42
|
||
mov QWORD PTR [rsp+32], OFFSET FLAT:.LC0
|
||
mov DWORD PTR [rsp+40], 0
|
||
call fmt::v6::vprint(fmt::v6::basic_string_view<char>,
|
||
fmt::v6::format_args)
|
||
xor eax, eax
|
||
add rsp, 56
|
||
ret
|
||
|
||
.L.str.1:
|
||
.asciz "answer"
|
||
```
|
||
|
||
- Implemented compile-time checks for dynamic width and precision
|
||
([#1614](https://github.com/fmtlib/fmt/issues/1614)):
|
||
|
||
```c++
|
||
#include <fmt/format.h>
|
||
|
||
int main() {
|
||
fmt::print(FMT_STRING("{0:{1}}"), 42);
|
||
}
|
||
```
|
||
|
||
now gives a compilation error because argument 1 doesn\'t exist:
|
||
|
||
In file included from test.cc:1:
|
||
include/fmt/format.h:2726:27: error: constexpr variable 'invalid_format' must be
|
||
initialized by a constant expression
|
||
FMT_CONSTEXPR_DECL bool invalid_format =
|
||
^
|
||
...
|
||
include/fmt/core.h:569:26: note: in call to
|
||
'&checker(s, {}).context_->on_error(&"argument not found"[0])'
|
||
if (id >= num_args_) on_error("argument not found");
|
||
^
|
||
|
||
- Added sentinel support to `fmt::join`
|
||
([#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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- Fixed compatibility with emscripten
|
||
([#1636](https://github.com/fmtlib/fmt/issues/1636),
|
||
[#1637](https://github.com/fmtlib/fmt/pull/1637)). Thanks @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, @lsr0, @puetzk, @fpelliccioni, Alexey Kuzmenko, @jelly,
|
||
@claremacrae, @jiapengwen, @gsjaardema and @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, @jtojnar, @orivej and @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, @gabime, @johnor, @Kurkin, @invexed, @peterbell10,
|
||
@daixtrose, @petrutlucian94, @Neargye, @ambitslix, @gabime, @erthink,
|
||
@tohammer and @0x8000-0000.
|
||
|
||
# 6.2.1 - 2020-05-09
|
||
|
||
- Fixed ostream support in `sprintf`
|
||
([#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<T> specialization:
|
||
https://fmt.dev/latest/api.html#formatting-user-defined-types"
|
||
static_assert(
|
||
^
|
||
...
|
||
note: in instantiation of function template specialization
|
||
'fmt::v6::format<char [3], S, char>' requested here
|
||
fmt::format("{}", S());
|
||
^
|
||
|
||
if `S` is not formattable.
|
||
|
||
- Reduced the library size by \~10%.
|
||
|
||
- Always print decimal point if `#` is specified
|
||
([#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<fmt::format_context> store;
|
||
store.push_back("answer");
|
||
store.push_back(42);
|
||
fmt::vprint("The {} is {}.\n", store);
|
||
```
|
||
|
||
prints:
|
||
|
||
The answer is 42.
|
||
|
||
Thanks @vsolontsov-ll.
|
||
|
||
- Made `fmt::join` accept `initializer_list`
|
||
([#1591](https://github.com/fmtlib/fmt/pull/1591)). Thanks @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.
|
||
|
||
- Added const `begin` and `end` overload to buffers
|
||
([#1553](https://github.com/fmtlib/fmt/pull/1553)). Thanks @dominicpoeschko.
|
||
|
||
- Added the ability to disable floating-point formatting via
|
||
`FMT_USE_FLOAT`, `FMT_USE_DOUBLE` and `FMT_USE_LONG_DOUBLE` macros
|
||
for extremely memory-constrained embedded system
|
||
([#1590](https://github.com/fmtlib/fmt/pull/1590)). Thanks @albaguirre.
|
||
|
||
- Made `FMT_STRING` work with `constexpr` `string_view`
|
||
([#1589](https://github.com/fmtlib/fmt/pull/1589)). Thanks @scramsby.
|
||
|
||
- Implemented a minor optimization in the format string parser
|
||
([#1560](https://github.com/fmtlib/fmt/pull/1560)). Thanks @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, @chronoxor and @refnum.
|
||
|
||
- Improved documentation
|
||
([#1481](https://github.com/fmtlib/fmt/pull/1481),
|
||
[#1523](https://github.com/fmtlib/fmt/pull/1523)).
|
||
Thanks @JackBoosY and @imba-tjd.
|
||
|
||
- Fixed symbol visibility on Linux when compiling with
|
||
`-fvisibility=hidden`
|
||
([#1535](https://github.com/fmtlib/fmt/pull/1535)). Thanks @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, @jwillikers and @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, @iPherian, @parkertomatoes, @gsjaardema, @chronoxor,
|
||
@DanielaE, @torsten48, @tohammer, @lefticus, @ryusakki, @adnsv, @fghzxm,
|
||
@refnum, @pramodk, @Spirrwell and @scramsby.
|
||
|
||
# 6.1.2 - 2019-12-11
|
||
|
||
- Fixed ABI compatibility with `libfmt.so.6.0.0`
|
||
([#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.
|
||
- 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.
|
||
|
||
# 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 and @bbolli.
|
||
- Added a missing decimal point in exponent notation with trailing
|
||
zeros.
|
||
- Removed deprecated `format_arg_store::TYPES`.
|
||
|
||
# 6.1.0 - 2019-12-01
|
||
|
||
- {fmt} now formats IEEE 754 `float` and `double` using the shortest
|
||
decimal representation with correct rounding by default:
|
||
|
||
```c++
|
||
#include <cmath>
|
||
#include <fmt/core.h>
|
||
|
||
int main() {
|
||
fmt::print("{}", M_PI);
|
||
}
|
||
```
|
||
|
||
prints `3.141592653589793`.
|
||
|
||
- Made the fast binary to decimal floating-point formatter the
|
||
default, simplified it and improved performance. {fmt} is now 15
|
||
times faster than libc++\'s `std::ostringstream`, 11 times faster
|
||
than `printf` and 10% faster than double-conversion on
|
||
[dtoa-benchmark](https://github.com/fmtlib/dtoa-benchmark):
|
||
|
||
| Function | Time (ns) | Speedup |
|
||
| ------------- | --------: | ------: |
|
||
| ostringstream | 1,346.30 | 1.00x |
|
||
| ostrstream | 1,195.74 | 1.13x |
|
||
| sprintf | 995.08 | 1.35x |
|
||
| doubleconv | 99.10 | 13.59x |
|
||
| fmt | 88.34 | 15.24x |
|
||
|
||

|
||
|
||
- {fmt} no longer converts `float` arguments to `double`. In
|
||
particular this improves the default (shortest) representation of
|
||
floats and makes `fmt::format` consistent with `std::format` specs
|
||
([#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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- 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 <tuple>
|
||
#include <fmt/ranges.h>
|
||
|
||
int main() {
|
||
std::tuple<char, int, float> t{'a', 1, 2.0f};
|
||
fmt::print("{}", t);
|
||
}
|
||
```
|
||
|
||
prints `('a', 1, 2.0)`.
|
||
|
||
Thanks @jeremyong.
|
||
|
||
- Changed formatting of octal zero with prefix from \"00\" to \"0\":
|
||
|
||
```c++
|
||
fmt::print("{:#o}", 0);
|
||
```
|
||
|
||
prints `0`.
|
||
|
||
- The locale is now passed to ostream insertion (`<<`) operators
|
||
([#1406](https://github.com/fmtlib/fmt/pull/1406)):
|
||
|
||
```c++
|
||
#include <fmt/locale.h>
|
||
#include <fmt/ostream.h>
|
||
|
||
struct S {
|
||
double value;
|
||
};
|
||
|
||
std::ostream& operator<<(std::ostream& os, S s) {
|
||
return os << s.value;
|
||
}
|
||
|
||
int main() {
|
||
auto s = fmt::format(std::locale("fr_FR.UTF-8"), "{}", S{0.42});
|
||
// s == "0,42"
|
||
}
|
||
```
|
||
|
||
Thanks @dlaugt.
|
||
|
||
- Locale-specific number formatting now uses grouping
|
||
([#1393](https://github.com/fmtlib/fmt/issues/1393)
|
||
[#1394](https://github.com/fmtlib/fmt/pull/1394)). Thanks @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.
|
||
|
||
- 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.
|
||
|
||
- {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.
|
||
|
||
- Added a CUDA test ([#1285](https://github.com/fmtlib/fmt/pull/1285),
|
||
[#1317](https://github.com/fmtlib/fmt/pull/1317)).
|
||
Thanks @luncliff and @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, @pauldreik and @jackoalan.
|
||
|
||
- Various code improvements
|
||
([#1358](https://github.com/fmtlib/fmt/pull/1358),
|
||
[#1407](https://github.com/fmtlib/fmt/pull/1407)).
|
||
Thanks @orivej and @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, @gsjaardema, @gabime, @neheb, @vedranmiletic, @dkavolis,
|
||
@mwinterb, @orivej, @denizevrenci, @leonklingele, @chronoxor, @kent-tri,
|
||
@0x8000-0000 and @marti4d.
|
||
|
||
# 6.0.0 - 2019-08-26
|
||
|
||
- Switched to the [MIT
|
||
license](https://github.com/fmtlib/fmt/blob/5a4b24613ba16cc689977c3b5bd8274a3ba1dd1f/LICENSE.rst)
|
||
with an optional exception that allows distributing binary code
|
||
without attribution.
|
||
|
||
- Floating-point formatting is now locale-independent by default:
|
||
|
||
```c++
|
||
#include <locale>
|
||
#include <fmt/core.h>
|
||
|
||
int main() {
|
||
std::locale::global(std::locale("ru_RU.UTF-8"));
|
||
fmt::print("value = {}", 4.2);
|
||
}
|
||
```
|
||
|
||
prints \"value = 4.2\" regardless of the locale.
|
||
|
||
For locale-specific formatting use the `n` specifier:
|
||
|
||
```c++
|
||
std::locale::global(std::locale("ru_RU.UTF-8"));
|
||
fmt::print("value = {:n}", 4.2);
|
||
```
|
||
|
||
prints \"value = 4,2\".
|
||
|
||
- Added an experimental Grisu floating-point formatting algorithm
|
||
implementation (disabled by default). To enable it compile with the
|
||
`FMT_USE_GRISU` macro defined to 1:
|
||
|
||
```c++
|
||
#define FMT_USE_GRISU 1
|
||
#include <fmt/format.h>
|
||
|
||
auto s = fmt::format("{}", 4.2); // formats 4.2 using Grisu
|
||
```
|
||
|
||
With Grisu enabled, {fmt} is 13x faster than `std::ostringstream`
|
||
(libc++) and 10x faster than `sprintf` on
|
||
[dtoa-benchmark](https://github.com/fmtlib/dtoa-benchmark) ([full
|
||
results](https://fmt.dev/unknown_mac64_clang10.0.html)):
|
||
|
||

|
||
|
||
- Separated formatting and parsing contexts for consistency with
|
||
[C++20 std::format](http://eel.is/c++draft/format), removing the
|
||
undocumented `basic_format_context::parse_context()` function.
|
||
|
||
- Added [oss-fuzz](https://github.com/google/oss-fuzz) support
|
||
([#1199](https://github.com/fmtlib/fmt/pull/1199)). Thanks @pauldreik.
|
||
|
||
- `formatter` specializations now always take precedence over
|
||
`operator<<` ([#952](https://github.com/fmtlib/fmt/issues/952)):
|
||
|
||
```c++
|
||
#include <iostream>
|
||
#include <fmt/ostream.h>
|
||
|
||
struct S {};
|
||
|
||
std::ostream& operator<<(std::ostream& os, S) {
|
||
return os << 1;
|
||
}
|
||
|
||
template <>
|
||
struct fmt::formatter<S> : fmt::formatter<int> {
|
||
auto format(S, format_context& ctx) {
|
||
return formatter<int>::format(2, ctx);
|
||
}
|
||
};
|
||
|
||
int main() {
|
||
std::cout << S() << "\n"; // prints 1 using operator<<
|
||
fmt::print("{}\n", S()); // prints 2 using formatter
|
||
}
|
||
```
|
||
|
||
- Introduced the experimental `fmt::compile` function that does format
|
||
string compilation
|
||
([#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 <fmt/compile.h>
|
||
|
||
auto f = fmt::compile<int>("{}");
|
||
std::string s = fmt::format(f, 42); // can be called multiple times to
|
||
// format different values
|
||
// s == "42"
|
||
```
|
||
|
||
It moves the cost of parsing a format string outside of the format
|
||
function which can be beneficial when identically formatting many
|
||
objects of the same types. Thanks @stryku.
|
||
|
||
- Added experimental `%` format specifier that formats floating-point
|
||
values as percentages
|
||
([#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.
|
||
|
||
- 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<double>(1.234));
|
||
// s == 1.2s
|
||
```
|
||
|
||
Thanks @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.
|
||
|
||
- 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 <fmt/color.h>
|
||
|
||
std::string message = fmt::format(fmt::emphasis::bold | fg(fmt::color::red),
|
||
"The answer is {}.", 42);
|
||
```
|
||
|
||
Thanks @Naios.
|
||
|
||
- Removed the deprecated color API (`print_colored`). Use the new API,
|
||
namely `print` overloads that take `text_style` instead.
|
||
|
||
- Made `std::unique_ptr` and `std::shared_ptr` formattable as pointers
|
||
via `fmt::ptr` ([#1121](https://github.com/fmtlib/fmt/pull/1121)):
|
||
|
||
```c++
|
||
std::unique_ptr<int> p = ...;
|
||
fmt::print("{}", fmt::ptr(p)); // prints p as a pointer
|
||
```
|
||
|
||
Thanks @sighingnow.
|
||
|
||
- Made `print` and `vprint` report I/O errors
|
||
([#1098](https://github.com/fmtlib/fmt/issues/1098),
|
||
[#1099](https://github.com/fmtlib/fmt/pull/1099)). Thanks @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.
|
||
|
||
- Modernized the codebase using more C++11 features and removing
|
||
workarounds. Most importantly, `buffer_context` is now an alias
|
||
template, so use `buffer_context<T>` instead of
|
||
`buffer_context<T>::type`. These features require GCC 4.8 or later.
|
||
|
||
- `formatter` specializations now always take precedence over implicit
|
||
conversions to `int` and the undocumented `convert_to_int` trait is
|
||
now deprecated.
|
||
|
||
- Moved the undocumented `basic_writer`, `writer`, and `wwriter` types
|
||
to the `internal` namespace.
|
||
|
||
- Removed deprecated `basic_format_context::begin()`. Use `out()`
|
||
instead.
|
||
|
||
- Disallowed passing the result of `join` as an lvalue to prevent
|
||
misuse.
|
||
|
||
- Refactored the undocumented structs that represent parsed format
|
||
specifiers to simplify the API and allow multibyte fill.
|
||
|
||
- Moved SFINAE to template parameters to reduce symbol sizes.
|
||
|
||
- Switched to `fputws` for writing wide strings so that it\'s no
|
||
longer required to call `_setmode` on Windows
|
||
([#1229](https://github.com/fmtlib/fmt/issues/1229),
|
||
[#1243](https://github.com/fmtlib/fmt/pull/1243)). Thanks @jackoalan.
|
||
|
||
- Improved literal-based API
|
||
([#1254](https://github.com/fmtlib/fmt/pull/1254)). Thanks @sylveon.
|
||
|
||
- Added support for exotic platforms without `uintptr_t` such as IBM i
|
||
(AS/400) which has 128-bit pointers and only 64-bit integers
|
||
([#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.
|
||
|
||
- 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.
|
||
|
||
- 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, @jasonszang, @olafhering, @Lecetem and @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, @foonathan, @BillyDonahue, @jwakely, @kaisbe and
|
||
@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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- Fixed building tests on FreeBSD and Hurd
|
||
([#1043](https://github.com/fmtlib/fmt/issues/1043)). Thanks @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, @mwinterb, @eliaskosunen, @morinmorin, @ricco19,
|
||
@waywardmonkeys, @chronoxor, @remyabel, @pauldreik, @gsjaardema, @rcane,
|
||
@mocabe, @denchat, @cjdb, @HazardyKnusperkeks, @vedranmiletic, @jackoalan,
|
||
@DaanDeMeyer and @starkmapper.
|
||
|
||
# 5.3.0 - 2018-12-28
|
||
|
||
- Introduced experimental chrono formatting support:
|
||
|
||
```c++
|
||
#include <fmt/chrono.h>
|
||
|
||
int main() {
|
||
using namespace std::literals::chrono_literals;
|
||
fmt::print("Default format: {} {}\n", 42s, 100ms);
|
||
fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s);
|
||
}
|
||
```
|
||
|
||
prints:
|
||
|
||
Default format: 42s 100ms
|
||
strftime-like format: 03:15:30
|
||
|
||
- Added experimental support for emphasis (bold, italic, underline,
|
||
strikethrough), colored output to a file stream, and improved
|
||
colored formatting API
|
||
([#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 <fmt/color.h>
|
||
|
||
int main() {
|
||
print(fg(fmt::color::crimson) | fmt::emphasis::bold,
|
||
"Hello, {}!\n", "world");
|
||
print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) |
|
||
fmt::emphasis::underline, "Hello, {}!\n", "мир");
|
||
print(fg(fmt::color::steel_blue) | fmt::emphasis::italic,
|
||
"Hello, {}!\n", "世界");
|
||
}
|
||
```
|
||
|
||
prints the following on modern terminals with RGB color support:
|
||
|
||

|
||
|
||
Thanks @Rakete1111.
|
||
|
||
- Added support for 4-bit terminal colors
|
||
([#968](https://github.com/fmtlib/fmt/issues/968),
|
||
[#974](https://github.com/fmtlib/fmt/pull/974))
|
||
|
||
```c++
|
||
#include <fmt/color.h>
|
||
|
||
int main() {
|
||
print(fg(fmt::terminal_color::red), "stop\n");
|
||
}
|
||
```
|
||
|
||
Note that these colors vary by terminal:
|
||
|
||

|
||
|
||
Thanks @Rakete1111.
|
||
|
||
- Parameterized formatting functions on the type of the format string
|
||
([#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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- Made colored print functions work with wide strings
|
||
([#867](https://github.com/fmtlib/fmt/pull/867)):
|
||
|
||
```c++
|
||
#include <fmt/color.h>
|
||
|
||
int main() {
|
||
print(fg(fmt::color::red), L"{}\n", 42);
|
||
}
|
||
```
|
||
|
||
Thanks @DanielaE.
|
||
|
||
- Introduced experimental Unicode support
|
||
([#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 <fmt/locale.h>
|
||
|
||
struct numpunct : std::numpunct<char> {
|
||
protected:
|
||
char do_thousands_sep() const override { return '~'; }
|
||
};
|
||
|
||
std::locale loc;
|
||
auto s = fmt::format(std::locale(loc, new numpunct()), "{:n}", 1234567);
|
||
// s == "1~234~567"
|
||
```
|
||
|
||
- Constrained formatting functions on proper iterator types
|
||
([#921](https://github.com/fmtlib/fmt/pull/921)). Thanks @DanielaE.
|
||
|
||
- Added `make_printf_args` and `make_wprintf_args` functions
|
||
([#934](https://github.com/fmtlib/fmt/pull/934)). Thanks @tnovotny.
|
||
|
||
- Deprecated `fmt::visit`, `parse_context`, and `wparse_context`. Use
|
||
`fmt::visit_format_arg`, `format_parse_context`, and
|
||
`wformat_parse_context` instead.
|
||
|
||
- Removed undocumented `basic_fixed_buffer` which has been superseded
|
||
by the iterator-based API
|
||
([#873](https://github.com/fmtlib/fmt/issues/873),
|
||
[#902](https://github.com/fmtlib/fmt/pull/902)). Thanks @superfunc.
|
||
|
||
- Disallowed repeated leading zeros in an argument ID:
|
||
|
||
```c++
|
||
fmt::print("{000}", 42); // error
|
||
```
|
||
|
||
- Reintroduced support for gcc 4.4.
|
||
|
||
- Fixed compilation on platforms with exotic `double`
|
||
([#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, @DarkDimius and @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.
|
||
|
||
- 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, @luncliff, @AndreasSchoenle, @hotwatermorning and @Zefz.
|
||
|
||
- Improved `string_view` construction performance
|
||
([#914](https://github.com/fmtlib/fmt/pull/914)). Thanks @gabime.
|
||
|
||
- Fixed non-matching char types
|
||
([#895](https://github.com/fmtlib/fmt/pull/895)). Thanks @DanielaE.
|
||
|
||
- Fixed `format_to_n` with `std::back_insert_iterator`
|
||
([#913](https://github.com/fmtlib/fmt/pull/913)). Thanks @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, @stevenhoving, @christinaa, @lgritz, @DanielaE,
|
||
@0x8000-0000 and @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.
|
||
- 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.
|
||
- Improved error message when formatting unknown types
|
||
([#872](https://github.com/fmtlib/fmt/pull/872)). Thanks @foonathan.
|
||
- Disabled templated user-defined literals when compiled under nvcc
|
||
([#875](https://github.com/fmtlib/fmt/pull/875)). Thanks @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 | 1.66x |
|
||
| fmt::format_to 5.1 | 0.51 | |
|
||
| fmt::format_to 5.2 | 0.23 | 2.22x |
|
||
| sprintf | 0.71 | |
|
||
| std::to_string | 1.01 | |
|
||
| std::stringstream | 1.73 | |
|
||
|
||
- Changed the `fmt` macro from opt-out to opt-in to prevent name
|
||
collisions. To enable it define the `FMT_STRING_ALIAS` macro to 1
|
||
before including `fmt/format.h`:
|
||
|
||
```c++
|
||
#define FMT_STRING_ALIAS 1
|
||
#include <fmt/format.h>
|
||
std::string answer = format(fmt("{}"), 42);
|
||
```
|
||
|
||
- Added compile-time format string checks to `format_to` overload that
|
||
takes `fmt::memory_buffer`
|
||
([#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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- Fixed formatting of user-defined types providing `operator<<` with
|
||
`format_to_n` ([#806](https://github.com/fmtlib/fmt/pull/806)).
|
||
Thanks @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, @medithe, and @eliasdaler.
|
||
|
||
# 5.1.0 - 2018-07-05
|
||
|
||
- Added experimental support for RGB color output enabled with the
|
||
`FMT_EXTENDED_COLORS` macro:
|
||
|
||
```c++
|
||
#define FMT_EXTENDED_COLORS
|
||
#define FMT_HEADER_ONLY // or compile fmt with FMT_EXTENDED_COLORS defined
|
||
#include <fmt/format.h>
|
||
|
||
fmt::print(fmt::color::steel_blue, "Some beautiful text");
|
||
```
|
||
|
||
The old API (the `print_colored` and `vprint_colored` functions and
|
||
the `color` enum) is now deprecated.
|
||
([#762](https://github.com/fmtlib/fmt/issues/762)
|
||
[#767](https://github.com/fmtlib/fmt/pull/767)). thanks @Remotion.
|
||
|
||
- Added quotes to strings in ranges and tuples
|
||
([#766](https://github.com/fmtlib/fmt/pull/766)). Thanks @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.
|
||
|
||
- Added more compilers to continuous integration and increased
|
||
`FMT_PEDANTIC` warning levels
|
||
([#736](https://github.com/fmtlib/fmt/pull/736)). Thanks @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, @gabime, @foonathan, @Dark-Passenger and @0x8000-0000.
|
||
|
||
# 5.0.0 - 2018-05-21
|
||
|
||
- Added a requirement for partial C++11 support, most importantly
|
||
variadic templates and type traits, and dropped `FMT_VARIADIC_*`
|
||
emulation macros. Variadic templates are available since GCC 4.4,
|
||
Clang 2.9 and MSVC 18.0 (2013). For older compilers use {fmt}
|
||
[version 4.x](https://github.com/fmtlib/fmt/releases/tag/4.1.0)
|
||
which continues to be maintained and works with C++98 compilers.
|
||
|
||
- Renamed symbols to follow standard C++ naming conventions and
|
||
proposed a subset of the library for standardization in [P0645R2
|
||
Text Formatting](https://wg21.link/P0645).
|
||
|
||
- Implemented `constexpr` parsing of format strings and [compile-time
|
||
format string
|
||
checks](https://fmt.dev/latest/api.html#compile-time-format-string-checks).
|
||
For example
|
||
|
||
```c++
|
||
#include <fmt/format.h>
|
||
|
||
std::string s = format(fmt("{:d}"), "foo");
|
||
```
|
||
|
||
gives a compile-time error because `d` is an invalid specifier for
|
||
strings ([godbolt](https://godbolt.org/g/rnCy9Q)):
|
||
|
||
...
|
||
<source>:4:19: note: in instantiation of function template specialization 'fmt::v5::format<S, char [4]>' requested here
|
||
std::string s = format(fmt("{:d}"), "foo");
|
||
^
|
||
format.h:1337:13: note: non-constexpr function 'on_error' cannot be used in a constant expression
|
||
handler.on_error("invalid type specifier");
|
||
|
||
Compile-time checks require relaxed `constexpr` (C++14 feature)
|
||
support. If the latter is not available, checks will be performed at
|
||
runtime.
|
||
|
||
- Separated format string parsing and formatting in the extension API
|
||
to enable compile-time format string processing. For example
|
||
|
||
```c++
|
||
struct Answer {};
|
||
|
||
namespace fmt {
|
||
template <>
|
||
struct formatter<Answer> {
|
||
constexpr auto parse(parse_context& ctx) {
|
||
auto it = ctx.begin();
|
||
spec = *it;
|
||
if (spec != 'd' && spec != 's')
|
||
throw format_error("invalid specifier");
|
||
return ++it;
|
||
}
|
||
|
||
template <typename FormatContext>
|
||
auto format(Answer, FormatContext& ctx) {
|
||
return spec == 's' ?
|
||
format_to(ctx.begin(), "{}", "fourty-two") :
|
||
format_to(ctx.begin(), "{}", 42);
|
||
}
|
||
|
||
char spec = 0;
|
||
};
|
||
}
|
||
|
||
std::string s = format(fmt("{:x}"), Answer());
|
||
```
|
||
|
||
gives a compile-time error due to invalid format specifier
|
||
([godbolt](https://godbolt.org/g/2jQ1Dv)):
|
||
|
||
...
|
||
<source>:12:45: error: expression '<throw-expression>' is not a constant expression
|
||
throw format_error("invalid specifier");
|
||
|
||
- Added [iterator
|
||
support](https://fmt.dev/latest/api.html#output-iterator-support):
|
||
|
||
```c++
|
||
#include <vector>
|
||
#include <fmt/format.h>
|
||
|
||
std::vector<char> out;
|
||
fmt::format_to(std::back_inserter(out), "{}", 42);
|
||
```
|
||
|
||
- Added the
|
||
[format_to_n](https://fmt.dev/latest/api.html#_CPPv2N3fmt11format_to_nE8OutputItNSt6size_tE11string_viewDpRK4Args)
|
||
function that restricts the output to the specified number of
|
||
characters ([#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 <fmt/format.h>
|
||
|
||
auto size = fmt::formatted_size("{}", 12345); // size == 5
|
||
```
|
||
|
||
- Improved compile times by reducing dependencies on standard headers
|
||
and providing a lightweight [core
|
||
API](https://fmt.dev/latest/api.html#core-api):
|
||
|
||
```c++
|
||
#include <fmt/core.h>
|
||
|
||
fmt::print("The answer is {}.", 42);
|
||
```
|
||
|
||
See [Compile time and code
|
||
bloat](https://github.com/fmtlib/fmt#compile-time-and-code-bloat).
|
||
|
||
- Added the
|
||
[make_format_args](https://fmt.dev/latest/api.html#_CPPv2N3fmt16make_format_argsEDpRK4Args)
|
||
function for capturing formatting arguments:
|
||
|
||
```c++
|
||
// Prints formatted error message.
|
||
void vreport_error(const char *format, fmt::format_args args) {
|
||
fmt::print("Error: ");
|
||
fmt::vprint(format, args);
|
||
}
|
||
template <typename... Args>
|
||
void report_error(const char *format, const Args & ... args) {
|
||
vreport_error(format, fmt::make_format_args(args...));
|
||
}
|
||
```
|
||
|
||
- Added the `make_printf_args` function for capturing `printf`
|
||
arguments ([#687](https://github.com/fmtlib/fmt/issues/687),
|
||
[#694](https://github.com/fmtlib/fmt/pull/694)). Thanks @Kronuz.
|
||
|
||
- Added prefix `v` to non-variadic functions taking `format_args` to
|
||
distinguish them from variadic ones:
|
||
|
||
```c++
|
||
std::string vformat(string_view format_str, format_args args);
|
||
|
||
template <typename... Args>
|
||
std::string format(string_view format_str, const Args & ... args);
|
||
```
|
||
|
||
- Added experimental support for formatting ranges, containers and
|
||
tuple-like types in `fmt/ranges.h`
|
||
([#735](https://github.com/fmtlib/fmt/pull/735)):
|
||
|
||
```c++
|
||
#include <fmt/ranges.h>
|
||
|
||
std::vector<int> v = {1, 2, 3};
|
||
fmt::print("{}", v); // prints {1, 2, 3}
|
||
```
|
||
|
||
Thanks @Remotion.
|
||
|
||
- Implemented `wchar_t` date and time formatting
|
||
([#712](https://github.com/fmtlib/fmt/pull/712)):
|
||
|
||
```c++
|
||
#include <fmt/time.h>
|
||
|
||
std::time_t t = std::time(nullptr);
|
||
auto s = fmt::format(L"The date is {:%Y-%m-%d}.", *std::localtime(&t));
|
||
```
|
||
|
||
Thanks @DanielaE.
|
||
|
||
- Provided more wide string overloads
|
||
([#724](https://github.com/fmtlib/fmt/pull/724)). Thanks @DanielaE.
|
||
|
||
- Switched from a custom null-terminated string view class to
|
||
`string_view` in the format API and provided `fmt::string_view`
|
||
which implements a subset of `std::string_view` API for pre-C++17
|
||
systems.
|
||
|
||
- Added support for `std::experimental::string_view`
|
||
([#607](https://github.com/fmtlib/fmt/pull/607)):
|
||
|
||
```c++
|
||
#include <fmt/core.h>
|
||
#include <experimental/string_view>
|
||
|
||
fmt::print("{}", std::experimental::string_view("foo"));
|
||
```
|
||
|
||
Thanks @virgiliofornazin.
|
||
|
||
- Allowed mixing named and automatic arguments:
|
||
|
||
```c++
|
||
fmt::format("{} {two}", 1, fmt::arg("two", 2));
|
||
```
|
||
|
||
- Removed the write API in favor of the [format
|
||
API](https://fmt.dev/latest/api.html#format-api) with compile-time
|
||
handling of format strings.
|
||
|
||
- Disallowed formatting of multibyte strings into a wide character
|
||
target ([#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, @mihaitodor and @johnthagen.
|
||
|
||
- Implemented more efficient handling of large number of format
|
||
arguments.
|
||
|
||
- Introduced an inline namespace for symbol versioning.
|
||
|
||
- Added debug postfix `d` to the `fmt` library name
|
||
([#636](https://github.com/fmtlib/fmt/issues/636)).
|
||
|
||
- Removed unnecessary `fmt/` prefix in includes
|
||
([#397](https://github.com/fmtlib/fmt/pull/397)). Thanks @chronoxor.
|
||
|
||
- Moved `fmt/*.h` to `include/fmt/*.h` to prevent irrelevant files and
|
||
directories appearing on the include search paths when fmt is used
|
||
as a subproject and moved source files to the `src` directory.
|
||
|
||
- Added qmake project file `support/fmt.pro`
|
||
([#641](https://github.com/fmtlib/fmt/pull/641)). Thanks @cowo78.
|
||
|
||
- Added Gradle build file `support/build.gradle`
|
||
([#649](https://github.com/fmtlib/fmt/pull/649)). Thanks @luncliff.
|
||
|
||
- Removed `FMT_CPPFORMAT` CMake option.
|
||
|
||
- Fixed a name conflict with the macro `CHAR_WIDTH` in glibc
|
||
([#616](https://github.com/fmtlib/fmt/pull/616)). Thanks @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.
|
||
|
||
- Added a missing `inline` in the header-only mode
|
||
([#626](https://github.com/fmtlib/fmt/pull/626)). Thanks @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, @LarsGullik, @foonathan, @eliaskosunen,
|
||
@christianparpart, @DanielaE and @mwinterb.
|
||
|
||
- Worked around an MSVC bug and fixed several warnings
|
||
([#653](https://github.com/fmtlib/fmt/pull/653)). Thanks @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.
|
||
|
||
- 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.
|
||
|
||
- Fixed compilation on FreeBSD 12
|
||
([#732](https://github.com/fmtlib/fmt/pull/732)). Thanks @dankm.
|
||
|
||
- Fixed compilation when there is a mismatch between `-std` options
|
||
between the library and user code
|
||
([#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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- Fixed installation of `fmt/ranges.h`
|
||
([#738](https://github.com/fmtlib/fmt/pull/738)). Thanks @sv1990.
|
||
|
||
# 4.1.0 - 2017-12-20
|
||
|
||
- Added `fmt::to_wstring()` in addition to `fmt::to_string()`
|
||
([#559](https://github.com/fmtlib/fmt/pull/559)). Thanks @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 and @mwinterb.
|
||
- Enabled stream exceptions to catch errors
|
||
([#581](https://github.com/fmtlib/fmt/issues/581)). Thanks @crusader-mike.
|
||
- Allowed formatting of class hierarchies with `fmt::format_arg()`
|
||
([#547](https://github.com/fmtlib/fmt/pull/547)). Thanks @rollbear.
|
||
- Removed limitations on character types
|
||
([#563](https://github.com/fmtlib/fmt/pull/563)). Thanks @Yelnats321.
|
||
- Conditionally enabled use of `std::allocator_traits`
|
||
([#583](https://github.com/fmtlib/fmt/pull/583)). Thanks @mwinterb.
|
||
- Added support for `const` variadic member function emulation with
|
||
`FMT_VARIADIC_CONST`
|
||
([#591](https://github.com/fmtlib/fmt/pull/591)). Thanks @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.
|
||
- 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, @virgiliofornazin, @alexanderbock, @yumetodo, @VaderY,
|
||
@jpcima, @thelostt and @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, @evgen231 and @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.
|
||
|
||
- 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 @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, @manylegged and @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.
|
||
|
||
- 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<double> v = {1.2, 3.4, 5.6};
|
||
// Prints "(+01.20, +03.40, +05.60)".
|
||
fmt::print("({:+06.2f})", fmt::join(v.begin(), v.end(), ", "));
|
||
```
|
||
|
||
Thanks @olivier80.
|
||
|
||
- Added support for custom formatting specifications to simplify
|
||
customization of built-in formatting
|
||
([#444](https://github.com/fmtlib/fmt/pull/444)). Thanks @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.
|
||
|
||
- 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.
|
||
|
||
- 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.
|
||
|
||
- Fixed crash due to bug in `FormatBuf`
|
||
([#493](https://github.com/fmtlib/fmt/pull/493)). Thanks @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, @zhaohuaxishi, @pkestene, @dschmidt and @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, @niosHD, @LogicalKnight and @alabuzhev.
|
||
|
||
- Improved documentation ([#393](https://github.com/fmtlib/fmt/pull/393)).
|
||
Thanks @pwm1234.
|
||
|
||
# 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.
|
||
- 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.
|
||
- Fixed Android detection
|
||
([#458](https://github.com/fmtlib/fmt/pull/458)). Thanks @Gachapen.
|
||
- Use lean `windows.h` if not in header-only mode
|
||
([#503](https://github.com/fmtlib/fmt/pull/503)). Thanks @Quentin01.
|
||
- Fixed issue with CMake exporting C++11 flag
|
||
([#445](https://github.com/fmtlib/fmt/pull/455)). Thanks @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 and @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, @chenhayat and @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 and @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 @dpantele, @hghwng, @arvedarved, @LogicalKnight and @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 @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 <https://fmt.dev>.
|
||
|
||
- Added support for
|
||
[strftime](http://en.cppreference.com/w/cpp/chrono/c/strftime)-like
|
||
[date and time
|
||
formatting](https://fmt.dev/3.0.0/api.html#date-and-time-formatting)
|
||
([#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<long long>::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 @dean0x7d and @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)):
|
||
|
||

|
||
|
||

|
||
|
||
Thanks @dean0x7d.
|
||
|
||
- Compile test fixes ([#313](https://github.com/fmtlib/fmt/pull/313)).
|
||
Thanks @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 @ReadmeCritic @Gachapen and @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 @mwinterb, @pweiskircher and @Naios.
|
||
|
||
- Improved compatibility with Windows Store apps
|
||
([#280](https://github.com/fmtlib/fmt/issues/280),
|
||
[#285](https://github.com/fmtlib/fmt/pull/285)) Thanks @mwinterb.
|
||
|
||
- Added tests of compatibility with older C++ standards
|
||
([#273](https://github.com/fmtlib/fmt/pull/273)). Thanks @niosHD.
|
||
|
||
- Fixed Android build
|
||
([#271](https://github.com/fmtlib/fmt/pull/271)). Thanks @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 @mwinterb.
|
||
|
||
- Added `fprintf` overload that writes to a `std::ostream`
|
||
([#251](https://github.com/fmtlib/fmt/pull/251)).
|
||
Thanks @nickhutchinson.
|
||
|
||
- Export symbols when building a Windows DLL
|
||
([#245](https://github.com/fmtlib/fmt/pull/245)).
|
||
Thanks @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 @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 @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 @niosHD.
|
||
|
||
# 2.0.1 - 2016-03-13
|
||
|
||
- Improved CMake find and package support
|
||
([#264](https://github.com/fmtlib/fmt/issues/264)). Thanks @niosHD.
|
||
- Fix compile error with Android NDK and mingw32
|
||
([#241](https://github.com/fmtlib/fmt/issues/241)). Thanks @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 @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 @dean0x7d.
|
||
|
||
- \[Breaking\] Formatting of more than 16 arguments is now supported
|
||
when using variadic templates
|
||
([#141](https://github.com/fmtlib/fmt/issues/141)). Thanks @Shauren.
|
||
|
||
- Runtime width specification
|
||
([#168](https://github.com/fmtlib/fmt/pull/168)):
|
||
|
||
```c++
|
||
fmt::format("{0:{1}}", 42, 5); // gives " 42"
|
||
```
|
||
|
||
Thanks @jamboree.
|
||
|
||
- \[Breaking\] Enums are now formatted with an overloaded
|
||
`std::ostream` insertion operator (`operator<<`) if available
|
||
([#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 @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 @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 @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 @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 @maddinat0r.
|
||
|
||
- `noexcept` is now used when compiling with MSVC2015
|
||
([#215](https://github.com/fmtlib/fmt/pull/215)). Thanks @dmkrepo.
|
||
|
||
- Added an option to disable use of `windows.h` when
|
||
`FMT_USE_WINDOWS_H` is defined as 0 before including `format.h`
|
||
([#171](https://github.com/fmtlib/fmt/issues/171)). Thanks @alfps.
|
||
|
||
- \[Breaking\] `windows.h` is now included with `NOMINMAX` unless
|
||
`FMT_WIN_MINMAX` is defined. This is done to prevent breaking code
|
||
using `std::min` and `std::max` and only affects the header-only
|
||
configuration ([#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 @DevO2012.
|
||
|
||
- Improved support for custom character types
|
||
([#171](https://github.com/fmtlib/fmt/issues/171)). Thanks @alfps.
|
||
|
||
- Added an option to disable use of IOStreams when `FMT_USE_IOSTREAMS`
|
||
is defined as 0 before including `format.h`
|
||
([#205](https://github.com/fmtlib/fmt/issues/205),
|
||
[#208](https://github.com/fmtlib/fmt/pull/208)). Thanks @JodiTheTigger.
|
||
|
||
- Improved detection of `isnan`, `isinf` and `signbit`.
|
||
|
||
## Optimization
|
||
|
||
- Made formatting of user-defined types more efficient with a custom
|
||
stream buffer ([#92](https://github.com/fmtlib/fmt/issues/92),
|
||
[#230](https://github.com/fmtlib/fmt/pull/230)). Thanks @NotImplemented.
|
||
- Further improved performance of `fmt::Writer` on integer formatting
|
||
and fixed a minor regression. Now it is \~7% faster than
|
||
`karma::generate` on Karma\'s benchmark
|
||
([#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 @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 @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 @jackyf.
|
||
|
||
- [Packages for Fedora and
|
||
RHEL](https://admin.fedoraproject.org/pkgdb/package/cppformat/) are
|
||
now available. Thanks Dave Johansen.
|
||
|
||
- C++ Format can now be installed via [Homebrew](http://brew.sh/) on
|
||
OS X ([#157](https://github.com/fmtlib/fmt/issues/157)):
|
||
|
||
$ brew install cppformat
|
||
|
||
Thanks @ortho and Anatoliy Bulukin.
|
||
|
||
## Documentation
|
||
|
||
- Migrated from ReadTheDocs to GitHub Pages for better responsiveness
|
||
and reliability ([#128](https://github.com/fmtlib/fmt/issues/128)).
|
||
New documentation address is <http://cppformat.github.io/>.
|
||
- 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 @JodiTheTigger and @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 @syohex.
|
||
- Fixed out-of-tree documentation build
|
||
([#177](https://github.com/fmtlib/fmt/issues/177)). Thanks @jackyf.
|
||
|
||
## Fixes
|
||
|
||
- Fixed `initializer_list` detection
|
||
([#136](https://github.com/fmtlib/fmt/issues/136)). Thanks @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 @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 @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 @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 @seanmiddleditch, @dixlorenz, @CarterLi, @Naios, @fmatthew5876,
|
||
@LevskiWeng, @rpopescu, @gabime, @cubicool, @jkflying, @LogicalKnight,
|
||
@inguin and @Jopie64.
|
||
|
||
- Fixed portability issues (mostly causing test failures) on ARM,
|
||
ppc64, ppc64le, s390x and SunOS 5.11 i386
|
||
([#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 @Naios, @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 @dean0x7d.
|
||
|
||
- Fixed an overload conflict on MSVC when `/Zc:wchar_t-` option is
|
||
specified ([#214](https://github.com/fmtlib/fmt/pull/214)).
|
||
Thanks @slavanap.
|
||
|
||
- Improved compatibility with MSVC 2008
|
||
([#236](https://github.com/fmtlib/fmt/pull/236)). Thanks @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 @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 @CarterLi and @objectx.
|
||
|
||
- CMake install target
|
||
([#119](https://github.com/fmtlib/fmt/pull/119)). Thanks @TrentHouliston.
|
||
|
||
You can now install C++ Format with `make install` command.
|
||
|
||
- Improved [Biicode](http://www.biicode.com/) support
|
||
([#98](https://github.com/fmtlib/fmt/pull/98) and
|
||
[#104](https://github.com/fmtlib/fmt/pull/104)).
|
||
Thanks @MariadeAnton and @franramirez688.
|
||
|
||
- Improved support for building with [Android
|
||
NDK](https://developer.android.com/tools/sdk/ndk/index.html)
|
||
([#107](https://github.com/fmtlib/fmt/pull/107)). Thanks @newnon.
|
||
|
||
The [android-ndk-example](https://github.com/fmtlib/android-ndk-example)
|
||
repository provides and example of using C++ Format with Android NDK:
|
||
|
||

|
||
|
||
- Improved documentation of `SystemError` and `WindowsError`
|
||
([#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 @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 \'\<filename\>\': No such file or directory\" if file doesn\'t
|
||
exist.
|
||
|
||
- Support for AppVeyor continuous integration platform.
|
||
|
||
- `Format` now throws `SystemError` in case of I/O errors.
|
||
|
||
- Improve test infrastructure. Print functions are now tested by
|
||
redirecting the output to a pipe.
|
||
|
||
# 0.8.0 - 2014-04-14
|
||
|
||
- Initial release
|