comparison dep/fmt/ChangeLog.md @ 343:1faa72660932

*: transfer back to cmake from autotools autotools just made lots of things more complicated than they should have and many things broke (i.e. translations)
author Paper <paper@paper.us.eu.org>
date Thu, 20 Jun 2024 05:56:06 -0400
parents
children
comparison
equal deleted inserted replaced
342:adb79bdde329 343:1faa72660932
1 # 10.2.1 - 2024-01-03
2
3 - Fixed ABI compatibility with earlier 10.x versions
4 (https://github.com/fmtlib/fmt/pull/3786). Thanks @saraedum.
5
6 # 10.2.0 - 2024-01-01
7
8 - Added support for the `%j` specifier (the number of days) for
9 `std::chrono::duration` (https://github.com/fmtlib/fmt/issues/3643,
10 https://github.com/fmtlib/fmt/pull/3732). Thanks @intelfx.
11
12 - Added support for the chrono suffix for days and changed
13 the suffix for minutes from "m" to the correct "min"
14 (https://github.com/fmtlib/fmt/issues/3662,
15 https://github.com/fmtlib/fmt/pull/3664).
16 For example ([godbolt](https://godbolt.org/z/9KhMnq9ba)):
17
18 ```c++
19 #include <fmt/chrono.h>
20
21 int main() {
22 fmt::print("{}\n", std::chrono::days(42)); // prints "42d"
23 }
24 ```
25
26 Thanks @Richardk2n.
27
28 - Fixed an overflow in `std::chrono::time_point` formatting with large dates
29 (https://github.com/fmtlib/fmt/issues/3725,
30 https://github.com/fmtlib/fmt/pull/3727). Thanks @cschreib.
31
32 - Added a formatter for `std::source_location`
33 (https://github.com/fmtlib/fmt/pull/3730).
34 For example ([godbolt](https://godbolt.org/z/YajfKjhhr)):
35
36 ```c++
37 #include <source_location>
38 #include <fmt/std.h>
39
40 int main() {
41 fmt::print("{}\n", std::source_location::current());
42 }
43 ```
44
45 prints
46
47 ```
48 /app/example.cpp:5:51: int main()
49 ```
50
51 Thanks @felix642.
52
53 - Added a formatter for `std::bitset`
54 (https://github.com/fmtlib/fmt/pull/3660).
55 For example ([godbolt](https://godbolt.org/z/bdEaGeYxe)):
56
57 ```c++
58 #include <bitset>
59 #include <fmt/std.h>
60
61 int main() {
62 fmt::print("{}\n", std::bitset<6>(42)); // prints "101010"
63 }
64 ```
65
66 Thanks @muggenhor.
67
68 - Added an experimental `nested_formatter` that provides an easy way of
69 applying a formatter to one or more subobjects while automatically handling
70 width, fill and alignment. For example:
71
72 ```c++
73 #include <fmt/format.h>
74
75 struct point {
76 double x, y;
77 };
78
79 template <>
80 struct fmt::formatter<point> : nested_formatter<double> {
81 auto format(point p, format_context& ctx) const {
82 return write_padded(ctx, [=](auto out) {
83 return format_to(out, "({}, {})", nested(p.x), nested(p.y));
84 });
85 }
86 };
87
88 int main() {
89 fmt::print("[{:>20.2f}]", point{1, 2});
90 }
91 ```
92
93 prints
94
95 ```
96 [ (1.00, 2.00)]
97 ```
98
99 - Added the generic representation (`g`) to `std::filesystem::path`
100 (https://github.com/fmtlib/fmt/issues/3715,
101 https://github.com/fmtlib/fmt/pull/3729). For example:
102
103 ```c++
104 #include <filesystem>
105 #include <fmt/std.h>
106
107 int main() {
108 fmt::print("{:g}\n", std::filesystem::path("C:\\foo"));
109 }
110 ```
111
112 prints `"C:/foo"` on Windows.
113
114 Thanks @js324.
115
116 - Made `format_as` work with references
117 (https://github.com/fmtlib/fmt/pull/3739). Thanks @tchaikov.
118
119 - Fixed formatting of invalid UTF-8 with precision
120 (https://github.com/fmtlib/fmt/issues/3284).
121
122 - Fixed an inconsistency between `fmt::to_string` and `fmt::format`
123 (https://github.com/fmtlib/fmt/issues/3684).
124
125 - Disallowed unsafe uses of `fmt::styled`
126 (https://github.com/fmtlib/fmt/issues/3625):
127
128 ```c++
129 auto s = fmt::styled(std::string("dangle"), fmt::emphasis::bold);
130 fmt::print("{}\n", s); // compile error
131 ```
132
133 Pass `fmt::styled(...)` as a parameter instead.
134
135 - Added a null check when formatting a C string with the `s` specifier
136 (https://github.com/fmtlib/fmt/issues/3706).
137
138 - Disallowed the `c` specifier for `bool`
139 (https://github.com/fmtlib/fmt/issues/3726,
140 https://github.com/fmtlib/fmt/pull/3734). Thanks @js324.
141
142 - Made the default formatting unlocalized in `fmt::ostream_formatter` for
143 consistency with the rest of the library
144 (https://github.com/fmtlib/fmt/issues/3460).
145
146 - Fixed localized formatting in bases other than decimal
147 (https://github.com/fmtlib/fmt/issues/3693,
148 https://github.com/fmtlib/fmt/pull/3750). Thanks @js324.
149
150 - Fixed a performance regression in experimental `fmt::ostream::print`
151 (https://github.com/fmtlib/fmt/issues/3674).
152
153 - Added synchronization with the underlying output stream when writing to
154 the Windows console
155 (https://github.com/fmtlib/fmt/pull/3668,
156 https://github.com/fmtlib/fmt/issues/3688,
157 https://github.com/fmtlib/fmt/pull/3689).
158 Thanks @Roman-Koshelev and @dimztimz.
159
160 - Changed to only export `format_error` when {fmt} is built as a shared
161 library (https://github.com/fmtlib/fmt/issues/3626,
162 https://github.com/fmtlib/fmt/pull/3627). Thanks @phprus.
163
164 - Made `fmt::streamed` `constexpr`.
165 (https://github.com/fmtlib/fmt/pull/3650). Thanks @muggenhor.
166
167 - Enabled `consteval` on older versions of MSVC
168 (https://github.com/fmtlib/fmt/pull/3757). Thanks @phprus.
169
170 - Added an option to build without `wchar_t` support on Windows
171 (https://github.com/fmtlib/fmt/issues/3631,
172 https://github.com/fmtlib/fmt/pull/3636). Thanks @glebm.
173
174 - Improved build and CI configuration
175 (https://github.com/fmtlib/fmt/pull/3679,
176 https://github.com/fmtlib/fmt/issues/3701,
177 https://github.com/fmtlib/fmt/pull/3702,
178 https://github.com/fmtlib/fmt/pull/3749).
179 Thanks @jcar87, @pklima and @tchaikov.
180
181 - Fixed various warnings, compilation and test issues
182 (https://github.com/fmtlib/fmt/issues/3607,
183 https://github.com/fmtlib/fmt/pull/3610,
184 https://github.com/fmtlib/fmt/pull/3624,
185 https://github.com/fmtlib/fmt/pull/3630,
186 https://github.com/fmtlib/fmt/pull/3634,
187 https://github.com/fmtlib/fmt/pull/3638,
188 https://github.com/fmtlib/fmt/issues/3645,
189 https://github.com/fmtlib/fmt/issues/3646,
190 https://github.com/fmtlib/fmt/pull/3647,
191 https://github.com/fmtlib/fmt/pull/3652,
192 https://github.com/fmtlib/fmt/issues/3654,
193 https://github.com/fmtlib/fmt/pull/3663,
194 https://github.com/fmtlib/fmt/issues/3670,
195 https://github.com/fmtlib/fmt/pull/3680,
196 https://github.com/fmtlib/fmt/issues/3694,
197 https://github.com/fmtlib/fmt/pull/3695,
198 https://github.com/fmtlib/fmt/pull/3699,
199 https://github.com/fmtlib/fmt/issues/3705,
200 https://github.com/fmtlib/fmt/issues/3710,
201 https://github.com/fmtlib/fmt/issues/3712,
202 https://github.com/fmtlib/fmt/pull/3713,
203 https://github.com/fmtlib/fmt/issues/3714,
204 https://github.com/fmtlib/fmt/pull/3716,
205 https://github.com/fmtlib/fmt/pull/3723,
206 https://github.com/fmtlib/fmt/issues/3738,
207 https://github.com/fmtlib/fmt/issues/3740,
208 https://github.com/fmtlib/fmt/pull/3741,
209 https://github.com/fmtlib/fmt/pull/3743,
210 https://github.com/fmtlib/fmt/issues/3745,
211 https://github.com/fmtlib/fmt/pull/3747,
212 https://github.com/fmtlib/fmt/pull/3748,
213 https://github.com/fmtlib/fmt/pull/3751,
214 https://github.com/fmtlib/fmt/pull/3754,
215 https://github.com/fmtlib/fmt/pull/3755,
216 https://github.com/fmtlib/fmt/issues/3760,
217 https://github.com/fmtlib/fmt/pull/3762,
218 https://github.com/fmtlib/fmt/issues/3763,
219 https://github.com/fmtlib/fmt/pull/3764,
220 https://github.com/fmtlib/fmt/issues/3774,
221 https://github.com/fmtlib/fmt/pull/3779).
222 Thanks @danakj, @vinayyadav3016, @cyyever, @phprus, @qimiko, @saschasc,
223 @gsjaardema, @lazka, @Zhaojun-Liu, @carlsmedstad, @hotwatermorning,
224 @cptFracassa, @kuguma, @PeterJohnson, @H1X4Dev, @asantoni, @eltociear,
225 @msimberg, @tchaikov, @waywardmonkeys.
226
227 - Improved documentation and README
228 (https://github.com/fmtlib/fmt/issues/2086,
229 https://github.com/fmtlib/fmt/issues/3637,
230 https://github.com/fmtlib/fmt/pull/3642,
231 https://github.com/fmtlib/fmt/pull/3653,
232 https://github.com/fmtlib/fmt/pull/3655,
233 https://github.com/fmtlib/fmt/pull/3661,
234 https://github.com/fmtlib/fmt/issues/3673,
235 https://github.com/fmtlib/fmt/pull/3677,
236 https://github.com/fmtlib/fmt/pull/3737,
237 https://github.com/fmtlib/fmt/issues/3742,
238 https://github.com/fmtlib/fmt/pull/3744).
239 Thanks @idzm, @perlun, @joycebrum, @fennewald, @reinhardt1053, @GeorgeLS.
240
241 - Updated CI dependencies
242 (https://github.com/fmtlib/fmt/pull/3615,
243 https://github.com/fmtlib/fmt/pull/3622,
244 https://github.com/fmtlib/fmt/pull/3623,
245 https://github.com/fmtlib/fmt/pull/3666,
246 https://github.com/fmtlib/fmt/pull/3696,
247 https://github.com/fmtlib/fmt/pull/3697,
248 https://github.com/fmtlib/fmt/pull/3759,
249 https://github.com/fmtlib/fmt/pull/3782).
250
251 # 10.1.1 - 2023-08-28
252
253 - Added formatters for `std::atomic` and `atomic_flag`
254 (https://github.com/fmtlib/fmt/pull/3574,
255 https://github.com/fmtlib/fmt/pull/3594).
256 Thanks @wangzw and @AlexGuteniev.
257 - Fixed an error about partial specialization of `formatter<string>`
258 after instantiation when compiled with gcc and C++20
259 (https://github.com/fmtlib/fmt/issues/3584).
260 - Fixed compilation as a C++20 module with gcc and clang
261 (https://github.com/fmtlib/fmt/issues/3587,
262 https://github.com/fmtlib/fmt/pull/3597,
263 https://github.com/fmtlib/fmt/pull/3605).
264 Thanks @MathewBensonCode.
265 - Made `fmt::to_string` work with types that have `format_as`
266 overloads (https://github.com/fmtlib/fmt/pull/3575). Thanks @phprus.
267 - Made `formatted_size` work with integral format specifiers at
268 compile time (https://github.com/fmtlib/fmt/pull/3591).
269 Thanks @elbeno.
270 - Fixed a warning about the `no_unique_address` attribute on clang-cl
271 (https://github.com/fmtlib/fmt/pull/3599). Thanks @lukester1975.
272 - Improved compatibility with the legacy GBK encoding
273 (https://github.com/fmtlib/fmt/issues/3598,
274 https://github.com/fmtlib/fmt/pull/3599). Thanks @YuHuanTin.
275 - Added OpenSSF Scorecard analysis
276 (https://github.com/fmtlib/fmt/issues/3530,
277 https://github.com/fmtlib/fmt/pull/3571). Thanks @joycebrum.
278 - Updated CI dependencies
279 (https://github.com/fmtlib/fmt/pull/3591,
280 https://github.com/fmtlib/fmt/pull/3592,
281 https://github.com/fmtlib/fmt/pull/3593,
282 https://github.com/fmtlib/fmt/pull/3602).
283
284 # 10.1.0 - 2023-08-12
285
286 - Optimized format string compilation resulting in up to 40% speed up
287 in compiled `format_to` and \~4x speed up in compiled `format_to_n`
288 on a concatenation benchmark
289 (https://github.com/fmtlib/fmt/issues/3133,
290 https://github.com/fmtlib/fmt/issues/3484).
291
292 {fmt} 10.0:
293
294 ---------------------------------------------------------
295 Benchmark Time CPU Iterations
296 ---------------------------------------------------------
297 BM_format_to 78.9 ns 78.9 ns 8881746
298 BM_format_to_n 568 ns 568 ns 1232089
299
300 {fmt} 10.1:
301
302 ---------------------------------------------------------
303 Benchmark Time CPU Iterations
304 ---------------------------------------------------------
305 BM_format_to 54.9 ns 54.9 ns 12727944
306 BM_format_to_n 133 ns 133 ns 5257795
307
308 - Optimized storage of an empty allocator in `basic_memory_buffer`
309 (https://github.com/fmtlib/fmt/pull/3485). Thanks @Minty-Meeo.
310
311 - Added formatters for proxy references to elements of
312 `std::vector<bool>` and `std::bitset<N>`
313 (https://github.com/fmtlib/fmt/issues/3567,
314 https://github.com/fmtlib/fmt/pull/3570). For example
315 ([godbolt](https://godbolt.org/z/zYb79Pvn8)):
316
317 ```c++
318 #include <vector>
319 #include <fmt/std.h>
320
321 int main() {
322 auto v = std::vector<bool>{true};
323 fmt::print("{}", v[0]);
324 }
325 ```
326
327 Thanks @phprus and @felix642.
328
329 - Fixed an ambiguous formatter specialization for containers that look
330 like container adaptors such as `boost::flat_set`
331 (https://github.com/fmtlib/fmt/issues/3556,
332 https://github.com/fmtlib/fmt/pull/3561). Thanks @5chmidti.
333
334 - Fixed compilation when formatting durations not convertible from
335 `std::chrono::seconds`
336 (https://github.com/fmtlib/fmt/pull/3430). Thanks @patlkli.
337
338 - Made the `formatter` specialization for `char*` const-correct
339 (https://github.com/fmtlib/fmt/pull/3432). Thanks @timsong-cpp.
340
341 - Made `{}` and `{:}` handled consistently during compile-time checks
342 (https://github.com/fmtlib/fmt/issues/3526).
343
344 - Disallowed passing temporaries to `make_format_args` to improve API
345 safety by preventing dangling references.
346
347 - Improved the compile-time error for unformattable types
348 (https://github.com/fmtlib/fmt/pull/3478). Thanks @BRevzin.
349
350 - Improved the floating-point formatter
351 (https://github.com/fmtlib/fmt/pull/3448,
352 https://github.com/fmtlib/fmt/pull/3450).
353 Thanks @florimond-collette.
354
355 - Fixed handling of precision for `long double` larger than 64 bits.
356 (https://github.com/fmtlib/fmt/issues/3539,
357 https://github.com/fmtlib/fmt/issues/3564).
358
359 - Made floating-point and chrono tests less platform-dependent
360 (https://github.com/fmtlib/fmt/issues/3337,
361 https://github.com/fmtlib/fmt/issues/3433,
362 https://github.com/fmtlib/fmt/pull/3434). Thanks @phprus.
363
364 - Removed the remnants of the Grisu floating-point formatter that has
365 been replaced by Dragonbox in earlier versions.
366
367 - Added `throw_format_error` to the public API
368 (https://github.com/fmtlib/fmt/pull/3551). Thanks @mjerabek.
369
370 - Made `FMT_THROW` assert even if assertions are disabled when
371 compiling with exceptions disabled
372 (https://github.com/fmtlib/fmt/issues/3418,
373 https://github.com/fmtlib/fmt/pull/3439). Thanks @BRevzin.
374
375 - Made `format_as` and `std::filesystem::path` formatter work with
376 exotic code unit types.
377 (https://github.com/fmtlib/fmt/pull/3457,
378 https://github.com/fmtlib/fmt/pull/3476). Thanks @gix and @hmbj.
379
380 - Added support for the `?` format specifier to
381 `std::filesystem::path` and made the default unescaped for
382 consistency with strings.
383
384 - Deprecated the wide stream overload of `printf`.
385
386 - Removed unused `basic_printf_parse_context`.
387
388 - Improved RTTI detection used when formatting exceptions
389 (https://github.com/fmtlib/fmt/pull/3468). Thanks @danakj.
390
391 - Improved compatibility with VxWorks7
392 (https://github.com/fmtlib/fmt/pull/3467). Thanks @wenshan1.
393
394 - Improved documentation
395 (https://github.com/fmtlib/fmt/issues/3174,
396 https://github.com/fmtlib/fmt/issues/3423,
397 https://github.com/fmtlib/fmt/pull/3454,
398 https://github.com/fmtlib/fmt/issues/3458,
399 https://github.com/fmtlib/fmt/pull/3461,
400 https://github.com/fmtlib/fmt/issues/3487,
401 https://github.com/fmtlib/fmt/pull/3515).
402 Thanks @zencatalyst, @rlalik and @mikecrowe.
403
404 - Improved build and CI configurations
405 (https://github.com/fmtlib/fmt/issues/3449,
406 https://github.com/fmtlib/fmt/pull/3451,
407 https://github.com/fmtlib/fmt/pull/3452,
408 https://github.com/fmtlib/fmt/pull/3453,
409 https://github.com/fmtlib/fmt/pull/3459,
410 https://github.com/fmtlib/fmt/issues/3481,
411 https://github.com/fmtlib/fmt/pull/3486,
412 https://github.com/fmtlib/fmt/issues/3489,
413 https://github.com/fmtlib/fmt/pull/3496,
414 https://github.com/fmtlib/fmt/issues/3517,
415 https://github.com/fmtlib/fmt/pull/3523,
416 https://github.com/fmtlib/fmt/pull/3563).
417 Thanks @joycebrum, @glebm, @phprus, @petrmanek, @setoye and @abouvier.
418
419 - Fixed various warnings and compilation issues
420 (https://github.com/fmtlib/fmt/issues/3408,
421 https://github.com/fmtlib/fmt/issues/3424,
422 https://github.com/fmtlib/fmt/issues/3444,
423 https://github.com/fmtlib/fmt/pull/3446,
424 https://github.com/fmtlib/fmt/pull/3475,
425 https://github.com/fmtlib/fmt/pull/3482,
426 https://github.com/fmtlib/fmt/issues/3492,
427 https://github.com/fmtlib/fmt/pull/3493,
428 https://github.com/fmtlib/fmt/pull/3508,
429 https://github.com/fmtlib/fmt/issues/3509,
430 https://github.com/fmtlib/fmt/issues/3533,
431 https://github.com/fmtlib/fmt/pull/3542,
432 https://github.com/fmtlib/fmt/issues/3543,
433 https://github.com/fmtlib/fmt/issues/3540,
434 https://github.com/fmtlib/fmt/pull/3544,
435 https://github.com/fmtlib/fmt/issues/3548,
436 https://github.com/fmtlib/fmt/pull/3549,
437 https://github.com/fmtlib/fmt/pull/3550,
438 https://github.com/fmtlib/fmt/pull/3552).
439 Thanks @adesitter, @hmbj, @Minty-Meeo, @phprus, @TobiSchluter,
440 @kieranclancy, @alexeedm, @jurihock, @Ozomahtli and @razaqq.
441
442 # 10.0.0 - 2023-05-09
443
444 - Replaced Grisu with a new floating-point formatting algorithm for
445 given precision (https://github.com/fmtlib/fmt/issues/3262,
446 https://github.com/fmtlib/fmt/issues/2750,
447 https://github.com/fmtlib/fmt/pull/3269,
448 https://github.com/fmtlib/fmt/pull/3276). The new algorithm
449 is based on Dragonbox already used for the shortest representation
450 and gives substantial performance improvement:
451
452 ![](https://user-images.githubusercontent.com/33922675/211956670-84891a09-6867-47d9-82fc-3230da7abe0f.png)
453
454 - Red: new algorithm
455 - Green: new algorithm with `FMT_USE_FULL_CACHE_DRAGONBOX` defined
456 to 1
457 - Blue: old algorithm
458
459 Thanks @jk-jeon.
460
461 - Replaced `snprintf`-based hex float formatter with an internal
462 implementation (https://github.com/fmtlib/fmt/pull/3179,
463 https://github.com/fmtlib/fmt/pull/3203). This removes the
464 last usage of `s(n)printf` in {fmt}. Thanks @phprus.
465
466 - Fixed alignment of floating-point numbers with localization
467 (https://github.com/fmtlib/fmt/issues/3263,
468 https://github.com/fmtlib/fmt/pull/3272). Thanks @ShawnZhong.
469
470 - Made handling of `#` consistent with `std::format`.
471
472 - Improved C++20 module support
473 (https://github.com/fmtlib/fmt/pull/3134,
474 https://github.com/fmtlib/fmt/pull/3254,
475 https://github.com/fmtlib/fmt/pull/3386,
476 https://github.com/fmtlib/fmt/pull/3387,
477 https://github.com/fmtlib/fmt/pull/3388,
478 https://github.com/fmtlib/fmt/pull/3392,
479 https://github.com/fmtlib/fmt/pull/3397,
480 https://github.com/fmtlib/fmt/pull/3399,
481 https://github.com/fmtlib/fmt/pull/3400).
482 Thanks @laitingsheng, @Orvid and @DanielaE.
483
484 - Switched to the [modules CMake library](https://github.com/vitaut/modules)
485 which allows building {fmt} as a C++20 module with clang:
486
487 CXX=clang++ cmake -DFMT_MODULE=ON .
488 make
489
490 - Made `format_as` work with any user-defined type and not just enums.
491 For example ([godbolt](https://godbolt.org/z/b7rqhq5Kh)):
492
493 ```c++
494 #include <fmt/format.h>
495
496 struct floaty_mc_floatface {
497 double value;
498 };
499
500 auto format_as(floaty_mc_floatface f) { return f.value; }
501
502 int main() {
503 fmt::print("{:8}\n", floaty_mc_floatface{0.42}); // prints " 0.42"
504 }
505 ```
506
507 - Removed deprecated implicit conversions for enums and conversions to
508 primitive types for compatibility with `std::format` and to prevent
509 potential ODR violations. Use `format_as` instead.
510
511 - Added support for fill, align and width to the time point formatter
512 (https://github.com/fmtlib/fmt/issues/3237,
513 https://github.com/fmtlib/fmt/pull/3260,
514 https://github.com/fmtlib/fmt/pull/3275). For example
515 ([godbolt](https://godbolt.org/z/rKP6MGz6c)):
516
517 ```c++
518 #include <fmt/chrono.h>
519
520 int main() {
521 // prints " 2023"
522 fmt::print("{:>8%Y}\n", std::chrono::system_clock::now());
523 }
524 ```
525
526 Thanks @ShawnZhong.
527
528 - Implemented formatting of subseconds
529 (https://github.com/fmtlib/fmt/issues/2207,
530 https://github.com/fmtlib/fmt/issues/3117,
531 https://github.com/fmtlib/fmt/pull/3115,
532 https://github.com/fmtlib/fmt/pull/3143,
533 https://github.com/fmtlib/fmt/pull/3144,
534 https://github.com/fmtlib/fmt/pull/3349). For example
535 ([godbolt](https://godbolt.org/z/45738oGEo)):
536
537 ```c++
538 #include <fmt/chrono.h>
539
540 int main() {
541 // prints 01.234567
542 fmt::print("{:%S}\n", std::chrono::microseconds(1234567));
543 }
544 ```
545
546 Thanks @patrickroocks @phprus and @BRevzin.
547
548 - Added precision support to `%S`
549 (https://github.com/fmtlib/fmt/pull/3148). Thanks @SappyJoy
550
551 - Added support for `std::utc_time`
552 (https://github.com/fmtlib/fmt/issues/3098,
553 https://github.com/fmtlib/fmt/pull/3110). Thanks @patrickroocks.
554
555 - Switched formatting of `std::chrono::system_clock` from local time
556 to UTC for compatibility with the standard
557 (https://github.com/fmtlib/fmt/issues/3199,
558 https://github.com/fmtlib/fmt/pull/3230). Thanks @ned14.
559
560 - Added support for `%Ez` and `%Oz` to chrono formatters.
561 (https://github.com/fmtlib/fmt/issues/3220,
562 https://github.com/fmtlib/fmt/pull/3222). Thanks @phprus.
563
564 - Improved validation of format specifiers for `std::chrono::duration`
565 (https://github.com/fmtlib/fmt/issues/3219,
566 https://github.com/fmtlib/fmt/pull/3232). Thanks @ShawnZhong.
567
568 - Fixed formatting of time points before the epoch
569 (https://github.com/fmtlib/fmt/issues/3117,
570 https://github.com/fmtlib/fmt/pull/3261). For example
571 ([godbolt](https://godbolt.org/z/f7bcznb3W)):
572
573 ```c++
574 #include <fmt/chrono.h>
575
576 int main() {
577 auto t = std::chrono::system_clock::from_time_t(0) -
578 std::chrono::milliseconds(250);
579 fmt::print("{:%S}\n", t); // prints 59.750000000
580 }
581 ```
582
583 Thanks @ShawnZhong.
584
585 - Experimental: implemented glibc extension for padding seconds,
586 minutes and hours
587 (https://github.com/fmtlib/fmt/issues/2959,
588 https://github.com/fmtlib/fmt/pull/3271). Thanks @ShawnZhong.
589
590 - Added a formatter for `std::exception`
591 (https://github.com/fmtlib/fmt/issues/2977,
592 https://github.com/fmtlib/fmt/issues/3012,
593 https://github.com/fmtlib/fmt/pull/3062,
594 https://github.com/fmtlib/fmt/pull/3076,
595 https://github.com/fmtlib/fmt/pull/3119). For example
596 ([godbolt](https://godbolt.org/z/8xoWGs9e4)):
597
598 ```c++
599 #include <fmt/std.h>
600 #include <vector>
601
602 int main() {
603 try {
604 std::vector<bool>().at(0);
605 } catch(const std::exception& e) {
606 fmt::print("{}", e);
607 }
608 }
609 ```
610
611 prints:
612
613 vector<bool>::_M_range_check: __n (which is 0) >= this->size() (which is 0)
614
615 on libstdc++. Thanks @zach2good and @phprus.
616
617 - Moved `std::error_code` formatter from `fmt/os.h` to `fmt/std.h`.
618 (https://github.com/fmtlib/fmt/pull/3125). Thanks @phprus.
619
620 - Added formatters for standard container adapters:
621 `std::priority_queue`, `std::queue` and `std::stack`
622 (https://github.com/fmtlib/fmt/issues/3215,
623 https://github.com/fmtlib/fmt/pull/3279). For example
624 ([godbolt](https://godbolt.org/z/74h1xY9qK)):
625
626 ```c++
627 #include <fmt/ranges.h>
628 #include <stack>
629 #include <vector>
630
631 int main() {
632 auto s = std::stack<bool, std::vector<bool>>();
633 for (auto b: {true, false, true}) s.push(b);
634 fmt::print("{}\n", s); // prints [true, false, true]
635 }
636 ```
637
638 Thanks @ShawnZhong.
639
640 - Added a formatter for `std::optional` to `fmt/std.h`
641 (https://github.com/fmtlib/fmt/issues/1367,
642 https://github.com/fmtlib/fmt/pull/3303).
643 Thanks @tom-huntington.
644
645 - Fixed formatting of valueless by exception variants
646 (https://github.com/fmtlib/fmt/pull/3347). Thanks @TheOmegaCarrot.
647
648 - Made `fmt::ptr` accept `unique_ptr` with a custom deleter
649 (https://github.com/fmtlib/fmt/pull/3177). Thanks @hmbj.
650
651 - Fixed formatting of noncopyable ranges and nested ranges of chars
652 (https://github.com/fmtlib/fmt/pull/3158
653 https://github.com/fmtlib/fmt/issues/3286,
654 https://github.com/fmtlib/fmt/pull/3290). Thanks @BRevzin.
655
656 - Fixed issues with formatting of paths and ranges of paths
657 (https://github.com/fmtlib/fmt/issues/3319,
658 https://github.com/fmtlib/fmt/pull/3321
659 https://github.com/fmtlib/fmt/issues/3322). Thanks @phprus.
660
661 - Improved handling of invalid Unicode in paths.
662
663 - Enabled compile-time checks on Apple clang 14 and later
664 (https://github.com/fmtlib/fmt/pull/3331). Thanks @cloyce.
665
666 - Improved compile-time checks of named arguments
667 (https://github.com/fmtlib/fmt/issues/3105,
668 https://github.com/fmtlib/fmt/pull/3214). Thanks @rbrich.
669
670 - Fixed formatting when both alignment and `0` are given
671 (https://github.com/fmtlib/fmt/issues/3236,
672 https://github.com/fmtlib/fmt/pull/3248). Thanks @ShawnZhong.
673
674 - Improved Unicode support in the experimental file API on Windows
675 (https://github.com/fmtlib/fmt/issues/3234,
676 https://github.com/fmtlib/fmt/pull/3293). Thanks @Fros1er.
677
678 - Unified UTF transcoding
679 (https://github.com/fmtlib/fmt/pull/3416). Thanks @phprus.
680
681 - Added support for UTF-8 digit separators via an experimental locale
682 facet (https://github.com/fmtlib/fmt/issues/1861). For
683 example ([godbolt](https://godbolt.org/z/f7bcznb3W)):
684
685 ```c++
686 auto loc = std::locale(
687 std::locale(), new fmt::format_facet<std::locale>("’"));
688 auto s = fmt::format(loc, "{:L}", 1000);
689 ```
690
691 where `’` is U+2019 used as a digit separator in the de_CH locale.
692
693 - Added an overload of `formatted_size` that takes a locale
694 (https://github.com/fmtlib/fmt/issues/3084,
695 https://github.com/fmtlib/fmt/pull/3087). Thanks @gerboengels.
696
697 - Removed the deprecated `FMT_DEPRECATED_OSTREAM`.
698
699 - Fixed a UB when using a null `std::string_view` with
700 `fmt::to_string` or format string compilation
701 (https://github.com/fmtlib/fmt/issues/3241,
702 https://github.com/fmtlib/fmt/pull/3244). Thanks @phprus.
703
704 - Added `starts_with` to the fallback `string_view` implementation
705 (https://github.com/fmtlib/fmt/pull/3080). Thanks @phprus.
706
707 - Added `fmt::basic_format_string::get()` for compatibility with
708 `basic_format_string`
709 (https://github.com/fmtlib/fmt/pull/3111). Thanks @huangqinjin.
710
711 - Added `println` for compatibility with C++23
712 (https://github.com/fmtlib/fmt/pull/3267). Thanks @ShawnZhong.
713
714 - Renamed the `FMT_EXPORT` macro for shared library usage to
715 `FMT_LIB_EXPORT`.
716
717 - Improved documentation
718 (https://github.com/fmtlib/fmt/issues/3108,
719 https://github.com/fmtlib/fmt/issues/3169,
720 https://github.com/fmtlib/fmt/pull/3243).
721 https://github.com/fmtlib/fmt/pull/3404).
722 Thanks @Cleroth and @Vertexwahn.
723
724 - Improved build configuration and tests
725 (https://github.com/fmtlib/fmt/pull/3118,
726 https://github.com/fmtlib/fmt/pull/3120,
727 https://github.com/fmtlib/fmt/pull/3188,
728 https://github.com/fmtlib/fmt/issues/3189,
729 https://github.com/fmtlib/fmt/pull/3198,
730 https://github.com/fmtlib/fmt/pull/3205,
731 https://github.com/fmtlib/fmt/pull/3207,
732 https://github.com/fmtlib/fmt/pull/3210,
733 https://github.com/fmtlib/fmt/pull/3240,
734 https://github.com/fmtlib/fmt/pull/3256,
735 https://github.com/fmtlib/fmt/pull/3264,
736 https://github.com/fmtlib/fmt/issues/3299,
737 https://github.com/fmtlib/fmt/pull/3302,
738 https://github.com/fmtlib/fmt/pull/3312,
739 https://github.com/fmtlib/fmt/issues/3317,
740 https://github.com/fmtlib/fmt/pull/3328,
741 https://github.com/fmtlib/fmt/pull/3333,
742 https://github.com/fmtlib/fmt/pull/3369,
743 https://github.com/fmtlib/fmt/issues/3373,
744 https://github.com/fmtlib/fmt/pull/3395,
745 https://github.com/fmtlib/fmt/pull/3406,
746 https://github.com/fmtlib/fmt/pull/3411).
747 Thanks @dimztimz, @phprus, @DavidKorczynski, @ChrisThrasher,
748 @FrancoisCarouge, @kennyweiss, @luzpaz, @codeinred, @Mixaill, @joycebrum,
749 @kevinhwang and @Vertexwahn.
750
751 - Fixed a regression in handling empty format specifiers after a colon
752 (`{:}`) (https://github.com/fmtlib/fmt/pull/3086). Thanks @oxidase.
753
754 - Worked around a broken implementation of
755 `std::is_constant_evaluated` in some versions of libstdc++ on clang
756 (https://github.com/fmtlib/fmt/issues/3247,
757 https://github.com/fmtlib/fmt/pull/3281). Thanks @phprus.
758
759 - Fixed formatting of volatile variables
760 (https://github.com/fmtlib/fmt/pull/3068).
761
762 - Fixed various warnings and compilation issues
763 (https://github.com/fmtlib/fmt/pull/3057,
764 https://github.com/fmtlib/fmt/pull/3066,
765 https://github.com/fmtlib/fmt/pull/3072,
766 https://github.com/fmtlib/fmt/pull/3082,
767 https://github.com/fmtlib/fmt/pull/3091,
768 https://github.com/fmtlib/fmt/issues/3092,
769 https://github.com/fmtlib/fmt/pull/3093,
770 https://github.com/fmtlib/fmt/pull/3095,
771 https://github.com/fmtlib/fmt/issues/3096,
772 https://github.com/fmtlib/fmt/pull/3097,
773 https://github.com/fmtlib/fmt/issues/3128,
774 https://github.com/fmtlib/fmt/pull/3129,
775 https://github.com/fmtlib/fmt/pull/3137,
776 https://github.com/fmtlib/fmt/pull/3139,
777 https://github.com/fmtlib/fmt/issues/3140,
778 https://github.com/fmtlib/fmt/pull/3142,
779 https://github.com/fmtlib/fmt/issues/3149,
780 https://github.com/fmtlib/fmt/pull/3150,
781 https://github.com/fmtlib/fmt/issues/3154,
782 https://github.com/fmtlib/fmt/issues/3163,
783 https://github.com/fmtlib/fmt/issues/3178,
784 https://github.com/fmtlib/fmt/pull/3184,
785 https://github.com/fmtlib/fmt/pull/3196,
786 https://github.com/fmtlib/fmt/issues/3204,
787 https://github.com/fmtlib/fmt/pull/3206,
788 https://github.com/fmtlib/fmt/pull/3208,
789 https://github.com/fmtlib/fmt/issues/3213,
790 https://github.com/fmtlib/fmt/pull/3216,
791 https://github.com/fmtlib/fmt/issues/3224,
792 https://github.com/fmtlib/fmt/issues/3226,
793 https://github.com/fmtlib/fmt/issues/3228,
794 https://github.com/fmtlib/fmt/pull/3229,
795 https://github.com/fmtlib/fmt/pull/3259,
796 https://github.com/fmtlib/fmt/issues/3274,
797 https://github.com/fmtlib/fmt/issues/3287,
798 https://github.com/fmtlib/fmt/pull/3288,
799 https://github.com/fmtlib/fmt/issues/3292,
800 https://github.com/fmtlib/fmt/pull/3295,
801 https://github.com/fmtlib/fmt/pull/3296,
802 https://github.com/fmtlib/fmt/issues/3298,
803 https://github.com/fmtlib/fmt/issues/3325,
804 https://github.com/fmtlib/fmt/pull/3326,
805 https://github.com/fmtlib/fmt/issues/3334,
806 https://github.com/fmtlib/fmt/issues/3342,
807 https://github.com/fmtlib/fmt/pull/3343,
808 https://github.com/fmtlib/fmt/issues/3351,
809 https://github.com/fmtlib/fmt/pull/3352,
810 https://github.com/fmtlib/fmt/pull/3362,
811 https://github.com/fmtlib/fmt/issues/3365,
812 https://github.com/fmtlib/fmt/pull/3366,
813 https://github.com/fmtlib/fmt/pull/3374,
814 https://github.com/fmtlib/fmt/issues/3377,
815 https://github.com/fmtlib/fmt/pull/3378,
816 https://github.com/fmtlib/fmt/issues/3381,
817 https://github.com/fmtlib/fmt/pull/3398,
818 https://github.com/fmtlib/fmt/pull/3413,
819 https://github.com/fmtlib/fmt/issues/3415).
820 Thanks @phprus, @gsjaardema, @NewbieOrange, @EngineLessCC, @asmaloney,
821 @HazardyKnusperkeks, @sergiud, @Youw, @thesmurph, @czudziakm,
822 @Roman-Koshelev, @chronoxor, @ShawnZhong, @russelltg, @glebm, @tmartin-gh,
823 @Zhaojun-Liu, @louiswins and @mogemimi.
824
825 # 9.1.0 - 2022-08-27
826
827 - `fmt::formatted_size` now works at compile time
828 (https://github.com/fmtlib/fmt/pull/3026). For example
829 ([godbolt](https://godbolt.org/z/1MW5rMdf8)):
830
831 ```c++
832 #include <fmt/compile.h>
833
834 int main() {
835 using namespace fmt::literals;
836 constexpr size_t n = fmt::formatted_size("{}"_cf, 42);
837 fmt::print("{}\n", n); // prints 2
838 }
839 ```
840
841 Thanks @marksantaniello.
842
843 - Fixed handling of invalid UTF-8
844 (https://github.com/fmtlib/fmt/pull/3038,
845 https://github.com/fmtlib/fmt/pull/3044,
846 https://github.com/fmtlib/fmt/pull/3056).
847 Thanks @phprus and @skeeto.
848
849 - Improved Unicode support in `ostream` overloads of `print`
850 (https://github.com/fmtlib/fmt/pull/2994,
851 https://github.com/fmtlib/fmt/pull/3001,
852 https://github.com/fmtlib/fmt/pull/3025). Thanks @dimztimz.
853
854 - Fixed handling of the sign specifier in localized formatting on
855 systems with 32-bit `wchar_t`
856 (https://github.com/fmtlib/fmt/issues/3041).
857
858 - Added support for wide streams to `fmt::streamed`
859 (https://github.com/fmtlib/fmt/pull/2994). Thanks @phprus.
860
861 - Added the `n` specifier that disables the output of delimiters when
862 formatting ranges (https://github.com/fmtlib/fmt/pull/2981,
863 https://github.com/fmtlib/fmt/pull/2983). For example
864 ([godbolt](https://godbolt.org/z/roKqGdj8c)):
865
866 ```c++
867 #include <fmt/ranges.h>
868 #include <vector>
869
870 int main() {
871 auto v = std::vector{1, 2, 3};
872 fmt::print("{:n}\n", v); // prints 1, 2, 3
873 }
874 ```
875
876 Thanks @BRevzin.
877
878 - Worked around problematic `std::string_view` constructors introduced
879 in C++23 (https://github.com/fmtlib/fmt/issues/3030,
880 https://github.com/fmtlib/fmt/issues/3050). Thanks @strega-nil-ms.
881
882 - Improve handling (exclusion) of recursive ranges
883 (https://github.com/fmtlib/fmt/issues/2968,
884 https://github.com/fmtlib/fmt/pull/2974). Thanks @Dani-Hub.
885
886 - Improved error reporting in format string compilation
887 (https://github.com/fmtlib/fmt/issues/3055).
888
889 - Improved the implementation of
890 [Dragonbox](https://github.com/jk-jeon/dragonbox), the algorithm
891 used for the default floating-point formatting
892 (https://github.com/fmtlib/fmt/pull/2984). Thanks @jk-jeon.
893
894 - Fixed issues with floating-point formatting on exotic platforms.
895
896 - Improved the implementation of chrono formatting
897 (https://github.com/fmtlib/fmt/pull/3010). Thanks @phprus.
898
899 - Improved documentation
900 (https://github.com/fmtlib/fmt/pull/2966,
901 https://github.com/fmtlib/fmt/pull/3009,
902 https://github.com/fmtlib/fmt/issues/3020,
903 https://github.com/fmtlib/fmt/pull/3037).
904 Thanks @mwinterb, @jcelerier and @remiburtin.
905
906 - Improved build configuration
907 (https://github.com/fmtlib/fmt/pull/2991,
908 https://github.com/fmtlib/fmt/pull/2995,
909 https://github.com/fmtlib/fmt/issues/3004,
910 https://github.com/fmtlib/fmt/pull/3007,
911 https://github.com/fmtlib/fmt/pull/3040).
912 Thanks @dimztimz and @hwhsu1231.
913
914 - Fixed various warnings and compilation issues
915 (https://github.com/fmtlib/fmt/issues/2969,
916 https://github.com/fmtlib/fmt/pull/2971,
917 https://github.com/fmtlib/fmt/issues/2975,
918 https://github.com/fmtlib/fmt/pull/2982,
919 https://github.com/fmtlib/fmt/pull/2985,
920 https://github.com/fmtlib/fmt/issues/2988,
921 https://github.com/fmtlib/fmt/issues/2989,
922 https://github.com/fmtlib/fmt/issues/3000,
923 https://github.com/fmtlib/fmt/issues/3006,
924 https://github.com/fmtlib/fmt/issues/3014,
925 https://github.com/fmtlib/fmt/issues/3015,
926 https://github.com/fmtlib/fmt/pull/3021,
927 https://github.com/fmtlib/fmt/issues/3023,
928 https://github.com/fmtlib/fmt/pull/3024,
929 https://github.com/fmtlib/fmt/pull/3029,
930 https://github.com/fmtlib/fmt/pull/3043,
931 https://github.com/fmtlib/fmt/issues/3052,
932 https://github.com/fmtlib/fmt/pull/3053,
933 https://github.com/fmtlib/fmt/pull/3054).
934 Thanks @h-friederich, @dimztimz, @olupton, @bernhardmgruber and @phprus.
935
936 # 9.0.0 - 2022-07-04
937
938 - Switched to the internal floating point formatter for all decimal
939 presentation formats. In particular this results in consistent
940 rounding on all platforms and removing the `s[n]printf` fallback for
941 decimal FP formatting.
942
943 - Compile-time floating point formatting no longer requires the
944 header-only mode. For example
945 ([godbolt](https://godbolt.org/z/G37PTeG3b)):
946
947 ```c++
948 #include <array>
949 #include <fmt/compile.h>
950
951 consteval auto compile_time_dtoa(double value) -> std::array<char, 10> {
952 auto result = std::array<char, 10>();
953 fmt::format_to(result.data(), FMT_COMPILE("{}"), value);
954 return result;
955 }
956
957 constexpr auto answer = compile_time_dtoa(0.42);
958 ```
959
960 works with the default settings.
961
962 - Improved the implementation of
963 [Dragonbox](https://github.com/jk-jeon/dragonbox), the algorithm
964 used for the default floating-point formatting
965 (https://github.com/fmtlib/fmt/pull/2713,
966 https://github.com/fmtlib/fmt/pull/2750). Thanks @jk-jeon.
967
968 - Made `fmt::to_string` work with `__float128`. This uses the internal
969 FP formatter and works even on system without `__float128` support
970 in `[s]printf`.
971
972 - Disabled automatic `std::ostream` insertion operator (`operator<<`)
973 discovery when `fmt/ostream.h` is included to prevent ODR
974 violations. You can get the old behavior by defining
975 `FMT_DEPRECATED_OSTREAM` but this will be removed in the next major
976 release. Use `fmt::streamed` or `fmt::ostream_formatter` to enable
977 formatting via `std::ostream` instead.
978
979 - Added `fmt::ostream_formatter` that can be used to write `formatter`
980 specializations that perform formatting via `std::ostream`. For
981 example ([godbolt](https://godbolt.org/z/5sEc5qMsf)):
982
983 ```c++
984 #include <fmt/ostream.h>
985
986 struct date {
987 int year, month, day;
988
989 friend std::ostream& operator<<(std::ostream& os, const date& d) {
990 return os << d.year << '-' << d.month << '-' << d.day;
991 }
992 };
993
994 template <> struct fmt::formatter<date> : ostream_formatter {};
995
996 std::string s = fmt::format("The date is {}", date{2012, 12, 9});
997 // s == "The date is 2012-12-9"
998 ```
999
1000 - Added the `fmt::streamed` function that takes an object and formats
1001 it via `std::ostream`. For example
1002 ([godbolt](https://godbolt.org/z/5G3346G1f)):
1003
1004 ```c++
1005 #include <thread>
1006 #include <fmt/ostream.h>
1007
1008 int main() {
1009 fmt::print("Current thread id: {}\n",
1010 fmt::streamed(std::this_thread::get_id()));
1011 }
1012 ```
1013
1014 Note that `fmt/std.h` provides a `formatter` specialization for
1015 `std::thread::id` so you don\'t need to format it via
1016 `std::ostream`.
1017
1018 - Deprecated implicit conversions of unscoped enums to integers for
1019 consistency with scoped enums.
1020
1021 - Added an argument-dependent lookup based `format_as` extension API
1022 to simplify formatting of enums.
1023
1024 - Added experimental `std::variant` formatting support
1025 (https://github.com/fmtlib/fmt/pull/2941). For example
1026 ([godbolt](https://godbolt.org/z/KG9z6cq68)):
1027
1028 ```c++
1029 #include <variant>
1030 #include <fmt/std.h>
1031
1032 int main() {
1033 auto v = std::variant<int, std::string>(42);
1034 fmt::print("{}\n", v);
1035 }
1036 ```
1037
1038 prints:
1039
1040 variant(42)
1041
1042 Thanks @jehelset.
1043
1044 - Added experimental `std::filesystem::path` formatting support
1045 (https://github.com/fmtlib/fmt/issues/2865,
1046 https://github.com/fmtlib/fmt/pull/2902,
1047 https://github.com/fmtlib/fmt/issues/2917,
1048 https://github.com/fmtlib/fmt/pull/2918). For example
1049 ([godbolt](https://godbolt.org/z/o44dMexEb)):
1050
1051 ```c++
1052 #include <filesystem>
1053 #include <fmt/std.h>
1054
1055 int main() {
1056 fmt::print("There is no place like {}.", std::filesystem::path("/home"));
1057 }
1058 ```
1059
1060 prints:
1061
1062 There is no place like "/home".
1063
1064 Thanks @phprus.
1065
1066 - Added a `std::thread::id` formatter to `fmt/std.h`. For example
1067 ([godbolt](https://godbolt.org/z/j1azbYf3E)):
1068
1069 ```c++
1070 #include <thread>
1071 #include <fmt/std.h>
1072
1073 int main() {
1074 fmt::print("Current thread id: {}\n", std::this_thread::get_id());
1075 }
1076 ```
1077
1078 - Added `fmt::styled` that applies a text style to an individual
1079 argument (https://github.com/fmtlib/fmt/pull/2793). For
1080 example ([godbolt](https://godbolt.org/z/vWGW7v5M6)):
1081
1082 ```c++
1083 #include <fmt/chrono.h>
1084 #include <fmt/color.h>
1085
1086 int main() {
1087 auto now = std::chrono::system_clock::now();
1088 fmt::print(
1089 "[{}] {}: {}\n",
1090 fmt::styled(now, fmt::emphasis::bold),
1091 fmt::styled("error", fg(fmt::color::red)),
1092 "something went wrong");
1093 }
1094 ```
1095
1096 prints
1097
1098 ![](https://user-images.githubusercontent.com/576385/175071215-12809244-dab0-4005-96d8-7cd911c964d5.png)
1099
1100 Thanks @rbrugo.
1101
1102 - Made `fmt::print` overload for text styles correctly handle UTF-8
1103 (https://github.com/fmtlib/fmt/issues/2681,
1104 https://github.com/fmtlib/fmt/pull/2701). Thanks @AlexGuteniev.
1105
1106 - Fixed Unicode handling when writing to an ostream.
1107
1108 - Added support for nested specifiers to range formatting
1109 (https://github.com/fmtlib/fmt/pull/2673). For example
1110 ([godbolt](https://godbolt.org/z/xd3Gj38cf)):
1111
1112 ```c++
1113 #include <vector>
1114 #include <fmt/ranges.h>
1115
1116 int main() {
1117 fmt::print("{::#x}\n", std::vector{10, 20, 30});
1118 }
1119 ```
1120
1121 prints `[0xa, 0x14, 0x1e]`.
1122
1123 Thanks @BRevzin.
1124
1125 - Implemented escaping of wide strings in ranges
1126 (https://github.com/fmtlib/fmt/pull/2904). Thanks @phprus.
1127
1128 - Added support for ranges with `begin` / `end` found via the
1129 argument-dependent lookup
1130 (https://github.com/fmtlib/fmt/pull/2807). Thanks @rbrugo.
1131
1132 - Fixed formatting of certain kinds of ranges of ranges
1133 (https://github.com/fmtlib/fmt/pull/2787). Thanks @BRevzin.
1134
1135 - Fixed handling of maps with element types other than `std::pair`
1136 (https://github.com/fmtlib/fmt/pull/2944). Thanks @BrukerJWD.
1137
1138 - Made tuple formatter enabled only if elements are formattable
1139 (https://github.com/fmtlib/fmt/issues/2939,
1140 https://github.com/fmtlib/fmt/pull/2940). Thanks @jehelset.
1141
1142 - Made `fmt::join` compatible with format string compilation
1143 (https://github.com/fmtlib/fmt/issues/2719,
1144 https://github.com/fmtlib/fmt/pull/2720). Thanks @phprus.
1145
1146 - Made compile-time checks work with named arguments of custom types
1147 and `std::ostream` `print` overloads
1148 (https://github.com/fmtlib/fmt/issues/2816,
1149 https://github.com/fmtlib/fmt/issues/2817,
1150 https://github.com/fmtlib/fmt/pull/2819). Thanks @timsong-cpp.
1151
1152 - Removed `make_args_checked` because it is no longer needed for
1153 compile-time checks
1154 (https://github.com/fmtlib/fmt/pull/2760). Thanks @phprus.
1155
1156 - Removed the following deprecated APIs: `_format`, `arg_join`, the
1157 `format_to` overload that takes a memory buffer, `[v]fprintf` that
1158 takes an `ostream`.
1159
1160 - Removed the deprecated implicit conversion of `[const] signed char*`
1161 and `[const] unsigned char*` to C strings.
1162
1163 - Removed the deprecated `fmt/locale.h`.
1164
1165 - Replaced the deprecated `fileno()` with `descriptor()` in
1166 `buffered_file`.
1167
1168 - Moved `to_string_view` to the `detail` namespace since it\'s an
1169 implementation detail.
1170
1171 - Made access mode of a created file consistent with `fopen` by
1172 setting `S_IWGRP` and `S_IWOTH`
1173 (https://github.com/fmtlib/fmt/pull/2733). Thanks @arogge.
1174
1175 - Removed a redundant buffer resize when formatting to `std::ostream`
1176 (https://github.com/fmtlib/fmt/issues/2842,
1177 https://github.com/fmtlib/fmt/pull/2843). Thanks @jcelerier.
1178
1179 - Made precision computation for strings consistent with width
1180 (https://github.com/fmtlib/fmt/issues/2888).
1181
1182 - Fixed handling of locale separators in floating point formatting
1183 (https://github.com/fmtlib/fmt/issues/2830).
1184
1185 - Made sign specifiers work with `__int128_t`
1186 (https://github.com/fmtlib/fmt/issues/2773).
1187
1188 - Improved support for systems such as CHERI with extra data stored in
1189 pointers (https://github.com/fmtlib/fmt/pull/2932).
1190 Thanks @davidchisnall.
1191
1192 - Improved documentation
1193 (https://github.com/fmtlib/fmt/pull/2706,
1194 https://github.com/fmtlib/fmt/pull/2712,
1195 https://github.com/fmtlib/fmt/pull/2789,
1196 https://github.com/fmtlib/fmt/pull/2803,
1197 https://github.com/fmtlib/fmt/pull/2805,
1198 https://github.com/fmtlib/fmt/pull/2815,
1199 https://github.com/fmtlib/fmt/pull/2924).
1200 Thanks @BRevzin, @Pokechu22, @setoye, @rtobar, @rbrugo, @anoonD and
1201 @leha-bot.
1202
1203 - Improved build configuration
1204 (https://github.com/fmtlib/fmt/pull/2766,
1205 https://github.com/fmtlib/fmt/pull/2772,
1206 https://github.com/fmtlib/fmt/pull/2836,
1207 https://github.com/fmtlib/fmt/pull/2852,
1208 https://github.com/fmtlib/fmt/pull/2907,
1209 https://github.com/fmtlib/fmt/pull/2913,
1210 https://github.com/fmtlib/fmt/pull/2914).
1211 Thanks @kambala-decapitator, @mattiasljungstrom, @kieselnb, @nathannaveen
1212 and @Vertexwahn.
1213
1214 - Fixed various warnings and compilation issues
1215 (https://github.com/fmtlib/fmt/issues/2408,
1216 https://github.com/fmtlib/fmt/issues/2507,
1217 https://github.com/fmtlib/fmt/issues/2697,
1218 https://github.com/fmtlib/fmt/issues/2715,
1219 https://github.com/fmtlib/fmt/issues/2717,
1220 https://github.com/fmtlib/fmt/pull/2722,
1221 https://github.com/fmtlib/fmt/pull/2724,
1222 https://github.com/fmtlib/fmt/pull/2725,
1223 https://github.com/fmtlib/fmt/issues/2726,
1224 https://github.com/fmtlib/fmt/pull/2728,
1225 https://github.com/fmtlib/fmt/pull/2732,
1226 https://github.com/fmtlib/fmt/issues/2738,
1227 https://github.com/fmtlib/fmt/pull/2742,
1228 https://github.com/fmtlib/fmt/issues/2744,
1229 https://github.com/fmtlib/fmt/issues/2745,
1230 https://github.com/fmtlib/fmt/issues/2746,
1231 https://github.com/fmtlib/fmt/issues/2754,
1232 https://github.com/fmtlib/fmt/pull/2755,
1233 https://github.com/fmtlib/fmt/issues/2757,
1234 https://github.com/fmtlib/fmt/pull/2758,
1235 https://github.com/fmtlib/fmt/issues/2761,
1236 https://github.com/fmtlib/fmt/pull/2762,
1237 https://github.com/fmtlib/fmt/issues/2763,
1238 https://github.com/fmtlib/fmt/pull/2765,
1239 https://github.com/fmtlib/fmt/issues/2769,
1240 https://github.com/fmtlib/fmt/pull/2770,
1241 https://github.com/fmtlib/fmt/issues/2771,
1242 https://github.com/fmtlib/fmt/issues/2777,
1243 https://github.com/fmtlib/fmt/pull/2779,
1244 https://github.com/fmtlib/fmt/pull/2782,
1245 https://github.com/fmtlib/fmt/pull/2783,
1246 https://github.com/fmtlib/fmt/issues/2794,
1247 https://github.com/fmtlib/fmt/issues/2796,
1248 https://github.com/fmtlib/fmt/pull/2797,
1249 https://github.com/fmtlib/fmt/pull/2801,
1250 https://github.com/fmtlib/fmt/pull/2802,
1251 https://github.com/fmtlib/fmt/issues/2808,
1252 https://github.com/fmtlib/fmt/issues/2818,
1253 https://github.com/fmtlib/fmt/pull/2819,
1254 https://github.com/fmtlib/fmt/issues/2829,
1255 https://github.com/fmtlib/fmt/issues/2835,
1256 https://github.com/fmtlib/fmt/issues/2848,
1257 https://github.com/fmtlib/fmt/issues/2860,
1258 https://github.com/fmtlib/fmt/pull/2861,
1259 https://github.com/fmtlib/fmt/pull/2882,
1260 https://github.com/fmtlib/fmt/issues/2886,
1261 https://github.com/fmtlib/fmt/issues/2891,
1262 https://github.com/fmtlib/fmt/pull/2892,
1263 https://github.com/fmtlib/fmt/issues/2895,
1264 https://github.com/fmtlib/fmt/issues/2896,
1265 https://github.com/fmtlib/fmt/pull/2903,
1266 https://github.com/fmtlib/fmt/issues/2906,
1267 https://github.com/fmtlib/fmt/issues/2908,
1268 https://github.com/fmtlib/fmt/pull/2909,
1269 https://github.com/fmtlib/fmt/issues/2920,
1270 https://github.com/fmtlib/fmt/pull/2922,
1271 https://github.com/fmtlib/fmt/pull/2927,
1272 https://github.com/fmtlib/fmt/pull/2929,
1273 https://github.com/fmtlib/fmt/issues/2936,
1274 https://github.com/fmtlib/fmt/pull/2937,
1275 https://github.com/fmtlib/fmt/pull/2938,
1276 https://github.com/fmtlib/fmt/pull/2951,
1277 https://github.com/fmtlib/fmt/issues/2954,
1278 https://github.com/fmtlib/fmt/pull/2957,
1279 https://github.com/fmtlib/fmt/issues/2958,
1280 https://github.com/fmtlib/fmt/pull/2960).
1281 Thanks @matrackif @Tobi823, @ivan-volnov, @VasiliPupkin256,
1282 @federico-busato, @barcharcraz, @jk-jeon, @HazardyKnusperkeks, @dalboris,
1283 @seanm, @gsjaardema, @timsong-cpp, @seanm, @frithrah, @chronoxor, @Agga,
1284 @madmaxoft, @JurajX, @phprus and @Dani-Hub.
1285
1286 # 8.1.1 - 2022-01-06
1287
1288 - Restored ABI compatibility with version 8.0.x
1289 (https://github.com/fmtlib/fmt/issues/2695,
1290 https://github.com/fmtlib/fmt/pull/2696). Thanks @saraedum.
1291 - Fixed chrono formatting on big endian systems
1292 (https://github.com/fmtlib/fmt/issues/2698,
1293 https://github.com/fmtlib/fmt/pull/2699).
1294 Thanks @phprus and @xvitaly.
1295 - Fixed a linkage error with mingw
1296 (https://github.com/fmtlib/fmt/issues/2691,
1297 https://github.com/fmtlib/fmt/pull/2692). Thanks @rbberger.
1298
1299 # 8.1.0 - 2022-01-02
1300
1301 - Optimized chrono formatting
1302 (https://github.com/fmtlib/fmt/pull/2500,
1303 https://github.com/fmtlib/fmt/pull/2537,
1304 https://github.com/fmtlib/fmt/issues/2541,
1305 https://github.com/fmtlib/fmt/pull/2544,
1306 https://github.com/fmtlib/fmt/pull/2550,
1307 https://github.com/fmtlib/fmt/pull/2551,
1308 https://github.com/fmtlib/fmt/pull/2576,
1309 https://github.com/fmtlib/fmt/issues/2577,
1310 https://github.com/fmtlib/fmt/pull/2586,
1311 https://github.com/fmtlib/fmt/pull/2591,
1312 https://github.com/fmtlib/fmt/pull/2594,
1313 https://github.com/fmtlib/fmt/pull/2602,
1314 https://github.com/fmtlib/fmt/pull/2617,
1315 https://github.com/fmtlib/fmt/issues/2628,
1316 https://github.com/fmtlib/fmt/pull/2633,
1317 https://github.com/fmtlib/fmt/issues/2670,
1318 https://github.com/fmtlib/fmt/pull/2671).
1319
1320 Processing of some specifiers such as `%z` and `%Y` is now up to
1321 10-20 times faster, for example on GCC 11 with libstdc++:
1322
1323 ----------------------------------------------------------------------------
1324 Benchmark Before After
1325 ----------------------------------------------------------------------------
1326 FMTFormatter_z 261 ns 26.3 ns
1327 FMTFormatterCompile_z 246 ns 11.6 ns
1328 FMTFormatter_Y 263 ns 26.1 ns
1329 FMTFormatterCompile_Y 244 ns 10.5 ns
1330 ----------------------------------------------------------------------------
1331
1332 Thanks @phprus and @toughengineer.
1333
1334 - Implemented subsecond formatting for chrono durations
1335 (https://github.com/fmtlib/fmt/pull/2623). For example
1336 ([godbolt](https://godbolt.org/z/es7vWTETe)):
1337
1338 ```c++
1339 #include <fmt/chrono.h>
1340
1341 int main() {
1342 fmt::print("{:%S}", std::chrono::milliseconds(1234));
1343 }
1344 ```
1345
1346 prints \"01.234\".
1347
1348 Thanks @matrackif.
1349
1350 - Fixed handling of precision 0 when formatting chrono durations
1351 (https://github.com/fmtlib/fmt/issues/2587,
1352 https://github.com/fmtlib/fmt/pull/2588). Thanks @lukester1975.
1353
1354 - Fixed an overflow on invalid inputs in the `tm` formatter
1355 (https://github.com/fmtlib/fmt/pull/2564). Thanks @phprus.
1356
1357 - Added `fmt::group_digits` that formats integers with a non-localized
1358 digit separator (comma) for groups of three digits. For example
1359 ([godbolt](https://godbolt.org/z/TxGxG9Poq)):
1360
1361 ```c++
1362 #include <fmt/format.h>
1363
1364 int main() {
1365 fmt::print("{} dollars", fmt::group_digits(1000000));
1366 }
1367 ```
1368
1369 prints \"1,000,000 dollars\".
1370
1371 - Added support for faint, conceal, reverse and blink text styles
1372 (https://github.com/fmtlib/fmt/pull/2394):
1373
1374 <https://user-images.githubusercontent.com/576385/147710227-c68f5317-f8fa-42c3-9123-7c4ba3c398cb.mp4>
1375
1376 Thanks @benit8 and @data-man.
1377
1378 - Added experimental support for compile-time floating point
1379 formatting (https://github.com/fmtlib/fmt/pull/2426,
1380 https://github.com/fmtlib/fmt/pull/2470). It is currently
1381 limited to the header-only mode. Thanks @alexezeder.
1382
1383 - Added UDL-based named argument support to compile-time format string
1384 checks (https://github.com/fmtlib/fmt/issues/2640,
1385 https://github.com/fmtlib/fmt/pull/2649). For example
1386 ([godbolt](https://godbolt.org/z/ohGbbvonv)):
1387
1388 ```c++
1389 #include <fmt/format.h>
1390
1391 int main() {
1392 using namespace fmt::literals;
1393 fmt::print("{answer:s}", "answer"_a=42);
1394 }
1395 ```
1396
1397 gives a compile-time error on compilers with C++20 `consteval` and
1398 non-type template parameter support (gcc 10+) because `s` is not a
1399 valid format specifier for an integer.
1400
1401 Thanks @alexezeder.
1402
1403 - Implemented escaping of string range elements. For example
1404 ([godbolt](https://godbolt.org/z/rKvM1vKf3)):
1405
1406 ```c++
1407 #include <fmt/ranges.h>
1408 #include <vector>
1409
1410 int main() {
1411 fmt::print("{}", std::vector<std::string>{"\naan"});
1412 }
1413 ```
1414
1415 is now printed as:
1416
1417 ["\naan"]
1418
1419 instead of:
1420
1421 ["
1422 aan"]
1423
1424 - Added an experimental `?` specifier for escaping strings.
1425 (https://github.com/fmtlib/fmt/pull/2674). Thanks @BRevzin.
1426
1427 - Switched to JSON-like representation of maps and sets for
1428 consistency with Python\'s `str.format`. For example
1429 ([godbolt](https://godbolt.org/z/seKjoY9W5)):
1430
1431 ```c++
1432 #include <fmt/ranges.h>
1433 #include <map>
1434
1435 int main() {
1436 fmt::print("{}", std::map<std::string, int>{{"answer", 42}});
1437 }
1438 ```
1439
1440 is now printed as:
1441
1442 {"answer": 42}
1443
1444 - Extended `fmt::join` to support C++20-only ranges
1445 (https://github.com/fmtlib/fmt/pull/2549). Thanks @BRevzin.
1446
1447 - Optimized handling of non-const-iterable ranges and implemented
1448 initial support for non-const-formattable types.
1449
1450 - Disabled implicit conversions of scoped enums to integers that was
1451 accidentally introduced in earlier versions
1452 (https://github.com/fmtlib/fmt/pull/1841).
1453
1454 - Deprecated implicit conversion of `[const] signed char*` and
1455 `[const] unsigned char*` to C strings.
1456
1457 - Deprecated `_format`, a legacy UDL-based format API
1458 (https://github.com/fmtlib/fmt/pull/2646). Thanks @alexezeder.
1459
1460 - Marked `format`, `formatted_size` and `to_string` as `[[nodiscard]]`
1461 (https://github.com/fmtlib/fmt/pull/2612). @0x8000-0000.
1462
1463 - Added missing diagnostic when trying to format function and member
1464 pointers as well as objects convertible to pointers which is
1465 explicitly disallowed
1466 (https://github.com/fmtlib/fmt/issues/2598,
1467 https://github.com/fmtlib/fmt/pull/2609,
1468 https://github.com/fmtlib/fmt/pull/2610). Thanks @AlexGuteniev.
1469
1470 - Optimized writing to a contiguous buffer with `format_to_n`
1471 (https://github.com/fmtlib/fmt/pull/2489). Thanks @Roman-Koshelev.
1472
1473 - Optimized writing to non-`char` buffers
1474 (https://github.com/fmtlib/fmt/pull/2477). Thanks @Roman-Koshelev.
1475
1476 - Decimal point is now localized when using the `L` specifier.
1477
1478 - Improved floating point formatter implementation
1479 (https://github.com/fmtlib/fmt/pull/2498,
1480 https://github.com/fmtlib/fmt/pull/2499). Thanks @Roman-Koshelev.
1481
1482 - Fixed handling of very large precision in fixed format
1483 (https://github.com/fmtlib/fmt/pull/2616).
1484
1485 - Made a table of cached powers used in FP formatting static
1486 (https://github.com/fmtlib/fmt/pull/2509). Thanks @jk-jeon.
1487
1488 - Resolved a lookup ambiguity with C++20 format-related functions due
1489 to ADL (https://github.com/fmtlib/fmt/issues/2639,
1490 https://github.com/fmtlib/fmt/pull/2641). Thanks @mkurdej.
1491
1492 - Removed unnecessary inline namespace qualification
1493 (https://github.com/fmtlib/fmt/issues/2642,
1494 https://github.com/fmtlib/fmt/pull/2643). Thanks @mkurdej.
1495
1496 - Implemented argument forwarding in `format_to_n`
1497 (https://github.com/fmtlib/fmt/issues/2462,
1498 https://github.com/fmtlib/fmt/pull/2463). Thanks @owent.
1499
1500 - Fixed handling of implicit conversions in `fmt::to_string` and
1501 format string compilation
1502 (https://github.com/fmtlib/fmt/issues/2565).
1503
1504 - Changed the default access mode of files created by
1505 `fmt::output_file` to `-rw-r--r--` for consistency with `fopen`
1506 (https://github.com/fmtlib/fmt/issues/2530).
1507
1508 - Make `fmt::ostream::flush` public
1509 (https://github.com/fmtlib/fmt/issues/2435).
1510
1511 - Improved C++14/17 attribute detection
1512 (https://github.com/fmtlib/fmt/pull/2615). Thanks @AlexGuteniev.
1513
1514 - Improved `consteval` detection for MSVC
1515 (https://github.com/fmtlib/fmt/pull/2559). Thanks @DanielaE.
1516
1517 - Improved documentation
1518 (https://github.com/fmtlib/fmt/issues/2406,
1519 https://github.com/fmtlib/fmt/pull/2446,
1520 https://github.com/fmtlib/fmt/issues/2493,
1521 https://github.com/fmtlib/fmt/issues/2513,
1522 https://github.com/fmtlib/fmt/pull/2515,
1523 https://github.com/fmtlib/fmt/issues/2522,
1524 https://github.com/fmtlib/fmt/pull/2562,
1525 https://github.com/fmtlib/fmt/pull/2575,
1526 https://github.com/fmtlib/fmt/pull/2606,
1527 https://github.com/fmtlib/fmt/pull/2620,
1528 https://github.com/fmtlib/fmt/issues/2676).
1529 Thanks @sobolevn, @UnePierre, @zhsj, @phprus, @ericcurtin and @Lounarok.
1530
1531 - Improved fuzzers and added a fuzzer for chrono timepoint formatting
1532 (https://github.com/fmtlib/fmt/pull/2461,
1533 https://github.com/fmtlib/fmt/pull/2469). @pauldreik,
1534
1535 - Added the `FMT_SYSTEM_HEADERS` CMake option setting which marks
1536 {fmt}\'s headers as system. It can be used to suppress warnings
1537 (https://github.com/fmtlib/fmt/issues/2644,
1538 https://github.com/fmtlib/fmt/pull/2651). Thanks @alexezeder.
1539
1540 - Added the Bazel build system support
1541 (https://github.com/fmtlib/fmt/pull/2505,
1542 https://github.com/fmtlib/fmt/pull/2516). Thanks @Vertexwahn.
1543
1544 - Improved build configuration and tests
1545 (https://github.com/fmtlib/fmt/issues/2437,
1546 https://github.com/fmtlib/fmt/pull/2558,
1547 https://github.com/fmtlib/fmt/pull/2648,
1548 https://github.com/fmtlib/fmt/pull/2650,
1549 https://github.com/fmtlib/fmt/pull/2663,
1550 https://github.com/fmtlib/fmt/pull/2677).
1551 Thanks @DanielaE, @alexezeder and @phprus.
1552
1553 - Fixed various warnings and compilation issues
1554 (https://github.com/fmtlib/fmt/pull/2353,
1555 https://github.com/fmtlib/fmt/pull/2356,
1556 https://github.com/fmtlib/fmt/pull/2399,
1557 https://github.com/fmtlib/fmt/issues/2408,
1558 https://github.com/fmtlib/fmt/pull/2414,
1559 https://github.com/fmtlib/fmt/pull/2427,
1560 https://github.com/fmtlib/fmt/pull/2432,
1561 https://github.com/fmtlib/fmt/pull/2442,
1562 https://github.com/fmtlib/fmt/pull/2434,
1563 https://github.com/fmtlib/fmt/issues/2439,
1564 https://github.com/fmtlib/fmt/pull/2447,
1565 https://github.com/fmtlib/fmt/pull/2450,
1566 https://github.com/fmtlib/fmt/issues/2455,
1567 https://github.com/fmtlib/fmt/issues/2465,
1568 https://github.com/fmtlib/fmt/issues/2472,
1569 https://github.com/fmtlib/fmt/issues/2474,
1570 https://github.com/fmtlib/fmt/pull/2476,
1571 https://github.com/fmtlib/fmt/issues/2478,
1572 https://github.com/fmtlib/fmt/issues/2479,
1573 https://github.com/fmtlib/fmt/issues/2481,
1574 https://github.com/fmtlib/fmt/pull/2482,
1575 https://github.com/fmtlib/fmt/pull/2483,
1576 https://github.com/fmtlib/fmt/issues/2490,
1577 https://github.com/fmtlib/fmt/pull/2491,
1578 https://github.com/fmtlib/fmt/pull/2510,
1579 https://github.com/fmtlib/fmt/pull/2518,
1580 https://github.com/fmtlib/fmt/issues/2528,
1581 https://github.com/fmtlib/fmt/pull/2529,
1582 https://github.com/fmtlib/fmt/pull/2539,
1583 https://github.com/fmtlib/fmt/issues/2540,
1584 https://github.com/fmtlib/fmt/pull/2545,
1585 https://github.com/fmtlib/fmt/pull/2555,
1586 https://github.com/fmtlib/fmt/issues/2557,
1587 https://github.com/fmtlib/fmt/issues/2570,
1588 https://github.com/fmtlib/fmt/pull/2573,
1589 https://github.com/fmtlib/fmt/pull/2582,
1590 https://github.com/fmtlib/fmt/issues/2605,
1591 https://github.com/fmtlib/fmt/pull/2611,
1592 https://github.com/fmtlib/fmt/pull/2647,
1593 https://github.com/fmtlib/fmt/issues/2627,
1594 https://github.com/fmtlib/fmt/pull/2630,
1595 https://github.com/fmtlib/fmt/issues/2635,
1596 https://github.com/fmtlib/fmt/issues/2638,
1597 https://github.com/fmtlib/fmt/issues/2653,
1598 https://github.com/fmtlib/fmt/issues/2654,
1599 https://github.com/fmtlib/fmt/issues/2661,
1600 https://github.com/fmtlib/fmt/pull/2664,
1601 https://github.com/fmtlib/fmt/pull/2684).
1602 Thanks @DanielaE, @mwinterb, @cdacamar, @TrebledJ, @bodomartin, @cquammen,
1603 @white238, @mmarkeloff, @palacaze, @jcelerier, @mborn-adi, @BrukerJWD,
1604 @spyridon97, @phprus, @oliverlee, @joshessman-llnl, @akohlmey, @timkalu,
1605 @olupton, @Acretock, @alexezeder, @andrewcorrigan, @lucpelletier and
1606 @HazardyKnusperkeks.
1607
1608 # 8.0.1 - 2021-07-02
1609
1610 - Fixed the version number in the inline namespace
1611 (https://github.com/fmtlib/fmt/issues/2374).
1612 - Added a missing presentation type check for `std::string`
1613 (https://github.com/fmtlib/fmt/issues/2402).
1614 - Fixed a linkage error when mixing code built with clang and gcc
1615 (https://github.com/fmtlib/fmt/issues/2377).
1616 - Fixed documentation issues
1617 (https://github.com/fmtlib/fmt/pull/2396,
1618 https://github.com/fmtlib/fmt/issues/2403,
1619 https://github.com/fmtlib/fmt/issues/2406). Thanks @mkurdej.
1620 - Removed dead code in FP formatter (
1621 https://github.com/fmtlib/fmt/pull/2398). Thanks @javierhonduco.
1622 - Fixed various warnings and compilation issues
1623 (https://github.com/fmtlib/fmt/issues/2351,
1624 https://github.com/fmtlib/fmt/issues/2359,
1625 https://github.com/fmtlib/fmt/pull/2365,
1626 https://github.com/fmtlib/fmt/issues/2368,
1627 https://github.com/fmtlib/fmt/pull/2370,
1628 https://github.com/fmtlib/fmt/pull/2376,
1629 https://github.com/fmtlib/fmt/pull/2381,
1630 https://github.com/fmtlib/fmt/pull/2382,
1631 https://github.com/fmtlib/fmt/issues/2386,
1632 https://github.com/fmtlib/fmt/pull/2389,
1633 https://github.com/fmtlib/fmt/pull/2395,
1634 https://github.com/fmtlib/fmt/pull/2397,
1635 https://github.com/fmtlib/fmt/issues/2400,
1636 https://github.com/fmtlib/fmt/issues/2401,
1637 https://github.com/fmtlib/fmt/pull/2407).
1638 Thanks @zx2c4, @AidanSun05, @mattiasljungstrom, @joemmett, @erengy,
1639 @patlkli, @gsjaardema and @phprus.
1640
1641 # 8.0.0 - 2021-06-21
1642
1643 - Enabled compile-time format string checks by default. For example
1644 ([godbolt](https://godbolt.org/z/sMxcohGjz)):
1645
1646 ```c++
1647 #include <fmt/core.h>
1648
1649 int main() {
1650 fmt::print("{:d}", "I am not a number");
1651 }
1652 ```
1653
1654 gives a compile-time error on compilers with C++20 `consteval`
1655 support (gcc 10+, clang 11+) because `d` is not a valid format
1656 specifier for a string.
1657
1658 To pass a runtime string wrap it in `fmt::runtime`:
1659
1660 ```c++
1661 fmt::print(fmt::runtime("{:d}"), "I am not a number");
1662 ```
1663
1664 - Added compile-time formatting
1665 (https://github.com/fmtlib/fmt/pull/2019,
1666 https://github.com/fmtlib/fmt/pull/2044,
1667 https://github.com/fmtlib/fmt/pull/2056,
1668 https://github.com/fmtlib/fmt/pull/2072,
1669 https://github.com/fmtlib/fmt/pull/2075,
1670 https://github.com/fmtlib/fmt/issues/2078,
1671 https://github.com/fmtlib/fmt/pull/2129,
1672 https://github.com/fmtlib/fmt/pull/2326). For example
1673 ([godbolt](https://godbolt.org/z/Mxx9d89jM)):
1674
1675 ```c++
1676 #include <fmt/compile.h>
1677
1678 consteval auto compile_time_itoa(int value) -> std::array<char, 10> {
1679 auto result = std::array<char, 10>();
1680 fmt::format_to(result.data(), FMT_COMPILE("{}"), value);
1681 return result;
1682 }
1683
1684 constexpr auto answer = compile_time_itoa(42);
1685 ```
1686
1687 Most of the formatting functionality is available at compile time
1688 with a notable exception of floating-point numbers and pointers.
1689 Thanks @alexezeder.
1690
1691 - Optimized handling of format specifiers during format string
1692 compilation. For example, hexadecimal formatting (`"{:x}"`) is now
1693 3-7x faster than before when using `format_to` with format string
1694 compilation and a stack-allocated buffer
1695 (https://github.com/fmtlib/fmt/issues/1944).
1696
1697 Before (7.1.3):
1698
1699 ----------------------------------------------------------------------------
1700 Benchmark Time CPU Iterations
1701 ----------------------------------------------------------------------------
1702 FMTCompileOld/0 15.5 ns 15.5 ns 43302898
1703 FMTCompileOld/42 16.6 ns 16.6 ns 43278267
1704 FMTCompileOld/273123 18.7 ns 18.6 ns 37035861
1705 FMTCompileOld/9223372036854775807 19.4 ns 19.4 ns 35243000
1706 ----------------------------------------------------------------------------
1707
1708 After (8.x):
1709
1710 ----------------------------------------------------------------------------
1711 Benchmark Time CPU Iterations
1712 ----------------------------------------------------------------------------
1713 FMTCompileNew/0 1.99 ns 1.99 ns 360523686
1714 FMTCompileNew/42 2.33 ns 2.33 ns 279865664
1715 FMTCompileNew/273123 3.72 ns 3.71 ns 190230315
1716 FMTCompileNew/9223372036854775807 5.28 ns 5.26 ns 130711631
1717 ----------------------------------------------------------------------------
1718
1719 It is even faster than `std::to_chars` from libc++ compiled with
1720 clang on macOS:
1721
1722 ----------------------------------------------------------------------------
1723 Benchmark Time CPU Iterations
1724 ----------------------------------------------------------------------------
1725 ToChars/0 4.42 ns 4.41 ns 160196630
1726 ToChars/42 5.00 ns 4.98 ns 140735201
1727 ToChars/273123 7.26 ns 7.24 ns 95784130
1728 ToChars/9223372036854775807 8.77 ns 8.75 ns 75872534
1729 ----------------------------------------------------------------------------
1730
1731 In other cases, especially involving `std::string` construction, the
1732 speed up is usually lower because handling format specifiers takes a
1733 smaller fraction of the total time.
1734
1735 - Added the `_cf` user-defined literal to represent a compiled format
1736 string. It can be used instead of the `FMT_COMPILE` macro
1737 (https://github.com/fmtlib/fmt/pull/2043,
1738 https://github.com/fmtlib/fmt/pull/2242):
1739
1740 ```c++
1741 #include <fmt/compile.h>
1742
1743 using namespace fmt::literals;
1744 auto s = fmt::format(FMT_COMPILE("{}"), 42); // 🙁 not modern
1745 auto s = fmt::format("{}"_cf, 42); // 🙂 modern as hell
1746 ```
1747
1748 It requires compiler support for class types in non-type template
1749 parameters (a C++20 feature) which is available in GCC 9.3+.
1750 Thanks @alexezeder.
1751
1752 - Format string compilation now requires `format` functions of
1753 `formatter` specializations for user-defined types to be `const`:
1754
1755 ```c++
1756 template <> struct fmt::formatter<my_type>: formatter<string_view> {
1757 template <typename FormatContext>
1758 auto format(my_type obj, FormatContext& ctx) const { // Note const here.
1759 // ...
1760 }
1761 };
1762 ```
1763
1764 - Added UDL-based named argument support to format string compilation
1765 (https://github.com/fmtlib/fmt/pull/2243,
1766 https://github.com/fmtlib/fmt/pull/2281). For example:
1767
1768 ```c++
1769 #include <fmt/compile.h>
1770
1771 using namespace fmt::literals;
1772 auto s = fmt::format(FMT_COMPILE("{answer}"), "answer"_a = 42);
1773 ```
1774
1775 Here the argument named \"answer\" is resolved at compile time with
1776 no runtime overhead. Thanks @alexezeder.
1777
1778 - Added format string compilation support to `fmt::print`
1779 (https://github.com/fmtlib/fmt/issues/2280,
1780 https://github.com/fmtlib/fmt/pull/2304). Thanks @alexezeder.
1781
1782 - Added initial support for compiling {fmt} as a C++20 module
1783 (https://github.com/fmtlib/fmt/pull/2235,
1784 https://github.com/fmtlib/fmt/pull/2240,
1785 https://github.com/fmtlib/fmt/pull/2260,
1786 https://github.com/fmtlib/fmt/pull/2282,
1787 https://github.com/fmtlib/fmt/pull/2283,
1788 https://github.com/fmtlib/fmt/pull/2288,
1789 https://github.com/fmtlib/fmt/pull/2298,
1790 https://github.com/fmtlib/fmt/pull/2306,
1791 https://github.com/fmtlib/fmt/pull/2307,
1792 https://github.com/fmtlib/fmt/pull/2309,
1793 https://github.com/fmtlib/fmt/pull/2318,
1794 https://github.com/fmtlib/fmt/pull/2324,
1795 https://github.com/fmtlib/fmt/pull/2332,
1796 https://github.com/fmtlib/fmt/pull/2340). Thanks @DanielaE.
1797
1798 - Made symbols private by default reducing shared library size
1799 (https://github.com/fmtlib/fmt/pull/2301). For example
1800 there was a \~15% reported reduction on one platform. Thanks @sergiud.
1801
1802 - Optimized includes making the result of preprocessing `fmt/format.h`
1803 \~20% smaller with libstdc++/C++20 and slightly improving build
1804 times (https://github.com/fmtlib/fmt/issues/1998).
1805
1806 - Added support of ranges with non-const `begin` / `end`
1807 (https://github.com/fmtlib/fmt/pull/1953). Thanks @kitegi.
1808
1809 - Added support of `std::byte` and other formattable types to
1810 `fmt::join` (https://github.com/fmtlib/fmt/issues/1981,
1811 https://github.com/fmtlib/fmt/issues/2040,
1812 https://github.com/fmtlib/fmt/pull/2050,
1813 https://github.com/fmtlib/fmt/issues/2262). For example:
1814
1815 ```c++
1816 #include <fmt/format.h>
1817 #include <cstddef>
1818 #include <vector>
1819
1820 int main() {
1821 auto bytes = std::vector{std::byte(4), std::byte(2)};
1822 fmt::print("{}", fmt::join(bytes, ""));
1823 }
1824 ```
1825
1826 prints \"42\".
1827
1828 Thanks @kamibo.
1829
1830 - Implemented the default format for `std::chrono::system_clock`
1831 (https://github.com/fmtlib/fmt/issues/2319,
1832 https://github.com/fmtlib/fmt/pull/2345). For example:
1833
1834 ```c++
1835 #include <fmt/chrono.h>
1836
1837 int main() {
1838 fmt::print("{}", std::chrono::system_clock::now());
1839 }
1840 ```
1841
1842 prints \"2021-06-18 15:22:00\" (the output depends on the current
1843 date and time). Thanks @sunmy2019.
1844
1845 - Made more chrono specifiers locale independent by default. Use the
1846 `'L'` specifier to get localized formatting. For example:
1847
1848 ```c++
1849 #include <fmt/chrono.h>
1850
1851 int main() {
1852 std::locale::global(std::locale("ru_RU.UTF-8"));
1853 auto monday = std::chrono::weekday(1);
1854 fmt::print("{}\n", monday); // prints "Mon"
1855 fmt::print("{:L}\n", monday); // prints "пн"
1856 }
1857 ```
1858
1859 - Improved locale handling in chrono formatting
1860 (https://github.com/fmtlib/fmt/issues/2337,
1861 https://github.com/fmtlib/fmt/pull/2349,
1862 https://github.com/fmtlib/fmt/pull/2350). Thanks @phprus.
1863
1864 - Deprecated `fmt/locale.h` moving the formatting functions that take
1865 a locale to `fmt/format.h` (`char`) and `fmt/xchar` (other
1866 overloads). This doesn\'t introduce a dependency on `<locale>` so
1867 there is virtually no compile time effect.
1868
1869 - Deprecated an undocumented `format_to` overload that takes
1870 `basic_memory_buffer`.
1871
1872 - Made parameter order in `vformat_to` consistent with `format_to`
1873 (https://github.com/fmtlib/fmt/issues/2327).
1874
1875 - Added support for time points with arbitrary durations
1876 (https://github.com/fmtlib/fmt/issues/2208). For example:
1877
1878 ```c++
1879 #include <fmt/chrono.h>
1880
1881 int main() {
1882 using tp = std::chrono::time_point<
1883 std::chrono::system_clock, std::chrono::seconds>;
1884 fmt::print("{:%S}", tp(std::chrono::seconds(42)));
1885 }
1886 ```
1887
1888 prints \"42\".
1889
1890 - Formatting floating-point numbers no longer produces trailing zeros
1891 by default for consistency with `std::format`. For example:
1892
1893 ```c++
1894 #include <fmt/core.h>
1895
1896 int main() {
1897 fmt::print("{0:.3}", 1.1);
1898 }
1899 ```
1900
1901 prints \"1.1\". Use the `'#'` specifier to keep trailing zeros.
1902
1903 - Dropped a limit on the number of elements in a range and replaced
1904 `{}` with `[]` as range delimiters for consistency with Python\'s
1905 `str.format`.
1906
1907 - The `'L'` specifier for locale-specific numeric formatting can now
1908 be combined with presentation specifiers as in `std::format`. For
1909 example:
1910
1911 ```c++
1912 #include <fmt/core.h>
1913 #include <locale>
1914
1915 int main() {
1916 std::locale::global(std::locale("fr_FR.UTF-8"));
1917 fmt::print("{0:.2Lf}", 0.42);
1918 }
1919 ```
1920
1921 prints \"0,42\". The deprecated `'n'` specifier has been removed.
1922
1923 - Made the `0` specifier ignored for infinity and NaN
1924 (https://github.com/fmtlib/fmt/issues/2305,
1925 https://github.com/fmtlib/fmt/pull/2310). Thanks @Liedtke.
1926
1927 - Made the hexfloat formatting use the right alignment by default
1928 (https://github.com/fmtlib/fmt/issues/2308,
1929 https://github.com/fmtlib/fmt/pull/2317). Thanks @Liedtke.
1930
1931 - Removed the deprecated numeric alignment (`'='`). Use the `'0'`
1932 specifier instead.
1933
1934 - Removed the deprecated `fmt/posix.h` header that has been replaced
1935 with `fmt/os.h`.
1936
1937 - Removed the deprecated `format_to_n_context`, `format_to_n_args` and
1938 `make_format_to_n_args`. They have been replaced with
1939 `format_context`, `` format_args` and ``make_format_args\`\`
1940 respectively.
1941
1942 - Moved `wchar_t`-specific functions and types to `fmt/xchar.h`. You
1943 can define `FMT_DEPRECATED_INCLUDE_XCHAR` to automatically include
1944 `fmt/xchar.h` from `fmt/format.h` but this will be disabled in the
1945 next major release.
1946
1947 - Fixed handling of the `'+'` specifier in localized formatting
1948 (https://github.com/fmtlib/fmt/issues/2133).
1949
1950 - Added support for the `'s'` format specifier that gives textual
1951 representation of `bool`
1952 (https://github.com/fmtlib/fmt/issues/2094,
1953 https://github.com/fmtlib/fmt/pull/2109). For example:
1954
1955 ```c++
1956 #include <fmt/core.h>
1957
1958 int main() {
1959 fmt::print("{:s}", true);
1960 }
1961 ```
1962
1963 prints \"true\". Thanks @powercoderlol.
1964
1965 - Made `fmt::ptr` work with function pointers
1966 (https://github.com/fmtlib/fmt/pull/2131). For example:
1967
1968 ```c++
1969 #include <fmt/format.h>
1970
1971 int main() {
1972 fmt::print("My main: {}\n", fmt::ptr(main));
1973 }
1974 ```
1975
1976 Thanks @mikecrowe.
1977
1978 - The undocumented support for specializing `formatter` for pointer
1979 types has been removed.
1980
1981 - Fixed `fmt::formatted_size` with format string compilation
1982 (https://github.com/fmtlib/fmt/pull/2141,
1983 https://github.com/fmtlib/fmt/pull/2161). Thanks @alexezeder.
1984
1985 - Fixed handling of empty format strings during format string
1986 compilation (https://github.com/fmtlib/fmt/issues/2042):
1987
1988 ```c++
1989 auto s = fmt::format(FMT_COMPILE(""));
1990 ```
1991
1992 Thanks @alexezeder.
1993
1994 - Fixed handling of enums in `fmt::to_string`
1995 (https://github.com/fmtlib/fmt/issues/2036).
1996
1997 - Improved width computation
1998 (https://github.com/fmtlib/fmt/issues/2033,
1999 https://github.com/fmtlib/fmt/issues/2091). For example:
2000
2001 ```c++
2002 #include <fmt/core.h>
2003
2004 int main() {
2005 fmt::print("{:-<10}{}\n", "你好", "世界");
2006 fmt::print("{:-<10}{}\n", "hello", "world");
2007 }
2008 ```
2009
2010 prints
2011
2012 ![](https://user-images.githubusercontent.com/576385/119840373-cea3ca80-beb9-11eb-91e0-54266c48e181.png)
2013
2014 on a modern terminal.
2015
2016 - The experimental fast output stream (`fmt::ostream`) is now
2017 truncated by default for consistency with `fopen`
2018 (https://github.com/fmtlib/fmt/issues/2018). For example:
2019
2020 ```c++
2021 #include <fmt/os.h>
2022
2023 int main() {
2024 fmt::ostream out1 = fmt::output_file("guide");
2025 out1.print("Zaphod");
2026 out1.close();
2027 fmt::ostream out2 = fmt::output_file("guide");
2028 out2.print("Ford");
2029 }
2030 ```
2031
2032 writes \"Ford\" to the file \"guide\". To preserve the old file
2033 content if any pass `fmt::file::WRONLY | fmt::file::CREATE` flags to
2034 `fmt::output_file`.
2035
2036 - Fixed moving of `fmt::ostream` that holds buffered data
2037 (https://github.com/fmtlib/fmt/issues/2197,
2038 https://github.com/fmtlib/fmt/pull/2198). Thanks @vtta.
2039
2040 - Replaced the `fmt::system_error` exception with a function of the
2041 same name that constructs `std::system_error`
2042 (https://github.com/fmtlib/fmt/issues/2266).
2043
2044 - Replaced the `fmt::windows_error` exception with a function of the
2045 same name that constructs `std::system_error` with the category
2046 returned by `fmt::system_category()`
2047 (https://github.com/fmtlib/fmt/issues/2274,
2048 https://github.com/fmtlib/fmt/pull/2275). The latter is
2049 similar to `std::sytem_category` but correctly handles UTF-8.
2050 Thanks @phprus.
2051
2052 - Replaced `fmt::error_code` with `std::error_code` and made it
2053 formattable (https://github.com/fmtlib/fmt/issues/2269,
2054 https://github.com/fmtlib/fmt/pull/2270,
2055 https://github.com/fmtlib/fmt/pull/2273). Thanks @phprus.
2056
2057 - Added speech synthesis support
2058 (https://github.com/fmtlib/fmt/pull/2206).
2059
2060 - Made `format_to` work with a memory buffer that has a custom
2061 allocator (https://github.com/fmtlib/fmt/pull/2300).
2062 Thanks @voxmea.
2063
2064 - Added `Allocator::max_size` support to `basic_memory_buffer`.
2065 (https://github.com/fmtlib/fmt/pull/1960). Thanks @phprus.
2066
2067 - Added wide string support to `fmt::join`
2068 (https://github.com/fmtlib/fmt/pull/2236). Thanks @crbrz.
2069
2070 - Made iterators passed to `formatter` specializations via a format
2071 context satisfy C++20 `std::output_iterator` requirements
2072 (https://github.com/fmtlib/fmt/issues/2156,
2073 https://github.com/fmtlib/fmt/pull/2158,
2074 https://github.com/fmtlib/fmt/issues/2195,
2075 https://github.com/fmtlib/fmt/pull/2204). Thanks @randomnetcat.
2076
2077 - Optimized the `printf` implementation
2078 (https://github.com/fmtlib/fmt/pull/1982,
2079 https://github.com/fmtlib/fmt/pull/1984,
2080 https://github.com/fmtlib/fmt/pull/2016,
2081 https://github.com/fmtlib/fmt/pull/2164).
2082 Thanks @rimathia and @moiwi.
2083
2084 - Improved detection of `constexpr` `char_traits`
2085 (https://github.com/fmtlib/fmt/pull/2246,
2086 https://github.com/fmtlib/fmt/pull/2257). Thanks @phprus.
2087
2088 - Fixed writing to `stdout` when it is redirected to `NUL` on Windows
2089 (https://github.com/fmtlib/fmt/issues/2080).
2090
2091 - Fixed exception propagation from iterators
2092 (https://github.com/fmtlib/fmt/issues/2097).
2093
2094 - Improved `strftime` error handling
2095 (https://github.com/fmtlib/fmt/issues/2238,
2096 https://github.com/fmtlib/fmt/pull/2244). Thanks @yumeyao.
2097
2098 - Stopped using deprecated GCC UDL template extension.
2099
2100 - Added `fmt/args.h` to the install target
2101 (https://github.com/fmtlib/fmt/issues/2096).
2102
2103 - Error messages are now passed to assert when exceptions are disabled
2104 (https://github.com/fmtlib/fmt/pull/2145). Thanks @NobodyXu.
2105
2106 - Added the `FMT_MASTER_PROJECT` CMake option to control build and
2107 install targets when {fmt} is included via `add_subdirectory`
2108 (https://github.com/fmtlib/fmt/issues/2098,
2109 https://github.com/fmtlib/fmt/pull/2100).
2110 Thanks @randomizedthinking.
2111
2112 - Improved build configuration
2113 (https://github.com/fmtlib/fmt/pull/2026,
2114 https://github.com/fmtlib/fmt/pull/2122).
2115 Thanks @luncliff and @ibaned.
2116
2117 - Fixed various warnings and compilation issues
2118 (https://github.com/fmtlib/fmt/issues/1947,
2119 https://github.com/fmtlib/fmt/pull/1959,
2120 https://github.com/fmtlib/fmt/pull/1963,
2121 https://github.com/fmtlib/fmt/pull/1965,
2122 https://github.com/fmtlib/fmt/issues/1966,
2123 https://github.com/fmtlib/fmt/pull/1974,
2124 https://github.com/fmtlib/fmt/pull/1975,
2125 https://github.com/fmtlib/fmt/pull/1990,
2126 https://github.com/fmtlib/fmt/issues/2000,
2127 https://github.com/fmtlib/fmt/pull/2001,
2128 https://github.com/fmtlib/fmt/issues/2002,
2129 https://github.com/fmtlib/fmt/issues/2004,
2130 https://github.com/fmtlib/fmt/pull/2006,
2131 https://github.com/fmtlib/fmt/pull/2009,
2132 https://github.com/fmtlib/fmt/pull/2010,
2133 https://github.com/fmtlib/fmt/issues/2038,
2134 https://github.com/fmtlib/fmt/issues/2039,
2135 https://github.com/fmtlib/fmt/issues/2047,
2136 https://github.com/fmtlib/fmt/pull/2053,
2137 https://github.com/fmtlib/fmt/issues/2059,
2138 https://github.com/fmtlib/fmt/pull/2065,
2139 https://github.com/fmtlib/fmt/pull/2067,
2140 https://github.com/fmtlib/fmt/pull/2068,
2141 https://github.com/fmtlib/fmt/pull/2073,
2142 https://github.com/fmtlib/fmt/issues/2103,
2143 https://github.com/fmtlib/fmt/issues/2105,
2144 https://github.com/fmtlib/fmt/pull/2106,
2145 https://github.com/fmtlib/fmt/pull/2107,
2146 https://github.com/fmtlib/fmt/issues/2116,
2147 https://github.com/fmtlib/fmt/pull/2117,
2148 https://github.com/fmtlib/fmt/issues/2118,
2149 https://github.com/fmtlib/fmt/pull/2119,
2150 https://github.com/fmtlib/fmt/issues/2127,
2151 https://github.com/fmtlib/fmt/pull/2128,
2152 https://github.com/fmtlib/fmt/issues/2140,
2153 https://github.com/fmtlib/fmt/issues/2142,
2154 https://github.com/fmtlib/fmt/pull/2143,
2155 https://github.com/fmtlib/fmt/pull/2144,
2156 https://github.com/fmtlib/fmt/issues/2147,
2157 https://github.com/fmtlib/fmt/issues/2148,
2158 https://github.com/fmtlib/fmt/issues/2149,
2159 https://github.com/fmtlib/fmt/pull/2152,
2160 https://github.com/fmtlib/fmt/pull/2160,
2161 https://github.com/fmtlib/fmt/issues/2170,
2162 https://github.com/fmtlib/fmt/issues/2175,
2163 https://github.com/fmtlib/fmt/issues/2176,
2164 https://github.com/fmtlib/fmt/pull/2177,
2165 https://github.com/fmtlib/fmt/issues/2178,
2166 https://github.com/fmtlib/fmt/pull/2179,
2167 https://github.com/fmtlib/fmt/issues/2180,
2168 https://github.com/fmtlib/fmt/issues/2181,
2169 https://github.com/fmtlib/fmt/pull/2183,
2170 https://github.com/fmtlib/fmt/issues/2184,
2171 https://github.com/fmtlib/fmt/issues/2185,
2172 https://github.com/fmtlib/fmt/pull/2186,
2173 https://github.com/fmtlib/fmt/pull/2187,
2174 https://github.com/fmtlib/fmt/pull/2190,
2175 https://github.com/fmtlib/fmt/pull/2192,
2176 https://github.com/fmtlib/fmt/pull/2194,
2177 https://github.com/fmtlib/fmt/pull/2205,
2178 https://github.com/fmtlib/fmt/issues/2210,
2179 https://github.com/fmtlib/fmt/pull/2211,
2180 https://github.com/fmtlib/fmt/pull/2215,
2181 https://github.com/fmtlib/fmt/pull/2216,
2182 https://github.com/fmtlib/fmt/pull/2218,
2183 https://github.com/fmtlib/fmt/pull/2220,
2184 https://github.com/fmtlib/fmt/issues/2228,
2185 https://github.com/fmtlib/fmt/pull/2229,
2186 https://github.com/fmtlib/fmt/pull/2230,
2187 https://github.com/fmtlib/fmt/issues/2233,
2188 https://github.com/fmtlib/fmt/pull/2239,
2189 https://github.com/fmtlib/fmt/issues/2248,
2190 https://github.com/fmtlib/fmt/issues/2252,
2191 https://github.com/fmtlib/fmt/pull/2253,
2192 https://github.com/fmtlib/fmt/pull/2255,
2193 https://github.com/fmtlib/fmt/issues/2261,
2194 https://github.com/fmtlib/fmt/issues/2278,
2195 https://github.com/fmtlib/fmt/issues/2284,
2196 https://github.com/fmtlib/fmt/pull/2287,
2197 https://github.com/fmtlib/fmt/pull/2289,
2198 https://github.com/fmtlib/fmt/pull/2290,
2199 https://github.com/fmtlib/fmt/pull/2293,
2200 https://github.com/fmtlib/fmt/issues/2295,
2201 https://github.com/fmtlib/fmt/pull/2296,
2202 https://github.com/fmtlib/fmt/pull/2297,
2203 https://github.com/fmtlib/fmt/issues/2311,
2204 https://github.com/fmtlib/fmt/pull/2313,
2205 https://github.com/fmtlib/fmt/pull/2315,
2206 https://github.com/fmtlib/fmt/issues/2320,
2207 https://github.com/fmtlib/fmt/pull/2321,
2208 https://github.com/fmtlib/fmt/pull/2323,
2209 https://github.com/fmtlib/fmt/issues/2328,
2210 https://github.com/fmtlib/fmt/pull/2329,
2211 https://github.com/fmtlib/fmt/pull/2333,
2212 https://github.com/fmtlib/fmt/pull/2338,
2213 https://github.com/fmtlib/fmt/pull/2341).
2214 Thanks @darklukee, @fagg, @killerbot242, @jgopel, @yeswalrus, @Finkman,
2215 @HazardyKnusperkeks, @dkavolis, @concatime, @chronoxor, @summivox, @yNeo,
2216 @Apache-HB, @alexezeder, @toojays, @Brainy0207, @vadz, @imsherlock, @phprus,
2217 @white238, @yafshar, @BillyDonahue, @jstaahl, @denchat, @DanielaE,
2218 @ilyakurdyukov, @ilmai, @JessyDL, @sergiud, @mwinterb, @sven-herrmann,
2219 @jmelas, @twoixter, @crbrz and @upsj.
2220
2221 - Improved documentation
2222 (https://github.com/fmtlib/fmt/issues/1986,
2223 https://github.com/fmtlib/fmt/pull/2051,
2224 https://github.com/fmtlib/fmt/issues/2057,
2225 https://github.com/fmtlib/fmt/pull/2081,
2226 https://github.com/fmtlib/fmt/issues/2084,
2227 https://github.com/fmtlib/fmt/pull/2312).
2228 Thanks @imba-tjd, @0x416c69 and @mordante.
2229
2230 - Continuous integration and test improvements
2231 (https://github.com/fmtlib/fmt/issues/1969,
2232 https://github.com/fmtlib/fmt/pull/1991,
2233 https://github.com/fmtlib/fmt/pull/2020,
2234 https://github.com/fmtlib/fmt/pull/2110,
2235 https://github.com/fmtlib/fmt/pull/2114,
2236 https://github.com/fmtlib/fmt/issues/2196,
2237 https://github.com/fmtlib/fmt/pull/2217,
2238 https://github.com/fmtlib/fmt/pull/2247,
2239 https://github.com/fmtlib/fmt/pull/2256,
2240 https://github.com/fmtlib/fmt/pull/2336,
2241 https://github.com/fmtlib/fmt/pull/2346).
2242 Thanks @jgopel, @alexezeder and @DanielaE.
2243
2244 # 7.1.3 - 2020-11-24
2245
2246 - Fixed handling of buffer boundaries in `format_to_n`
2247 (https://github.com/fmtlib/fmt/issues/1996,
2248 https://github.com/fmtlib/fmt/issues/2029).
2249 - Fixed linkage errors when linking with a shared library
2250 (https://github.com/fmtlib/fmt/issues/2011).
2251 - Reintroduced ostream support to range formatters
2252 (https://github.com/fmtlib/fmt/issues/2014).
2253 - Worked around an issue with mixing std versions in gcc
2254 (https://github.com/fmtlib/fmt/issues/2017).
2255
2256 # 7.1.2 - 2020-11-04
2257
2258 - Fixed floating point formatting with large precision
2259 (https://github.com/fmtlib/fmt/issues/1976).
2260
2261 # 7.1.1 - 2020-11-01
2262
2263 - Fixed ABI compatibility with 7.0.x
2264 (https://github.com/fmtlib/fmt/issues/1961).
2265 - Added the `FMT_ARM_ABI_COMPATIBILITY` macro to work around ABI
2266 incompatibility between GCC and Clang on ARM
2267 (https://github.com/fmtlib/fmt/issues/1919).
2268 - Worked around a SFINAE bug in GCC 8
2269 (https://github.com/fmtlib/fmt/issues/1957).
2270 - Fixed linkage errors when building with GCC\'s LTO
2271 (https://github.com/fmtlib/fmt/issues/1955).
2272 - Fixed a compilation error when building without `__builtin_clz` or
2273 equivalent (https://github.com/fmtlib/fmt/pull/1968).
2274 Thanks @tohammer.
2275 - Fixed a sign conversion warning
2276 (https://github.com/fmtlib/fmt/pull/1964). Thanks @OptoCloud.
2277
2278 # 7.1.0 - 2020-10-25
2279
2280 - Switched from
2281 [Grisu3](https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf)
2282 to [Dragonbox](https://github.com/jk-jeon/dragonbox) for the default
2283 floating-point formatting which gives the shortest decimal
2284 representation with round-trip guarantee and correct rounding
2285 (https://github.com/fmtlib/fmt/pull/1882,
2286 https://github.com/fmtlib/fmt/pull/1887,
2287 https://github.com/fmtlib/fmt/pull/1894). This makes {fmt}
2288 up to 20-30x faster than common implementations of
2289 `std::ostringstream` and `sprintf` on
2290 [dtoa-benchmark](https://github.com/fmtlib/dtoa-benchmark) and
2291 faster than double-conversion and Ryū:
2292
2293 ![](https://user-images.githubusercontent.com/576385/95684665-11719600-0ba8-11eb-8e5b-972ff4e49428.png)
2294
2295 It is possible to get even better performance at the cost of larger
2296 binary size by compiling with the `FMT_USE_FULL_CACHE_DRAGONBOX`
2297 macro set to 1.
2298
2299 Thanks @jk-jeon.
2300
2301 - Added an experimental unsynchronized file output API which, together
2302 with [format string
2303 compilation](https://fmt.dev/latest/api.html#compile-api), can give
2304 [5-9 times speed up compared to
2305 fprintf](https://www.zverovich.net/2020/08/04/optimal-file-buffer-size.html)
2306 on common platforms ([godbolt](https://godbolt.org/z/nsTcG8)):
2307
2308 ```c++
2309 #include <fmt/os.h>
2310
2311 int main() {
2312 auto f = fmt::output_file("guide");
2313 f.print("The answer is {}.", 42);
2314 }
2315 ```
2316
2317 - Added a formatter for `std::chrono::time_point<system_clock>`
2318 (https://github.com/fmtlib/fmt/issues/1819,
2319 https://github.com/fmtlib/fmt/pull/1837). For example
2320 ([godbolt](https://godbolt.org/z/c4M6fh)):
2321
2322 ```c++
2323 #include <fmt/chrono.h>
2324
2325 int main() {
2326 auto now = std::chrono::system_clock::now();
2327 fmt::print("The time is {:%H:%M:%S}.\n", now);
2328 }
2329 ```
2330
2331 Thanks @adamburgess.
2332
2333 - Added support for ranges with non-const `begin`/`end` to `fmt::join`
2334 (https://github.com/fmtlib/fmt/issues/1784,
2335 https://github.com/fmtlib/fmt/pull/1786). For example
2336 ([godbolt](https://godbolt.org/z/jP63Tv)):
2337
2338 ```c++
2339 #include <fmt/ranges.h>
2340 #include <range/v3/view/filter.hpp>
2341
2342 int main() {
2343 using std::literals::string_literals::operator""s;
2344 auto strs = std::array{"a"s, "bb"s, "ccc"s};
2345 auto range = strs | ranges::views::filter(
2346 [] (const std::string &x) { return x.size() != 2; }
2347 );
2348 fmt::print("{}\n", fmt::join(range, ""));
2349 }
2350 ```
2351
2352 prints \"accc\".
2353
2354 Thanks @tonyelewis.
2355
2356 - Added a `memory_buffer::append` overload that takes a range
2357 (https://github.com/fmtlib/fmt/pull/1806). Thanks @BRevzin.
2358
2359 - Improved handling of single code units in `FMT_COMPILE`. For
2360 example:
2361
2362 ```c++
2363 #include <fmt/compile.h>
2364
2365 char* f(char* buf) {
2366 return fmt::format_to(buf, FMT_COMPILE("x{}"), 42);
2367 }
2368 ```
2369
2370 compiles to just ([godbolt](https://godbolt.org/z/5vncz3)):
2371
2372 ```asm
2373 _Z1fPc:
2374 movb $120, (%rdi)
2375 xorl %edx, %edx
2376 cmpl $42, _ZN3fmt2v76detail10basic_dataIvE23zero_or_powers_of_10_32E+8(%rip)
2377 movl $3, %eax
2378 seta %dl
2379 subl %edx, %eax
2380 movzwl _ZN3fmt2v76detail10basic_dataIvE6digitsE+84(%rip), %edx
2381 cltq
2382 addq %rdi, %rax
2383 movw %dx, -2(%rax)
2384 ret
2385 ```
2386
2387 Here a single `mov` instruction writes `'x'` (`$120`) to the output
2388 buffer.
2389
2390 - Added dynamic width support to format string compilation
2391 (https://github.com/fmtlib/fmt/issues/1809).
2392
2393 - Improved error reporting for unformattable types: now you\'ll get
2394 the type name directly in the error message instead of the note:
2395
2396 ```c++
2397 #include <fmt/core.h>
2398
2399 struct how_about_no {};
2400
2401 int main() {
2402 fmt::print("{}", how_about_no());
2403 }
2404 ```
2405
2406 Error ([godbolt](https://godbolt.org/z/GoxM4e)):
2407
2408 `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" ...`
2409
2410 - Added the
2411 [make_args_checked](https://fmt.dev/7.1.0/api.html#argument-lists)
2412 function template that allows you to write formatting functions with
2413 compile-time format string checks and avoid binary code bloat
2414 ([godbolt](https://godbolt.org/z/PEf9qr)):
2415
2416 ```c++
2417 void vlog(const char* file, int line, fmt::string_view format,
2418 fmt::format_args args) {
2419 fmt::print("{}: {}: ", file, line);
2420 fmt::vprint(format, args);
2421 }
2422
2423 template <typename S, typename... Args>
2424 void log(const char* file, int line, const S& format, Args&&... args) {
2425 vlog(file, line, format,
2426 fmt::make_args_checked<Args...>(format, args...));
2427 }
2428
2429 #define MY_LOG(format, ...) \
2430 log(__FILE__, __LINE__, FMT_STRING(format), __VA_ARGS__)
2431
2432 MY_LOG("invalid squishiness: {}", 42);
2433 ```
2434
2435 - Replaced `snprintf` fallback with a faster internal IEEE 754 `float`
2436 and `double` formatter for arbitrary precision. For example
2437 ([godbolt](https://godbolt.org/z/dPhWvj)):
2438
2439 ```c++
2440 #include <fmt/core.h>
2441
2442 int main() {
2443 fmt::print("{:.500}\n", 4.9406564584124654E-324);
2444 }
2445 ```
2446
2447 prints
2448
2449 `4.9406564584124654417656879286822137236505980261432476442558568250067550727020875186529983636163599237979656469544571773092665671035593979639877479601078187812630071319031140452784581716784898210368871863605699873072305000638740915356498438731247339727316961514003171538539807412623856559117102665855668676818703956031062493194527159149245532930545654440112748012970999954193198940908041656332452475714786901472678015935523861155013480352649347201937902681071074917033322268447533357208324319360923829e-324`.
2450
2451 - Made `format_to_n` and `formatted_size` part of the [core
2452 API](https://fmt.dev/latest/api.html#core-api)
2453 ([godbolt](https://godbolt.org/z/sPjY1K)):
2454
2455 ```c++
2456 #include <fmt/core.h>
2457
2458 int main() {
2459 char buffer[10];
2460 auto result = fmt::format_to_n(buffer, sizeof(buffer), "{}", 42);
2461 }
2462 ```
2463
2464 - Added `fmt::format_to_n` overload with format string compilation
2465 (https://github.com/fmtlib/fmt/issues/1764,
2466 https://github.com/fmtlib/fmt/pull/1767,
2467 https://github.com/fmtlib/fmt/pull/1869). For example
2468 ([godbolt](https://godbolt.org/z/93h86q)):
2469
2470 ```c++
2471 #include <fmt/compile.h>
2472
2473 int main() {
2474 char buffer[8];
2475 fmt::format_to_n(buffer, sizeof(buffer), FMT_COMPILE("{}"), 42);
2476 }
2477 ```
2478
2479 Thanks @Kurkin and @alexezeder.
2480
2481 - Added `fmt::format_to` overload that take `text_style`
2482 (https://github.com/fmtlib/fmt/issues/1593,
2483 https://github.com/fmtlib/fmt/issues/1842,
2484 https://github.com/fmtlib/fmt/pull/1843). For example
2485 ([godbolt](https://godbolt.org/z/91153r)):
2486
2487 ```c++
2488 #include <fmt/color.h>
2489
2490 int main() {
2491 std::string out;
2492 fmt::format_to(std::back_inserter(out),
2493 fmt::emphasis::bold | fg(fmt::color::red),
2494 "The answer is {}.", 42);
2495 }
2496 ```
2497
2498 Thanks @Naios.
2499
2500 - Made the `'#'` specifier emit trailing zeros in addition to the
2501 decimal point (https://github.com/fmtlib/fmt/issues/1797).
2502 For example ([godbolt](https://godbolt.org/z/bhdcW9)):
2503
2504 ```c++
2505 #include <fmt/core.h>
2506
2507 int main() {
2508 fmt::print("{:#.2g}", 0.5);
2509 }
2510 ```
2511
2512 prints `0.50`.
2513
2514 - Changed the default floating point format to not include `.0` for
2515 consistency with `std::format` and `std::to_chars`
2516 (https://github.com/fmtlib/fmt/issues/1893,
2517 https://github.com/fmtlib/fmt/issues/1943). It is possible
2518 to get the decimal point and trailing zero with the `#` specifier.
2519
2520 - Fixed an issue with floating-point formatting that could result in
2521 addition of a non-significant trailing zero in rare cases e.g.
2522 `1.00e-34` instead of `1.0e-34`
2523 (https://github.com/fmtlib/fmt/issues/1873,
2524 https://github.com/fmtlib/fmt/issues/1917).
2525
2526 - Made `fmt::to_string` fallback on `ostream` insertion operator if
2527 the `formatter` specialization is not provided
2528 (https://github.com/fmtlib/fmt/issues/1815,
2529 https://github.com/fmtlib/fmt/pull/1829). Thanks @alexezeder.
2530
2531 - Added support for the append mode to the experimental file API and
2532 improved `fcntl.h` detection.
2533 (https://github.com/fmtlib/fmt/pull/1847,
2534 https://github.com/fmtlib/fmt/pull/1848). Thanks @t-wiser.
2535
2536 - Fixed handling of types that have both an implicit conversion
2537 operator and an overloaded `ostream` insertion operator
2538 (https://github.com/fmtlib/fmt/issues/1766).
2539
2540 - Fixed a slicing issue in an internal iterator type
2541 (https://github.com/fmtlib/fmt/pull/1822). Thanks @BRevzin.
2542
2543 - Fixed an issue in locale-specific integer formatting
2544 (https://github.com/fmtlib/fmt/issues/1927).
2545
2546 - Fixed handling of exotic code unit types
2547 (https://github.com/fmtlib/fmt/issues/1870,
2548 https://github.com/fmtlib/fmt/issues/1932).
2549
2550 - Improved `FMT_ALWAYS_INLINE`
2551 (https://github.com/fmtlib/fmt/pull/1878). Thanks @jk-jeon.
2552
2553 - Removed dependency on `windows.h`
2554 (https://github.com/fmtlib/fmt/pull/1900). Thanks @bernd5.
2555
2556 - Optimized counting of decimal digits on MSVC
2557 (https://github.com/fmtlib/fmt/pull/1890). Thanks @mwinterb.
2558
2559 - Improved documentation
2560 (https://github.com/fmtlib/fmt/issues/1772,
2561 https://github.com/fmtlib/fmt/pull/1775,
2562 https://github.com/fmtlib/fmt/pull/1792,
2563 https://github.com/fmtlib/fmt/pull/1838,
2564 https://github.com/fmtlib/fmt/pull/1888,
2565 https://github.com/fmtlib/fmt/pull/1918,
2566 https://github.com/fmtlib/fmt/pull/1939).
2567 Thanks @leolchat, @pepsiman, @Klaim, @ravijanjam, @francesco-st and @udnaan.
2568
2569 - Added the `FMT_REDUCE_INT_INSTANTIATIONS` CMake option that reduces
2570 the binary code size at the cost of some integer formatting
2571 performance. This can be useful for extremely memory-constrained
2572 embedded systems
2573 (https://github.com/fmtlib/fmt/issues/1778,
2574 https://github.com/fmtlib/fmt/pull/1781). Thanks @kammce.
2575
2576 - Added the `FMT_USE_INLINE_NAMESPACES` macro to control usage of
2577 inline namespaces
2578 (https://github.com/fmtlib/fmt/pull/1945). Thanks @darklukee.
2579
2580 - Improved build configuration
2581 (https://github.com/fmtlib/fmt/pull/1760,
2582 https://github.com/fmtlib/fmt/pull/1770,
2583 https://github.com/fmtlib/fmt/issues/1779,
2584 https://github.com/fmtlib/fmt/pull/1783,
2585 https://github.com/fmtlib/fmt/pull/1823).
2586 Thanks @dvetutnev, @xvitaly, @tambry, @medithe and @martinwuehrer.
2587
2588 - Fixed various warnings and compilation issues
2589 (https://github.com/fmtlib/fmt/pull/1790,
2590 https://github.com/fmtlib/fmt/pull/1802,
2591 https://github.com/fmtlib/fmt/pull/1808,
2592 https://github.com/fmtlib/fmt/issues/1810,
2593 https://github.com/fmtlib/fmt/issues/1811,
2594 https://github.com/fmtlib/fmt/pull/1812,
2595 https://github.com/fmtlib/fmt/pull/1814,
2596 https://github.com/fmtlib/fmt/pull/1816,
2597 https://github.com/fmtlib/fmt/pull/1817,
2598 https://github.com/fmtlib/fmt/pull/1818,
2599 https://github.com/fmtlib/fmt/issues/1825,
2600 https://github.com/fmtlib/fmt/pull/1836,
2601 https://github.com/fmtlib/fmt/pull/1855,
2602 https://github.com/fmtlib/fmt/pull/1856,
2603 https://github.com/fmtlib/fmt/pull/1860,
2604 https://github.com/fmtlib/fmt/pull/1877,
2605 https://github.com/fmtlib/fmt/pull/1879,
2606 https://github.com/fmtlib/fmt/pull/1880,
2607 https://github.com/fmtlib/fmt/issues/1896,
2608 https://github.com/fmtlib/fmt/pull/1897,
2609 https://github.com/fmtlib/fmt/pull/1898,
2610 https://github.com/fmtlib/fmt/issues/1904,
2611 https://github.com/fmtlib/fmt/pull/1908,
2612 https://github.com/fmtlib/fmt/issues/1911,
2613 https://github.com/fmtlib/fmt/issues/1912,
2614 https://github.com/fmtlib/fmt/issues/1928,
2615 https://github.com/fmtlib/fmt/pull/1929,
2616 https://github.com/fmtlib/fmt/issues/1935,
2617 https://github.com/fmtlib/fmt/pull/1937,
2618 https://github.com/fmtlib/fmt/pull/1942,
2619 https://github.com/fmtlib/fmt/issues/1949).
2620 Thanks @TheQwertiest, @medithe, @martinwuehrer, @n16h7hunt3r, @Othereum,
2621 @gsjaardema, @AlexanderLanin, @gcerretani, @chronoxor, @noizefloor,
2622 @akohlmey, @jk-jeon, @rimathia, @rglarix, @moiwi, @heckad, @MarcDirven.
2623 @BartSiwek and @darklukee.
2624
2625 # 7.0.3 - 2020-08-06
2626
2627 - Worked around broken `numeric_limits` for 128-bit integers
2628 (https://github.com/fmtlib/fmt/issues/1787).
2629 - Added error reporting on missing named arguments
2630 (https://github.com/fmtlib/fmt/issues/1796).
2631 - Stopped using 128-bit integers with clang-cl
2632 (https://github.com/fmtlib/fmt/pull/1800). Thanks @Kingcom.
2633 - Fixed issues in locale-specific integer formatting
2634 (https://github.com/fmtlib/fmt/issues/1782,
2635 https://github.com/fmtlib/fmt/issues/1801).
2636
2637 # 7.0.2 - 2020-07-29
2638
2639 - Worked around broken `numeric_limits` for 128-bit integers
2640 (https://github.com/fmtlib/fmt/issues/1725).
2641 - Fixed compatibility with CMake 3.4
2642 (https://github.com/fmtlib/fmt/issues/1779).
2643 - Fixed handling of digit separators in locale-specific formatting
2644 (https://github.com/fmtlib/fmt/issues/1782).
2645
2646 # 7.0.1 - 2020-07-07
2647
2648 - Updated the inline version namespace name.
2649 - Worked around a gcc bug in mangling of alias templates
2650 (https://github.com/fmtlib/fmt/issues/1753).
2651 - Fixed a linkage error on Windows
2652 (https://github.com/fmtlib/fmt/issues/1757). Thanks @Kurkin.
2653 - Fixed minor issues with the documentation.
2654
2655 # 7.0.0 - 2020-07-05
2656
2657 - Reduced the library size. For example, on macOS a stripped test
2658 binary statically linked with {fmt} [shrank from \~368k to less than
2659 100k](http://www.zverovich.net/2020/05/21/reducing-library-size.html).
2660
2661 - Added a simpler and more efficient [format string compilation
2662 API](https://fmt.dev/7.0.0/api.html#compile-api):
2663
2664 ```c++
2665 #include <fmt/compile.h>
2666
2667 // Converts 42 into std::string using the most efficient method and no
2668 // runtime format string processing.
2669 std::string s = fmt::format(FMT_COMPILE("{}"), 42);
2670 ```
2671
2672 The old `fmt::compile` API is now deprecated.
2673
2674 - Optimized integer formatting: `format_to` with format string
2675 compilation and a stack-allocated buffer is now [faster than
2676 to_chars on both libc++ and
2677 libstdc++](http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html).
2678
2679 - Optimized handling of small format strings. For example,
2680
2681 ```c++
2682 fmt::format("Result: {}: ({},{},{},{})", str1, str2, str3, str4, str5)
2683 ```
2684
2685 is now \~40% faster
2686 (https://github.com/fmtlib/fmt/issues/1685).
2687
2688 - Applied extern templates to improve compile times when using the
2689 core API and `fmt/format.h`
2690 (https://github.com/fmtlib/fmt/issues/1452). For example,
2691 on macOS with clang the compile time of a test translation unit
2692 dropped from 2.3s to 0.3s with `-O2` and from 0.6s to 0.3s with the
2693 default settings (`-O0`).
2694
2695 Before (`-O2`):
2696
2697 % time c++ -c test.cc -I include -std=c++17 -O2
2698 c++ -c test.cc -I include -std=c++17 -O2 2.22s user 0.08s system 99% cpu 2.311 total
2699
2700 After (`-O2`):
2701
2702 % time c++ -c test.cc -I include -std=c++17 -O2
2703 c++ -c test.cc -I include -std=c++17 -O2 0.26s user 0.04s system 98% cpu 0.303 total
2704
2705 Before (default):
2706
2707 % time c++ -c test.cc -I include -std=c++17
2708 c++ -c test.cc -I include -std=c++17 0.53s user 0.06s system 98% cpu 0.601 total
2709
2710 After (default):
2711
2712 % time c++ -c test.cc -I include -std=c++17
2713 c++ -c test.cc -I include -std=c++17 0.24s user 0.06s system 98% cpu 0.301 total
2714
2715 It is still recommended to use `fmt/core.h` instead of
2716 `fmt/format.h` but the compile time difference is now smaller.
2717 Thanks @alex3d for the suggestion.
2718
2719 - Named arguments are now stored on stack (no dynamic memory
2720 allocations) and the compiled code is more compact and efficient.
2721 For example
2722
2723 ```c++
2724 #include <fmt/core.h>
2725
2726 int main() {
2727 fmt::print("The answer is {answer}\n", fmt::arg("answer", 42));
2728 }
2729 ```
2730
2731 compiles to just ([godbolt](https://godbolt.org/z/NcfEp_))
2732
2733 ```asm
2734 .LC0:
2735 .string "answer"
2736 .LC1:
2737 .string "The answer is {answer}\n"
2738 main:
2739 sub rsp, 56
2740 mov edi, OFFSET FLAT:.LC1
2741 mov esi, 23
2742 movabs rdx, 4611686018427387905
2743 lea rax, [rsp+32]
2744 lea rcx, [rsp+16]
2745 mov QWORD PTR [rsp+8], 1
2746 mov QWORD PTR [rsp], rax
2747 mov DWORD PTR [rsp+16], 42
2748 mov QWORD PTR [rsp+32], OFFSET FLAT:.LC0
2749 mov DWORD PTR [rsp+40], 0
2750 call fmt::v6::vprint(fmt::v6::basic_string_view<char>,
2751 fmt::v6::format_args)
2752 xor eax, eax
2753 add rsp, 56
2754 ret
2755
2756 .L.str.1:
2757 .asciz "answer"
2758 ```
2759
2760 - Implemented compile-time checks for dynamic width and precision
2761 (https://github.com/fmtlib/fmt/issues/1614):
2762
2763 ```c++
2764 #include <fmt/format.h>
2765
2766 int main() {
2767 fmt::print(FMT_STRING("{0:{1}}"), 42);
2768 }
2769 ```
2770
2771 now gives a compilation error because argument 1 doesn\'t exist:
2772
2773 In file included from test.cc:1:
2774 include/fmt/format.h:2726:27: error: constexpr variable 'invalid_format' must be
2775 initialized by a constant expression
2776 FMT_CONSTEXPR_DECL bool invalid_format =
2777 ^
2778 ...
2779 include/fmt/core.h:569:26: note: in call to
2780 '&checker(s, {}).context_->on_error(&"argument not found"[0])'
2781 if (id >= num_args_) on_error("argument not found");
2782 ^
2783
2784 - Added sentinel support to `fmt::join`
2785 (https://github.com/fmtlib/fmt/pull/1689)
2786
2787 ```c++
2788 struct zstring_sentinel {};
2789 bool operator==(const char* p, zstring_sentinel) { return *p == '\0'; }
2790 bool operator!=(const char* p, zstring_sentinel) { return *p != '\0'; }
2791
2792 struct zstring {
2793 const char* p;
2794 const char* begin() const { return p; }
2795 zstring_sentinel end() const { return {}; }
2796 };
2797
2798 auto s = fmt::format("{}", fmt::join(zstring{"hello"}, "_"));
2799 // s == "h_e_l_l_o"
2800 ```
2801
2802 Thanks @BRevzin.
2803
2804 - Added support for named arguments, `clear` and `reserve` to
2805 `dynamic_format_arg_store`
2806 (https://github.com/fmtlib/fmt/issues/1655,
2807 https://github.com/fmtlib/fmt/pull/1663,
2808 https://github.com/fmtlib/fmt/pull/1674,
2809 https://github.com/fmtlib/fmt/pull/1677). Thanks @vsolontsov-ll.
2810
2811 - Added support for the `'c'` format specifier to integral types for
2812 compatibility with `std::format`
2813 (https://github.com/fmtlib/fmt/issues/1652).
2814
2815 - Replaced the `'n'` format specifier with `'L'` for compatibility
2816 with `std::format`
2817 (https://github.com/fmtlib/fmt/issues/1624). The `'n'`
2818 specifier can be enabled via the `FMT_DEPRECATED_N_SPECIFIER` macro.
2819
2820 - The `'='` format specifier is now disabled by default for
2821 compatibility with `std::format`. It can be enabled via the
2822 `FMT_DEPRECATED_NUMERIC_ALIGN` macro.
2823
2824 - Removed the following deprecated APIs:
2825
2826 - `FMT_STRING_ALIAS` and `fmt` macros - replaced by `FMT_STRING`
2827 - `fmt::basic_string_view::char_type` - replaced by
2828 `fmt::basic_string_view::value_type`
2829 - `convert_to_int`
2830 - `format_arg_store::types`
2831 - `*parse_context` - replaced by `*format_parse_context`
2832 - `FMT_DEPRECATED_INCLUDE_OS`
2833 - `FMT_DEPRECATED_PERCENT` - incompatible with `std::format`
2834 - `*writer` - replaced by compiled format API
2835
2836 - Renamed the `internal` namespace to `detail`
2837 (https://github.com/fmtlib/fmt/issues/1538). The former is
2838 still provided as an alias if the `FMT_USE_INTERNAL` macro is
2839 defined.
2840
2841 - Improved compatibility between `fmt::printf` with the standard specs
2842 (https://github.com/fmtlib/fmt/issues/1595,
2843 https://github.com/fmtlib/fmt/pull/1682,
2844 https://github.com/fmtlib/fmt/pull/1683,
2845 https://github.com/fmtlib/fmt/pull/1687,
2846 https://github.com/fmtlib/fmt/pull/1699). Thanks @rimathia.
2847
2848 - Fixed handling of `operator<<` overloads that use `copyfmt`
2849 (https://github.com/fmtlib/fmt/issues/1666).
2850
2851 - Added the `FMT_OS` CMake option to control inclusion of OS-specific
2852 APIs in the fmt target. This can be useful for embedded platforms
2853 (https://github.com/fmtlib/fmt/issues/1654,
2854 https://github.com/fmtlib/fmt/pull/1656). Thanks @kwesolowski.
2855
2856 - Replaced `FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION` with the
2857 `FMT_FUZZ` macro to prevent interfering with fuzzing of projects
2858 using {fmt} (https://github.com/fmtlib/fmt/pull/1650).
2859 Thanks @asraa.
2860
2861 - Fixed compatibility with emscripten
2862 (https://github.com/fmtlib/fmt/issues/1636,
2863 https://github.com/fmtlib/fmt/pull/1637). Thanks @ArthurSonzogni.
2864
2865 - Improved documentation
2866 (https://github.com/fmtlib/fmt/issues/704,
2867 https://github.com/fmtlib/fmt/pull/1643,
2868 https://github.com/fmtlib/fmt/pull/1660,
2869 https://github.com/fmtlib/fmt/pull/1681,
2870 https://github.com/fmtlib/fmt/pull/1691,
2871 https://github.com/fmtlib/fmt/pull/1706,
2872 https://github.com/fmtlib/fmt/pull/1714,
2873 https://github.com/fmtlib/fmt/pull/1721,
2874 https://github.com/fmtlib/fmt/pull/1739,
2875 https://github.com/fmtlib/fmt/pull/1740,
2876 https://github.com/fmtlib/fmt/pull/1741,
2877 https://github.com/fmtlib/fmt/pull/1751).
2878 Thanks @senior7515, @lsr0, @puetzk, @fpelliccioni, Alexey Kuzmenko, @jelly,
2879 @claremacrae, @jiapengwen, @gsjaardema and @alexey-milovidov.
2880
2881 - Implemented various build configuration fixes and improvements
2882 (https://github.com/fmtlib/fmt/pull/1603,
2883 https://github.com/fmtlib/fmt/pull/1657,
2884 https://github.com/fmtlib/fmt/pull/1702,
2885 https://github.com/fmtlib/fmt/pull/1728).
2886 Thanks @scramsby, @jtojnar, @orivej and @flagarde.
2887
2888 - Fixed various warnings and compilation issues
2889 (https://github.com/fmtlib/fmt/pull/1616,
2890 https://github.com/fmtlib/fmt/issues/1620,
2891 https://github.com/fmtlib/fmt/issues/1622,
2892 https://github.com/fmtlib/fmt/issues/1625,
2893 https://github.com/fmtlib/fmt/pull/1627,
2894 https://github.com/fmtlib/fmt/issues/1628,
2895 https://github.com/fmtlib/fmt/pull/1629,
2896 https://github.com/fmtlib/fmt/issues/1631,
2897 https://github.com/fmtlib/fmt/pull/1633,
2898 https://github.com/fmtlib/fmt/pull/1649,
2899 https://github.com/fmtlib/fmt/issues/1658,
2900 https://github.com/fmtlib/fmt/pull/1661,
2901 https://github.com/fmtlib/fmt/pull/1667,
2902 https://github.com/fmtlib/fmt/issues/1668,
2903 https://github.com/fmtlib/fmt/pull/1669,
2904 https://github.com/fmtlib/fmt/issues/1692,
2905 https://github.com/fmtlib/fmt/pull/1696,
2906 https://github.com/fmtlib/fmt/pull/1697,
2907 https://github.com/fmtlib/fmt/issues/1707,
2908 https://github.com/fmtlib/fmt/pull/1712,
2909 https://github.com/fmtlib/fmt/pull/1716,
2910 https://github.com/fmtlib/fmt/pull/1722,
2911 https://github.com/fmtlib/fmt/issues/1724,
2912 https://github.com/fmtlib/fmt/pull/1729,
2913 https://github.com/fmtlib/fmt/pull/1738,
2914 https://github.com/fmtlib/fmt/issues/1742,
2915 https://github.com/fmtlib/fmt/issues/1743,
2916 https://github.com/fmtlib/fmt/pull/1744,
2917 https://github.com/fmtlib/fmt/issues/1747,
2918 https://github.com/fmtlib/fmt/pull/1750).
2919 Thanks @gsjaardema, @gabime, @johnor, @Kurkin, @invexed, @peterbell10,
2920 @daixtrose, @petrutlucian94, @Neargye, @ambitslix, @gabime, @erthink,
2921 @tohammer and @0x8000-0000.
2922
2923 # 6.2.1 - 2020-05-09
2924
2925 - Fixed ostream support in `sprintf`
2926 (https://github.com/fmtlib/fmt/issues/1631).
2927 - Fixed type detection when using implicit conversion to `string_view`
2928 and ostream `operator<<` inconsistently
2929 (https://github.com/fmtlib/fmt/issues/1662).
2930
2931 # 6.2.0 - 2020-04-05
2932
2933 - Improved error reporting when trying to format an object of a
2934 non-formattable type:
2935
2936 ```c++
2937 fmt::format("{}", S());
2938 ```
2939
2940 now gives:
2941
2942 include/fmt/core.h:1015:5: error: static_assert failed due to requirement
2943 'formattable' "Cannot format argument. To make type T formattable provide a
2944 formatter<T> specialization:
2945 https://fmt.dev/latest/api.html#formatting-user-defined-types"
2946 static_assert(
2947 ^
2948 ...
2949 note: in instantiation of function template specialization
2950 'fmt::v6::format<char [3], S, char>' requested here
2951 fmt::format("{}", S());
2952 ^
2953
2954 if `S` is not formattable.
2955
2956 - Reduced the library size by \~10%.
2957
2958 - Always print decimal point if `#` is specified
2959 (https://github.com/fmtlib/fmt/issues/1476,
2960 https://github.com/fmtlib/fmt/issues/1498):
2961
2962 ```c++
2963 fmt::print("{:#.0f}", 42.0);
2964 ```
2965
2966 now prints `42.`
2967
2968 - Implemented the `'L'` specifier for locale-specific numeric
2969 formatting to improve compatibility with `std::format`. The `'n'`
2970 specifier is now deprecated and will be removed in the next major
2971 release.
2972
2973 - Moved OS-specific APIs such as `windows_error` from `fmt/format.h`
2974 to `fmt/os.h`. You can define `FMT_DEPRECATED_INCLUDE_OS` to
2975 automatically include `fmt/os.h` from `fmt/format.h` for
2976 compatibility but this will be disabled in the next major release.
2977
2978 - Added precision overflow detection in floating-point formatting.
2979
2980 - Implemented detection of invalid use of `fmt::arg`.
2981
2982 - Used `type_identity` to block unnecessary template argument
2983 deduction. Thanks Tim Song.
2984
2985 - Improved UTF-8 handling
2986 (https://github.com/fmtlib/fmt/issues/1109):
2987
2988 ```c++
2989 fmt::print("┌{0:─^{2}}┐\n"
2990 "│{1: ^{2}}│\n"
2991 "└{0:─^{2}}┘\n", "", "Привет, мир!", 20);
2992 ```
2993
2994 now prints:
2995
2996 ┌────────────────────┐
2997 │ Привет, мир! │
2998 └────────────────────┘
2999
3000 on systems that support Unicode.
3001
3002 - Added experimental dynamic argument storage
3003 (https://github.com/fmtlib/fmt/issues/1170,
3004 https://github.com/fmtlib/fmt/pull/1584):
3005
3006 ```c++
3007 fmt::dynamic_format_arg_store<fmt::format_context> store;
3008 store.push_back("answer");
3009 store.push_back(42);
3010 fmt::vprint("The {} is {}.\n", store);
3011 ```
3012
3013 prints:
3014
3015 The answer is 42.
3016
3017 Thanks @vsolontsov-ll.
3018
3019 - Made `fmt::join` accept `initializer_list`
3020 (https://github.com/fmtlib/fmt/pull/1591). Thanks @Rapotkinnik.
3021
3022 - Fixed handling of empty tuples
3023 (https://github.com/fmtlib/fmt/issues/1588).
3024
3025 - Fixed handling of output iterators in `format_to_n`
3026 (https://github.com/fmtlib/fmt/issues/1506).
3027
3028 - Fixed formatting of `std::chrono::duration` types to wide output
3029 (https://github.com/fmtlib/fmt/pull/1533). Thanks @zeffy.
3030
3031 - Added const `begin` and `end` overload to buffers
3032 (https://github.com/fmtlib/fmt/pull/1553). Thanks @dominicpoeschko.
3033
3034 - Added the ability to disable floating-point formatting via
3035 `FMT_USE_FLOAT`, `FMT_USE_DOUBLE` and `FMT_USE_LONG_DOUBLE` macros
3036 for extremely memory-constrained embedded system
3037 (https://github.com/fmtlib/fmt/pull/1590). Thanks @albaguirre.
3038
3039 - Made `FMT_STRING` work with `constexpr` `string_view`
3040 (https://github.com/fmtlib/fmt/pull/1589). Thanks @scramsby.
3041
3042 - Implemented a minor optimization in the format string parser
3043 (https://github.com/fmtlib/fmt/pull/1560). Thanks @IkarusDeveloper.
3044
3045 - Improved attribute detection
3046 (https://github.com/fmtlib/fmt/pull/1469,
3047 https://github.com/fmtlib/fmt/pull/1475,
3048 https://github.com/fmtlib/fmt/pull/1576).
3049 Thanks @federico-busato, @chronoxor and @refnum.
3050
3051 - Improved documentation
3052 (https://github.com/fmtlib/fmt/pull/1481,
3053 https://github.com/fmtlib/fmt/pull/1523).
3054 Thanks @JackBoosY and @imba-tjd.
3055
3056 - Fixed symbol visibility on Linux when compiling with
3057 `-fvisibility=hidden`
3058 (https://github.com/fmtlib/fmt/pull/1535). Thanks @milianw.
3059
3060 - Implemented various build configuration fixes and improvements
3061 (https://github.com/fmtlib/fmt/issues/1264,
3062 https://github.com/fmtlib/fmt/issues/1460,
3063 https://github.com/fmtlib/fmt/pull/1534,
3064 https://github.com/fmtlib/fmt/issues/1536,
3065 https://github.com/fmtlib/fmt/issues/1545,
3066 https://github.com/fmtlib/fmt/pull/1546,
3067 https://github.com/fmtlib/fmt/issues/1566,
3068 https://github.com/fmtlib/fmt/pull/1582,
3069 https://github.com/fmtlib/fmt/issues/1597,
3070 https://github.com/fmtlib/fmt/pull/1598).
3071 Thanks @ambitslix, @jwillikers and @stac47.
3072
3073 - Fixed various warnings and compilation issues
3074 (https://github.com/fmtlib/fmt/pull/1433,
3075 https://github.com/fmtlib/fmt/issues/1461,
3076 https://github.com/fmtlib/fmt/pull/1470,
3077 https://github.com/fmtlib/fmt/pull/1480,
3078 https://github.com/fmtlib/fmt/pull/1485,
3079 https://github.com/fmtlib/fmt/pull/1492,
3080 https://github.com/fmtlib/fmt/issues/1493,
3081 https://github.com/fmtlib/fmt/issues/1504,
3082 https://github.com/fmtlib/fmt/pull/1505,
3083 https://github.com/fmtlib/fmt/pull/1512,
3084 https://github.com/fmtlib/fmt/issues/1515,
3085 https://github.com/fmtlib/fmt/pull/1516,
3086 https://github.com/fmtlib/fmt/pull/1518,
3087 https://github.com/fmtlib/fmt/pull/1519,
3088 https://github.com/fmtlib/fmt/pull/1520,
3089 https://github.com/fmtlib/fmt/pull/1521,
3090 https://github.com/fmtlib/fmt/pull/1522,
3091 https://github.com/fmtlib/fmt/issues/1524,
3092 https://github.com/fmtlib/fmt/pull/1530,
3093 https://github.com/fmtlib/fmt/issues/1531,
3094 https://github.com/fmtlib/fmt/pull/1532,
3095 https://github.com/fmtlib/fmt/issues/1539,
3096 https://github.com/fmtlib/fmt/issues/1547,
3097 https://github.com/fmtlib/fmt/issues/1548,
3098 https://github.com/fmtlib/fmt/pull/1554,
3099 https://github.com/fmtlib/fmt/issues/1567,
3100 https://github.com/fmtlib/fmt/pull/1568,
3101 https://github.com/fmtlib/fmt/pull/1569,
3102 https://github.com/fmtlib/fmt/pull/1571,
3103 https://github.com/fmtlib/fmt/pull/1573,
3104 https://github.com/fmtlib/fmt/pull/1575,
3105 https://github.com/fmtlib/fmt/pull/1581,
3106 https://github.com/fmtlib/fmt/issues/1583,
3107 https://github.com/fmtlib/fmt/issues/1586,
3108 https://github.com/fmtlib/fmt/issues/1587,
3109 https://github.com/fmtlib/fmt/issues/1594,
3110 https://github.com/fmtlib/fmt/pull/1596,
3111 https://github.com/fmtlib/fmt/issues/1604,
3112 https://github.com/fmtlib/fmt/pull/1606,
3113 https://github.com/fmtlib/fmt/issues/1607,
3114 https://github.com/fmtlib/fmt/issues/1609).
3115 Thanks @marti4d, @iPherian, @parkertomatoes, @gsjaardema, @chronoxor,
3116 @DanielaE, @torsten48, @tohammer, @lefticus, @ryusakki, @adnsv, @fghzxm,
3117 @refnum, @pramodk, @Spirrwell and @scramsby.
3118
3119 # 6.1.2 - 2019-12-11
3120
3121 - Fixed ABI compatibility with `libfmt.so.6.0.0`
3122 (https://github.com/fmtlib/fmt/issues/1471).
3123 - Fixed handling types convertible to `std::string_view`
3124 (https://github.com/fmtlib/fmt/pull/1451). Thanks @denizevrenci.
3125 - Made CUDA test an opt-in enabled via the `FMT_CUDA_TEST` CMake
3126 option.
3127 - Fixed sign conversion warnings
3128 (https://github.com/fmtlib/fmt/pull/1440). Thanks @0x8000-0000.
3129
3130 # 6.1.1 - 2019-12-04
3131
3132 - Fixed shared library build on Windows
3133 (https://github.com/fmtlib/fmt/pull/1443,
3134 https://github.com/fmtlib/fmt/issues/1445,
3135 https://github.com/fmtlib/fmt/pull/1446,
3136 https://github.com/fmtlib/fmt/issues/1450).
3137 Thanks @egorpugin and @bbolli.
3138 - Added a missing decimal point in exponent notation with trailing
3139 zeros.
3140 - Removed deprecated `format_arg_store::TYPES`.
3141
3142 # 6.1.0 - 2019-12-01
3143
3144 - {fmt} now formats IEEE 754 `float` and `double` using the shortest
3145 decimal representation with correct rounding by default:
3146
3147 ```c++
3148 #include <cmath>
3149 #include <fmt/core.h>
3150
3151 int main() {
3152 fmt::print("{}", M_PI);
3153 }
3154 ```
3155
3156 prints `3.141592653589793`.
3157
3158 - Made the fast binary to decimal floating-point formatter the
3159 default, simplified it and improved performance. {fmt} is now 15
3160 times faster than libc++\'s `std::ostringstream`, 11 times faster
3161 than `printf` and 10% faster than double-conversion on
3162 [dtoa-benchmark](https://github.com/fmtlib/dtoa-benchmark):
3163
3164 | Function | Time (ns) | Speedup |
3165 | ------------- | --------: | ------: |
3166 | ostringstream | 1,346.30 | 1.00x |
3167 | ostrstream | 1,195.74 | 1.13x |
3168 | sprintf | 995.08 | 1.35x |
3169 | doubleconv | 99.10 | 13.59x |
3170 | fmt | 88.34 | 15.24x |
3171
3172 ![](https://user-images.githubusercontent.com/576385/69767160-cdaca400-112f-11ea-9fc5-347c9f83caad.png)
3173
3174 - {fmt} no longer converts `float` arguments to `double`. In
3175 particular this improves the default (shortest) representation of
3176 floats and makes `fmt::format` consistent with `std::format` specs
3177 (https://github.com/fmtlib/fmt/issues/1336,
3178 https://github.com/fmtlib/fmt/issues/1353,
3179 https://github.com/fmtlib/fmt/pull/1360,
3180 https://github.com/fmtlib/fmt/pull/1361):
3181
3182 ```c++
3183 fmt::print("{}", 0.1f);
3184 ```
3185
3186 prints `0.1` instead of `0.10000000149011612`.
3187
3188 Thanks @orivej.
3189
3190 - Made floating-point formatting output consistent with
3191 `printf`/iostreams
3192 (https://github.com/fmtlib/fmt/issues/1376,
3193 https://github.com/fmtlib/fmt/issues/1417).
3194
3195 - Added support for 128-bit integers
3196 (https://github.com/fmtlib/fmt/pull/1287):
3197
3198 ```c++
3199 fmt::print("{}", std::numeric_limits<__int128_t>::max());
3200 ```
3201
3202 prints `170141183460469231731687303715884105727`.
3203
3204 Thanks @denizevrenci.
3205
3206 - The overload of `print` that takes `text_style` is now atomic, i.e.
3207 the output from different threads doesn\'t interleave
3208 (https://github.com/fmtlib/fmt/pull/1351). Thanks @tankiJong.
3209
3210 - Made compile time in the header-only mode \~20% faster by reducing
3211 the number of template instantiations. `wchar_t` overload of
3212 `vprint` was moved from `fmt/core.h` to `fmt/format.h`.
3213
3214 - Added an overload of `fmt::join` that works with tuples
3215 (https://github.com/fmtlib/fmt/issues/1322,
3216 https://github.com/fmtlib/fmt/pull/1330):
3217
3218 ```c++
3219 #include <tuple>
3220 #include <fmt/ranges.h>
3221
3222 int main() {
3223 std::tuple<char, int, float> t{'a', 1, 2.0f};
3224 fmt::print("{}", t);
3225 }
3226 ```
3227
3228 prints `('a', 1, 2.0)`.
3229
3230 Thanks @jeremyong.
3231
3232 - Changed formatting of octal zero with prefix from \"00\" to \"0\":
3233
3234 ```c++
3235 fmt::print("{:#o}", 0);
3236 ```
3237
3238 prints `0`.
3239
3240 - The locale is now passed to ostream insertion (`<<`) operators
3241 (https://github.com/fmtlib/fmt/pull/1406):
3242
3243 ```c++
3244 #include <fmt/locale.h>
3245 #include <fmt/ostream.h>
3246
3247 struct S {
3248 double value;
3249 };
3250
3251 std::ostream& operator<<(std::ostream& os, S s) {
3252 return os << s.value;
3253 }
3254
3255 int main() {
3256 auto s = fmt::format(std::locale("fr_FR.UTF-8"), "{}", S{0.42});
3257 // s == "0,42"
3258 }
3259 ```
3260
3261 Thanks @dlaugt.
3262
3263 - Locale-specific number formatting now uses grouping
3264 (https://github.com/fmtlib/fmt/issues/1393,
3265 https://github.com/fmtlib/fmt/pull/1394). Thanks @skrdaniel.
3266
3267 - Fixed handling of types with deleted implicit rvalue conversion to
3268 `const char**` (https://github.com/fmtlib/fmt/issues/1421):
3269
3270 ```c++
3271 struct mystring {
3272 operator const char*() const&;
3273 operator const char*() &;
3274 operator const char*() const&& = delete;
3275 operator const char*() && = delete;
3276 };
3277 mystring str;
3278 fmt::print("{}", str); // now compiles
3279 ```
3280
3281 - Enums are now mapped to correct underlying types instead of `int`
3282 (https://github.com/fmtlib/fmt/pull/1286). Thanks @agmt.
3283
3284 - Enum classes are no longer implicitly converted to `int`
3285 (https://github.com/fmtlib/fmt/issues/1424).
3286
3287 - Added `basic_format_parse_context` for consistency with C++20
3288 `std::format` and deprecated `basic_parse_context`.
3289
3290 - Fixed handling of UTF-8 in precision
3291 (https://github.com/fmtlib/fmt/issues/1389,
3292 https://github.com/fmtlib/fmt/pull/1390). Thanks @tajtiattila.
3293
3294 - {fmt} can now be installed on Linux, macOS and Windows with
3295 [Conda](https://docs.conda.io/en/latest/) using its
3296 [conda-forge](https://conda-forge.org)
3297 [package](https://github.com/conda-forge/fmt-feedstock)
3298 (https://github.com/fmtlib/fmt/pull/1410):
3299
3300 conda install -c conda-forge fmt
3301
3302 Thanks @tdegeus.
3303
3304 - Added a CUDA test (https://github.com/fmtlib/fmt/pull/1285,
3305 https://github.com/fmtlib/fmt/pull/1317).
3306 Thanks @luncliff and @risa2000.
3307
3308 - Improved documentation
3309 (https://github.com/fmtlib/fmt/pull/1276,
3310 https://github.com/fmtlib/fmt/issues/1291,
3311 https://github.com/fmtlib/fmt/issues/1296,
3312 https://github.com/fmtlib/fmt/pull/1315,
3313 https://github.com/fmtlib/fmt/pull/1332,
3314 https://github.com/fmtlib/fmt/pull/1337,
3315 https://github.com/fmtlib/fmt/issues/1395
3316 https://github.com/fmtlib/fmt/pull/1418).
3317 Thanks @waywardmonkeys, @pauldreik and @jackoalan.
3318
3319 - Various code improvements
3320 (https://github.com/fmtlib/fmt/pull/1358,
3321 https://github.com/fmtlib/fmt/pull/1407).
3322 Thanks @orivej and @dpacbach.
3323
3324 - Fixed compile-time format string checks for user-defined types
3325 (https://github.com/fmtlib/fmt/issues/1292).
3326
3327 - Worked around a false positive in `unsigned-integer-overflow` sanitizer
3328 (https://github.com/fmtlib/fmt/issues/1377).
3329
3330 - Fixed various warnings and compilation issues
3331 (https://github.com/fmtlib/fmt/issues/1273,
3332 https://github.com/fmtlib/fmt/pull/1278,
3333 https://github.com/fmtlib/fmt/pull/1280,
3334 https://github.com/fmtlib/fmt/issues/1281,
3335 https://github.com/fmtlib/fmt/issues/1288,
3336 https://github.com/fmtlib/fmt/pull/1290,
3337 https://github.com/fmtlib/fmt/pull/1301,
3338 https://github.com/fmtlib/fmt/issues/1305,
3339 https://github.com/fmtlib/fmt/issues/1306,
3340 https://github.com/fmtlib/fmt/issues/1309,
3341 https://github.com/fmtlib/fmt/pull/1312,
3342 https://github.com/fmtlib/fmt/issues/1313,
3343 https://github.com/fmtlib/fmt/issues/1316,
3344 https://github.com/fmtlib/fmt/issues/1319,
3345 https://github.com/fmtlib/fmt/pull/1320,
3346 https://github.com/fmtlib/fmt/pull/1326,
3347 https://github.com/fmtlib/fmt/pull/1328,
3348 https://github.com/fmtlib/fmt/issues/1344,
3349 https://github.com/fmtlib/fmt/pull/1345,
3350 https://github.com/fmtlib/fmt/pull/1347,
3351 https://github.com/fmtlib/fmt/pull/1349,
3352 https://github.com/fmtlib/fmt/issues/1354,
3353 https://github.com/fmtlib/fmt/issues/1362,
3354 https://github.com/fmtlib/fmt/issues/1366,
3355 https://github.com/fmtlib/fmt/pull/1364,
3356 https://github.com/fmtlib/fmt/pull/1370,
3357 https://github.com/fmtlib/fmt/pull/1371,
3358 https://github.com/fmtlib/fmt/issues/1385,
3359 https://github.com/fmtlib/fmt/issues/1388,
3360 https://github.com/fmtlib/fmt/pull/1397,
3361 https://github.com/fmtlib/fmt/pull/1414,
3362 https://github.com/fmtlib/fmt/pull/1416,
3363 https://github.com/fmtlib/fmt/issues/1422
3364 https://github.com/fmtlib/fmt/pull/1427,
3365 https://github.com/fmtlib/fmt/issues/1431,
3366 https://github.com/fmtlib/fmt/pull/1433).
3367 Thanks @hhb, @gsjaardema, @gabime, @neheb, @vedranmiletic, @dkavolis,
3368 @mwinterb, @orivej, @denizevrenci, @leonklingele, @chronoxor, @kent-tri,
3369 @0x8000-0000 and @marti4d.
3370
3371 # 6.0.0 - 2019-08-26
3372
3373 - Switched to the [MIT license](
3374 https://github.com/fmtlib/fmt/blob/5a4b24613ba16cc689977c3b5bd8274a3ba1dd1f/LICENSE.rst)
3375 with an optional exception that allows distributing binary code
3376 without attribution.
3377
3378 - Floating-point formatting is now locale-independent by default:
3379
3380 ```c++
3381 #include <locale>
3382 #include <fmt/core.h>
3383
3384 int main() {
3385 std::locale::global(std::locale("ru_RU.UTF-8"));
3386 fmt::print("value = {}", 4.2);
3387 }
3388 ```
3389
3390 prints \"value = 4.2\" regardless of the locale.
3391
3392 For locale-specific formatting use the `n` specifier:
3393
3394 ```c++
3395 std::locale::global(std::locale("ru_RU.UTF-8"));
3396 fmt::print("value = {:n}", 4.2);
3397 ```
3398
3399 prints \"value = 4,2\".
3400
3401 - Added an experimental Grisu floating-point formatting algorithm
3402 implementation (disabled by default). To enable it compile with the
3403 `FMT_USE_GRISU` macro defined to 1:
3404
3405 ```c++
3406 #define FMT_USE_GRISU 1
3407 #include <fmt/format.h>
3408
3409 auto s = fmt::format("{}", 4.2); // formats 4.2 using Grisu
3410 ```
3411
3412 With Grisu enabled, {fmt} is 13x faster than `std::ostringstream`
3413 (libc++) and 10x faster than `sprintf` on
3414 [dtoa-benchmark](https://github.com/fmtlib/dtoa-benchmark) ([full
3415 results](https://fmt.dev/unknown_mac64_clang10.0.html)):
3416
3417 ![](https://user-images.githubusercontent.com/576385/54883977-9fe8c000-4e28-11e9-8bde-272d122e7c52.jpg)
3418
3419 - Separated formatting and parsing contexts for consistency with
3420 [C++20 std::format](http://eel.is/c++draft/format), removing the
3421 undocumented `basic_format_context::parse_context()` function.
3422
3423 - Added [oss-fuzz](https://github.com/google/oss-fuzz) support
3424 (https://github.com/fmtlib/fmt/pull/1199). Thanks @pauldreik.
3425
3426 - `formatter` specializations now always take precedence over
3427 `operator<<` (https://github.com/fmtlib/fmt/issues/952):
3428
3429 ```c++
3430 #include <iostream>
3431 #include <fmt/ostream.h>
3432
3433 struct S {};
3434
3435 std::ostream& operator<<(std::ostream& os, S) {
3436 return os << 1;
3437 }
3438
3439 template <>
3440 struct fmt::formatter<S> : fmt::formatter<int> {
3441 auto format(S, format_context& ctx) {
3442 return formatter<int>::format(2, ctx);
3443 }
3444 };
3445
3446 int main() {
3447 std::cout << S() << "\n"; // prints 1 using operator<<
3448 fmt::print("{}\n", S()); // prints 2 using formatter
3449 }
3450 ```
3451
3452 - Introduced the experimental `fmt::compile` function that does format
3453 string compilation
3454 (https://github.com/fmtlib/fmt/issues/618,
3455 https://github.com/fmtlib/fmt/issues/1169,
3456 https://github.com/fmtlib/fmt/pull/1171):
3457
3458 ```c++
3459 #include <fmt/compile.h>
3460
3461 auto f = fmt::compile<int>("{}");
3462 std::string s = fmt::format(f, 42); // can be called multiple times to
3463 // format different values
3464 // s == "42"
3465 ```
3466
3467 It moves the cost of parsing a format string outside of the format
3468 function which can be beneficial when identically formatting many
3469 objects of the same types. Thanks @stryku.
3470
3471 - Added experimental `%` format specifier that formats floating-point
3472 values as percentages
3473 (https://github.com/fmtlib/fmt/pull/1060,
3474 https://github.com/fmtlib/fmt/pull/1069,
3475 https://github.com/fmtlib/fmt/pull/1071):
3476
3477 ```c++
3478 auto s = fmt::format("{:.1%}", 0.42); // s == "42.0%"
3479 ```
3480
3481 Thanks @gawain-bolton.
3482
3483 - Implemented precision for floating-point durations
3484 (https://github.com/fmtlib/fmt/issues/1004,
3485 https://github.com/fmtlib/fmt/pull/1012):
3486
3487 ```c++
3488 auto s = fmt::format("{:.1}", std::chrono::duration<double>(1.234));
3489 // s == 1.2s
3490 ```
3491
3492 Thanks @DanielaE.
3493
3494 - Implemented `chrono` format specifiers `%Q` and `%q` that give the
3495 value and the unit respectively
3496 (https://github.com/fmtlib/fmt/pull/1019):
3497
3498 ```c++
3499 auto value = fmt::format("{:%Q}", 42s); // value == "42"
3500 auto unit = fmt::format("{:%q}", 42s); // unit == "s"
3501 ```
3502
3503 Thanks @DanielaE.
3504
3505 - Fixed handling of dynamic width in chrono formatter:
3506
3507 ```c++
3508 auto s = fmt::format("{0:{1}%H:%M:%S}", std::chrono::seconds(12345), 12);
3509 // ^ width argument index ^ width
3510 // s == "03:25:45 "
3511 ```
3512
3513 Thanks Howard Hinnant.
3514
3515 - Removed deprecated `fmt/time.h`. Use `fmt/chrono.h` instead.
3516
3517 - Added `fmt::format` and `fmt::vformat` overloads that take
3518 `text_style` (https://github.com/fmtlib/fmt/issues/993,
3519 https://github.com/fmtlib/fmt/pull/994):
3520
3521 ```c++
3522 #include <fmt/color.h>
3523
3524 std::string message = fmt::format(fmt::emphasis::bold | fg(fmt::color::red),
3525 "The answer is {}.", 42);
3526 ```
3527
3528 Thanks @Naios.
3529
3530 - Removed the deprecated color API (`print_colored`). Use the new API,
3531 namely `print` overloads that take `text_style` instead.
3532
3533 - Made `std::unique_ptr` and `std::shared_ptr` formattable as pointers
3534 via `fmt::ptr` (https://github.com/fmtlib/fmt/pull/1121):
3535
3536 ```c++
3537 std::unique_ptr<int> p = ...;
3538 fmt::print("{}", fmt::ptr(p)); // prints p as a pointer
3539 ```
3540
3541 Thanks @sighingnow.
3542
3543 - Made `print` and `vprint` report I/O errors
3544 (https://github.com/fmtlib/fmt/issues/1098,
3545 https://github.com/fmtlib/fmt/pull/1099). Thanks @BillyDonahue.
3546
3547 - Marked deprecated APIs with the `[[deprecated]]` attribute and
3548 removed internal uses of deprecated APIs
3549 (https://github.com/fmtlib/fmt/pull/1022). Thanks @eliaskosunen.
3550
3551 - Modernized the codebase using more C++11 features and removing
3552 workarounds. Most importantly, `buffer_context` is now an alias
3553 template, so use `buffer_context<T>` instead of
3554 `buffer_context<T>::type`. These features require GCC 4.8 or later.
3555
3556 - `formatter` specializations now always take precedence over implicit
3557 conversions to `int` and the undocumented `convert_to_int` trait is
3558 now deprecated.
3559
3560 - Moved the undocumented `basic_writer`, `writer`, and `wwriter` types
3561 to the `internal` namespace.
3562
3563 - Removed deprecated `basic_format_context::begin()`. Use `out()`
3564 instead.
3565
3566 - Disallowed passing the result of `join` as an lvalue to prevent
3567 misuse.
3568
3569 - Refactored the undocumented structs that represent parsed format
3570 specifiers to simplify the API and allow multibyte fill.
3571
3572 - Moved SFINAE to template parameters to reduce symbol sizes.
3573
3574 - Switched to `fputws` for writing wide strings so that it\'s no
3575 longer required to call `_setmode` on Windows
3576 (https://github.com/fmtlib/fmt/issues/1229,
3577 https://github.com/fmtlib/fmt/pull/1243). Thanks @jackoalan.
3578
3579 - Improved literal-based API
3580 (https://github.com/fmtlib/fmt/pull/1254). Thanks @sylveon.
3581
3582 - Added support for exotic platforms without `uintptr_t` such as IBM i
3583 (AS/400) which has 128-bit pointers and only 64-bit integers
3584 (https://github.com/fmtlib/fmt/issues/1059).
3585
3586 - Added [Sublime Text syntax highlighting config](
3587 https://github.com/fmtlib/fmt/blob/master/support/C%2B%2B.sublime-syntax)
3588 (https://github.com/fmtlib/fmt/issues/1037). Thanks @Kronuz.
3589
3590 - Added the `FMT_ENFORCE_COMPILE_STRING` macro to enforce the use of
3591 compile-time format strings
3592 (https://github.com/fmtlib/fmt/pull/1231). Thanks @jackoalan.
3593
3594 - Stopped setting `CMAKE_BUILD_TYPE` if {fmt} is a subproject
3595 (https://github.com/fmtlib/fmt/issues/1081).
3596
3597 - Various build improvements
3598 (https://github.com/fmtlib/fmt/pull/1039,
3599 https://github.com/fmtlib/fmt/pull/1078,
3600 https://github.com/fmtlib/fmt/pull/1091,
3601 https://github.com/fmtlib/fmt/pull/1103,
3602 https://github.com/fmtlib/fmt/pull/1177).
3603 Thanks @luncliff, @jasonszang, @olafhering, @Lecetem and @pauldreik.
3604
3605 - Improved documentation
3606 (https://github.com/fmtlib/fmt/issues/1049,
3607 https://github.com/fmtlib/fmt/pull/1051,
3608 https://github.com/fmtlib/fmt/pull/1083,
3609 https://github.com/fmtlib/fmt/pull/1113,
3610 https://github.com/fmtlib/fmt/pull/1114,
3611 https://github.com/fmtlib/fmt/issues/1146,
3612 https://github.com/fmtlib/fmt/issues/1180,
3613 https://github.com/fmtlib/fmt/pull/1250,
3614 https://github.com/fmtlib/fmt/pull/1252,
3615 https://github.com/fmtlib/fmt/pull/1265).
3616 Thanks @mikelui, @foonathan, @BillyDonahue, @jwakely, @kaisbe and
3617 @sdebionne.
3618
3619 - Fixed ambiguous formatter specialization in `fmt/ranges.h`
3620 (https://github.com/fmtlib/fmt/issues/1123).
3621
3622 - Fixed formatting of a non-empty `std::filesystem::path` which is an
3623 infinitely deep range of its components
3624 (https://github.com/fmtlib/fmt/issues/1268).
3625
3626 - Fixed handling of general output iterators when formatting
3627 characters (https://github.com/fmtlib/fmt/issues/1056,
3628 https://github.com/fmtlib/fmt/pull/1058). Thanks @abolz.
3629
3630 - Fixed handling of output iterators in `formatter` specialization for
3631 ranges (https://github.com/fmtlib/fmt/issues/1064).
3632
3633 - Fixed handling of exotic character types
3634 (https://github.com/fmtlib/fmt/issues/1188).
3635
3636 - Made chrono formatting work with exceptions disabled
3637 (https://github.com/fmtlib/fmt/issues/1062).
3638
3639 - Fixed DLL visibility issues
3640 (https://github.com/fmtlib/fmt/pull/1134,
3641 https://github.com/fmtlib/fmt/pull/1147). Thanks @denchat.
3642
3643 - Disabled the use of UDL template extension on GCC 9
3644 (https://github.com/fmtlib/fmt/issues/1148).
3645
3646 - Removed misplaced `format` compile-time checks from `printf`
3647 (https://github.com/fmtlib/fmt/issues/1173).
3648
3649 - Fixed issues in the experimental floating-point formatter
3650 (https://github.com/fmtlib/fmt/issues/1072,
3651 https://github.com/fmtlib/fmt/issues/1129,
3652 https://github.com/fmtlib/fmt/issues/1153,
3653 https://github.com/fmtlib/fmt/pull/1155,
3654 https://github.com/fmtlib/fmt/issues/1210,
3655 https://github.com/fmtlib/fmt/issues/1222). Thanks @alabuzhev.
3656
3657 - Fixed bugs discovered by fuzzing or during fuzzing integration
3658 (https://github.com/fmtlib/fmt/issues/1124,
3659 https://github.com/fmtlib/fmt/issues/1127,
3660 https://github.com/fmtlib/fmt/issues/1132,
3661 https://github.com/fmtlib/fmt/pull/1135,
3662 https://github.com/fmtlib/fmt/issues/1136,
3663 https://github.com/fmtlib/fmt/issues/1141,
3664 https://github.com/fmtlib/fmt/issues/1142,
3665 https://github.com/fmtlib/fmt/issues/1178,
3666 https://github.com/fmtlib/fmt/issues/1179,
3667 https://github.com/fmtlib/fmt/issues/1194). Thanks @pauldreik.
3668
3669 - Fixed building tests on FreeBSD and Hurd
3670 (https://github.com/fmtlib/fmt/issues/1043). Thanks @jackyf.
3671
3672 - Fixed various warnings and compilation issues
3673 (https://github.com/fmtlib/fmt/pull/998,
3674 https://github.com/fmtlib/fmt/pull/1006,
3675 https://github.com/fmtlib/fmt/issues/1008,
3676 https://github.com/fmtlib/fmt/issues/1011,
3677 https://github.com/fmtlib/fmt/issues/1025,
3678 https://github.com/fmtlib/fmt/pull/1027,
3679 https://github.com/fmtlib/fmt/pull/1028,
3680 https://github.com/fmtlib/fmt/pull/1029,
3681 https://github.com/fmtlib/fmt/pull/1030,
3682 https://github.com/fmtlib/fmt/pull/1031,
3683 https://github.com/fmtlib/fmt/pull/1054,
3684 https://github.com/fmtlib/fmt/issues/1063,
3685 https://github.com/fmtlib/fmt/pull/1068,
3686 https://github.com/fmtlib/fmt/pull/1074,
3687 https://github.com/fmtlib/fmt/pull/1075,
3688 https://github.com/fmtlib/fmt/pull/1079,
3689 https://github.com/fmtlib/fmt/pull/1086,
3690 https://github.com/fmtlib/fmt/issues/1088,
3691 https://github.com/fmtlib/fmt/pull/1089,
3692 https://github.com/fmtlib/fmt/pull/1094,
3693 https://github.com/fmtlib/fmt/issues/1101,
3694 https://github.com/fmtlib/fmt/pull/1102,
3695 https://github.com/fmtlib/fmt/issues/1105,
3696 https://github.com/fmtlib/fmt/pull/1107,
3697 https://github.com/fmtlib/fmt/issues/1115,
3698 https://github.com/fmtlib/fmt/issues/1117,
3699 https://github.com/fmtlib/fmt/issues/1118,
3700 https://github.com/fmtlib/fmt/issues/1120,
3701 https://github.com/fmtlib/fmt/issues/1123,
3702 https://github.com/fmtlib/fmt/pull/1139,
3703 https://github.com/fmtlib/fmt/issues/1140,
3704 https://github.com/fmtlib/fmt/issues/1143,
3705 https://github.com/fmtlib/fmt/pull/1144,
3706 https://github.com/fmtlib/fmt/pull/1150,
3707 https://github.com/fmtlib/fmt/pull/1151,
3708 https://github.com/fmtlib/fmt/issues/1152,
3709 https://github.com/fmtlib/fmt/issues/1154,
3710 https://github.com/fmtlib/fmt/issues/1156,
3711 https://github.com/fmtlib/fmt/pull/1159,
3712 https://github.com/fmtlib/fmt/issues/1175,
3713 https://github.com/fmtlib/fmt/issues/1181,
3714 https://github.com/fmtlib/fmt/issues/1186,
3715 https://github.com/fmtlib/fmt/pull/1187,
3716 https://github.com/fmtlib/fmt/pull/1191,
3717 https://github.com/fmtlib/fmt/issues/1197,
3718 https://github.com/fmtlib/fmt/issues/1200,
3719 https://github.com/fmtlib/fmt/issues/1203,
3720 https://github.com/fmtlib/fmt/issues/1205,
3721 https://github.com/fmtlib/fmt/pull/1206,
3722 https://github.com/fmtlib/fmt/issues/1213,
3723 https://github.com/fmtlib/fmt/issues/1214,
3724 https://github.com/fmtlib/fmt/pull/1217,
3725 https://github.com/fmtlib/fmt/issues/1228,
3726 https://github.com/fmtlib/fmt/pull/1230,
3727 https://github.com/fmtlib/fmt/issues/1232,
3728 https://github.com/fmtlib/fmt/pull/1235,
3729 https://github.com/fmtlib/fmt/pull/1236,
3730 https://github.com/fmtlib/fmt/issues/1240).
3731 Thanks @DanielaE, @mwinterb, @eliaskosunen, @morinmorin, @ricco19,
3732 @waywardmonkeys, @chronoxor, @remyabel, @pauldreik, @gsjaardema, @rcane,
3733 @mocabe, @denchat, @cjdb, @HazardyKnusperkeks, @vedranmiletic, @jackoalan,
3734 @DaanDeMeyer and @starkmapper.
3735
3736 # 5.3.0 - 2018-12-28
3737
3738 - Introduced experimental chrono formatting support:
3739
3740 ```c++
3741 #include <fmt/chrono.h>
3742
3743 int main() {
3744 using namespace std::literals::chrono_literals;
3745 fmt::print("Default format: {} {}\n", 42s, 100ms);
3746 fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s);
3747 }
3748 ```
3749
3750 prints:
3751
3752 Default format: 42s 100ms
3753 strftime-like format: 03:15:30
3754
3755 - Added experimental support for emphasis (bold, italic, underline,
3756 strikethrough), colored output to a file stream, and improved
3757 colored formatting API
3758 (https://github.com/fmtlib/fmt/pull/961,
3759 https://github.com/fmtlib/fmt/pull/967,
3760 https://github.com/fmtlib/fmt/pull/973):
3761
3762 ```c++
3763 #include <fmt/color.h>
3764
3765 int main() {
3766 print(fg(fmt::color::crimson) | fmt::emphasis::bold,
3767 "Hello, {}!\n", "world");
3768 print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) |
3769 fmt::emphasis::underline, "Hello, {}!\n", "мир");
3770 print(fg(fmt::color::steel_blue) | fmt::emphasis::italic,
3771 "Hello, {}!\n", "世界");
3772 }
3773 ```
3774
3775 prints the following on modern terminals with RGB color support:
3776
3777 ![](https://user-images.githubusercontent.com/576385/50405788-b66e7500-076e-11e9-9592-7324d1f951d8.png)
3778
3779 Thanks @Rakete1111.
3780
3781 - Added support for 4-bit terminal colors
3782 (https://github.com/fmtlib/fmt/issues/968,
3783 https://github.com/fmtlib/fmt/pull/974)
3784
3785 ```c++
3786 #include <fmt/color.h>
3787
3788 int main() {
3789 print(fg(fmt::terminal_color::red), "stop\n");
3790 }
3791 ```
3792
3793 Note that these colors vary by terminal:
3794
3795 ![](https://user-images.githubusercontent.com/576385/50405925-dbfc7e00-0770-11e9-9b85-333fab0af9ac.png)
3796
3797 Thanks @Rakete1111.
3798
3799 - Parameterized formatting functions on the type of the format string
3800 (https://github.com/fmtlib/fmt/issues/880,
3801 https://github.com/fmtlib/fmt/pull/881,
3802 https://github.com/fmtlib/fmt/pull/883,
3803 https://github.com/fmtlib/fmt/pull/885,
3804 https://github.com/fmtlib/fmt/pull/897,
3805 https://github.com/fmtlib/fmt/issues/920). Any object of
3806 type `S` that has an overloaded `to_string_view(const S&)` returning
3807 `fmt::string_view` can be used as a format string:
3808
3809 ```c++
3810 namespace my_ns {
3811 inline string_view to_string_view(const my_string& s) {
3812 return {s.data(), s.length()};
3813 }
3814 }
3815
3816 std::string message = fmt::format(my_string("The answer is {}."), 42);
3817 ```
3818
3819 Thanks @DanielaE.
3820
3821 - Made `std::string_view` work as a format string
3822 (https://github.com/fmtlib/fmt/pull/898):
3823
3824 ```c++
3825 auto message = fmt::format(std::string_view("The answer is {}."), 42);
3826 ```
3827
3828 Thanks @DanielaE.
3829
3830 - Added wide string support to compile-time format string checks
3831 (https://github.com/fmtlib/fmt/pull/924):
3832
3833 ```c++
3834 print(fmt(L"{:f}"), 42); // compile-time error: invalid type specifier
3835 ```
3836
3837 Thanks @XZiar.
3838
3839 - Made colored print functions work with wide strings
3840 (https://github.com/fmtlib/fmt/pull/867):
3841
3842 ```c++
3843 #include <fmt/color.h>
3844
3845 int main() {
3846 print(fg(fmt::color::red), L"{}\n", 42);
3847 }
3848 ```
3849
3850 Thanks @DanielaE.
3851
3852 - Introduced experimental Unicode support
3853 (https://github.com/fmtlib/fmt/issues/628,
3854 https://github.com/fmtlib/fmt/pull/891):
3855
3856 ```c++
3857 using namespace fmt::literals;
3858 auto s = fmt::format("{:*^5}"_u, "🤡"_u); // s == "**🤡**"_u
3859 ```
3860
3861 - Improved locale support:
3862
3863 ```c++
3864 #include <fmt/locale.h>
3865
3866 struct numpunct : std::numpunct<char> {
3867 protected:
3868 char do_thousands_sep() const override { return '~'; }
3869 };
3870
3871 std::locale loc;
3872 auto s = fmt::format(std::locale(loc, new numpunct()), "{:n}", 1234567);
3873 // s == "1~234~567"
3874 ```
3875
3876 - Constrained formatting functions on proper iterator types
3877 (https://github.com/fmtlib/fmt/pull/921). Thanks @DanielaE.
3878
3879 - Added `make_printf_args` and `make_wprintf_args` functions
3880 (https://github.com/fmtlib/fmt/pull/934). Thanks @tnovotny.
3881
3882 - Deprecated `fmt::visit`, `parse_context`, and `wparse_context`. Use
3883 `fmt::visit_format_arg`, `format_parse_context`, and
3884 `wformat_parse_context` instead.
3885
3886 - Removed undocumented `basic_fixed_buffer` which has been superseded
3887 by the iterator-based API
3888 (https://github.com/fmtlib/fmt/issues/873,
3889 https://github.com/fmtlib/fmt/pull/902). Thanks @superfunc.
3890
3891 - Disallowed repeated leading zeros in an argument ID:
3892
3893 ```c++
3894 fmt::print("{000}", 42); // error
3895 ```
3896
3897 - Reintroduced support for gcc 4.4.
3898
3899 - Fixed compilation on platforms with exotic `double`
3900 (https://github.com/fmtlib/fmt/issues/878).
3901
3902 - Improved documentation
3903 (https://github.com/fmtlib/fmt/issues/164,
3904 https://github.com/fmtlib/fmt/issues/877,
3905 https://github.com/fmtlib/fmt/pull/901,
3906 https://github.com/fmtlib/fmt/pull/906,
3907 https://github.com/fmtlib/fmt/pull/979).
3908 Thanks @kookjr, @DarkDimius and @HecticSerenity.
3909
3910 - Added pkgconfig support which makes it easier to consume the library
3911 from meson and other build systems
3912 (https://github.com/fmtlib/fmt/pull/916). Thanks @colemickens.
3913
3914 - Various build improvements
3915 (https://github.com/fmtlib/fmt/pull/909,
3916 https://github.com/fmtlib/fmt/pull/926,
3917 https://github.com/fmtlib/fmt/pull/937,
3918 https://github.com/fmtlib/fmt/pull/953,
3919 https://github.com/fmtlib/fmt/pull/959).
3920 Thanks @tchaikov, @luncliff, @AndreasSchoenle, @hotwatermorning and @Zefz.
3921
3922 - Improved `string_view` construction performance
3923 (https://github.com/fmtlib/fmt/pull/914). Thanks @gabime.
3924
3925 - Fixed non-matching char types
3926 (https://github.com/fmtlib/fmt/pull/895). Thanks @DanielaE.
3927
3928 - Fixed `format_to_n` with `std::back_insert_iterator`
3929 (https://github.com/fmtlib/fmt/pull/913). Thanks @DanielaE.
3930
3931 - Fixed locale-dependent formatting
3932 (https://github.com/fmtlib/fmt/issues/905).
3933
3934 - Fixed various compiler warnings and errors
3935 (https://github.com/fmtlib/fmt/pull/882,
3936 https://github.com/fmtlib/fmt/pull/886,
3937 https://github.com/fmtlib/fmt/pull/933,
3938 https://github.com/fmtlib/fmt/pull/941,
3939 https://github.com/fmtlib/fmt/issues/931,
3940 https://github.com/fmtlib/fmt/pull/943,
3941 https://github.com/fmtlib/fmt/pull/954,
3942 https://github.com/fmtlib/fmt/pull/956,
3943 https://github.com/fmtlib/fmt/pull/962,
3944 https://github.com/fmtlib/fmt/issues/965,
3945 https://github.com/fmtlib/fmt/issues/977,
3946 https://github.com/fmtlib/fmt/pull/983,
3947 https://github.com/fmtlib/fmt/pull/989).
3948 Thanks @Luthaf, @stevenhoving, @christinaa, @lgritz, @DanielaE,
3949 @0x8000-0000 and @liuping1997.
3950
3951 # 5.2.1 - 2018-09-21
3952
3953 - Fixed `visit` lookup issues on gcc 7 & 8
3954 (https://github.com/fmtlib/fmt/pull/870). Thanks @medithe.
3955 - Fixed linkage errors on older gcc.
3956 - Prevented `fmt/range.h` from specializing `fmt::basic_string_view`
3957 (https://github.com/fmtlib/fmt/issues/865,
3958 https://github.com/fmtlib/fmt/pull/868). Thanks @hhggit.
3959 - Improved error message when formatting unknown types
3960 (https://github.com/fmtlib/fmt/pull/872). Thanks @foonathan.
3961 - Disabled templated user-defined literals when compiled under nvcc
3962 (https://github.com/fmtlib/fmt/pull/875). Thanks @CandyGumdrop.
3963 - Fixed `format_to` formatting to `wmemory_buffer`
3964 (https://github.com/fmtlib/fmt/issues/874).
3965
3966 # 5.2.0 - 2018-09-13
3967
3968 - Optimized format string parsing and argument processing which
3969 resulted in up to 5x speed up on long format strings and significant
3970 performance boost on various benchmarks. For example, version 5.2 is
3971 2.22x faster than 5.1 on decimal integer formatting with `format_to`
3972 (macOS, clang-902.0.39.2):
3973
3974 | Method | Time, s | Speedup |
3975 | -------------------------- | --------------: | ------: |
3976 | fmt::format 5.1 | 0.58 | |
3977 | fmt::format 5.2 | 0.35 | 1.66x |
3978 | fmt::format_to 5.1 | 0.51 | |
3979 | fmt::format_to 5.2 | 0.23 | 2.22x |
3980 | sprintf | 0.71 | |
3981 | std::to_string | 1.01 | |
3982 | std::stringstream | 1.73 | |
3983
3984 - Changed the `fmt` macro from opt-out to opt-in to prevent name
3985 collisions. To enable it define the `FMT_STRING_ALIAS` macro to 1
3986 before including `fmt/format.h`:
3987
3988 ```c++
3989 #define FMT_STRING_ALIAS 1
3990 #include <fmt/format.h>
3991 std::string answer = format(fmt("{}"), 42);
3992 ```
3993
3994 - Added compile-time format string checks to `format_to` overload that
3995 takes `fmt::memory_buffer`
3996 (https://github.com/fmtlib/fmt/issues/783):
3997
3998 ```c++
3999 fmt::memory_buffer buf;
4000 // Compile-time error: invalid type specifier.
4001 fmt::format_to(buf, fmt("{:d}"), "foo");
4002 ```
4003
4004 - Moved experimental color support to `fmt/color.h` and enabled the
4005 new API by default. The old API can be enabled by defining the
4006 `FMT_DEPRECATED_COLORS` macro.
4007
4008 - Added formatting support for types explicitly convertible to
4009 `fmt::string_view`:
4010
4011 ```c++
4012 struct foo {
4013 explicit operator fmt::string_view() const { return "foo"; }
4014 };
4015 auto s = format("{}", foo());
4016 ```
4017
4018 In particular, this makes formatting function work with
4019 `folly::StringPiece`.
4020
4021 - Implemented preliminary support for `char*_t` by replacing the
4022 `format` function overloads with a single function template
4023 parameterized on the string type.
4024
4025 - Added support for dynamic argument lists
4026 (https://github.com/fmtlib/fmt/issues/814,
4027 https://github.com/fmtlib/fmt/pull/819). Thanks @MikePopoloski.
4028
4029 - Reduced executable size overhead for embedded targets using newlib
4030 nano by making locale dependency optional
4031 (https://github.com/fmtlib/fmt/pull/839). Thanks @teajay-fr.
4032
4033 - Keep `noexcept` specifier when exceptions are disabled
4034 (https://github.com/fmtlib/fmt/issues/801,
4035 https://github.com/fmtlib/fmt/pull/810). Thanks @qis.
4036
4037 - Fixed formatting of user-defined types providing `operator<<` with
4038 `format_to_n` (https://github.com/fmtlib/fmt/pull/806).
4039 Thanks @mkurdej.
4040
4041 - Fixed dynamic linkage of new symbols
4042 (https://github.com/fmtlib/fmt/issues/808).
4043
4044 - Fixed global initialization issue
4045 (https://github.com/fmtlib/fmt/issues/807):
4046
4047 ```c++
4048 // This works on compilers with constexpr support.
4049 static const std::string answer = fmt::format("{}", 42);
4050 ```
4051
4052 - Fixed various compiler warnings and errors
4053 (https://github.com/fmtlib/fmt/pull/804,
4054 https://github.com/fmtlib/fmt/issues/809,
4055 https://github.com/fmtlib/fmt/pull/811,
4056 https://github.com/fmtlib/fmt/issues/822,
4057 https://github.com/fmtlib/fmt/pull/827,
4058 https://github.com/fmtlib/fmt/issues/830,
4059 https://github.com/fmtlib/fmt/pull/838,
4060 https://github.com/fmtlib/fmt/issues/843,
4061 https://github.com/fmtlib/fmt/pull/844,
4062 https://github.com/fmtlib/fmt/issues/851,
4063 https://github.com/fmtlib/fmt/pull/852,
4064 https://github.com/fmtlib/fmt/pull/854).
4065 Thanks @henryiii, @medithe, and @eliasdaler.
4066
4067 # 5.1.0 - 2018-07-05
4068
4069 - Added experimental support for RGB color output enabled with the
4070 `FMT_EXTENDED_COLORS` macro:
4071
4072 ```c++
4073 #define FMT_EXTENDED_COLORS
4074 #define FMT_HEADER_ONLY // or compile fmt with FMT_EXTENDED_COLORS defined
4075 #include <fmt/format.h>
4076
4077 fmt::print(fmt::color::steel_blue, "Some beautiful text");
4078 ```
4079
4080 The old API (the `print_colored` and `vprint_colored` functions and
4081 the `color` enum) is now deprecated.
4082 (https://github.com/fmtlib/fmt/issues/762
4083 https://github.com/fmtlib/fmt/pull/767). thanks @Remotion.
4084
4085 - Added quotes to strings in ranges and tuples
4086 (https://github.com/fmtlib/fmt/pull/766). Thanks @Remotion.
4087
4088 - Made `format_to` work with `basic_memory_buffer`
4089 (https://github.com/fmtlib/fmt/issues/776).
4090
4091 - Added `vformat_to_n` and `wchar_t` overload of `format_to_n`
4092 (https://github.com/fmtlib/fmt/issues/764,
4093 https://github.com/fmtlib/fmt/issues/769).
4094
4095 - Made `is_range` and `is_tuple_like` part of public (experimental)
4096 API to allow specialization for user-defined types
4097 (https://github.com/fmtlib/fmt/issues/751,
4098 https://github.com/fmtlib/fmt/pull/759). Thanks @drrlvn.
4099
4100 - Added more compilers to continuous integration and increased
4101 `FMT_PEDANTIC` warning levels
4102 (https://github.com/fmtlib/fmt/pull/736). Thanks @eliaskosunen.
4103
4104 - Fixed compilation with MSVC 2013.
4105
4106 - Fixed handling of user-defined types in `format_to`
4107 (https://github.com/fmtlib/fmt/issues/793).
4108
4109 - Forced linking of inline `vformat` functions into the library
4110 (https://github.com/fmtlib/fmt/issues/795).
4111
4112 - Fixed incorrect call to on_align in `'{:}='`
4113 (https://github.com/fmtlib/fmt/issues/750).
4114
4115 - Fixed floating-point formatting to a non-back_insert_iterator with
4116 sign & numeric alignment specified
4117 (https://github.com/fmtlib/fmt/issues/756).
4118
4119 - Fixed formatting to an array with `format_to_n`
4120 (https://github.com/fmtlib/fmt/issues/778).
4121
4122 - Fixed formatting of more than 15 named arguments
4123 (https://github.com/fmtlib/fmt/issues/754).
4124
4125 - Fixed handling of compile-time strings when including
4126 `fmt/ostream.h`. (https://github.com/fmtlib/fmt/issues/768).
4127
4128 - Fixed various compiler warnings and errors
4129 (https://github.com/fmtlib/fmt/issues/742,
4130 https://github.com/fmtlib/fmt/issues/748,
4131 https://github.com/fmtlib/fmt/issues/752,
4132 https://github.com/fmtlib/fmt/issues/770,
4133 https://github.com/fmtlib/fmt/pull/775,
4134 https://github.com/fmtlib/fmt/issues/779,
4135 https://github.com/fmtlib/fmt/pull/780,
4136 https://github.com/fmtlib/fmt/pull/790,
4137 https://github.com/fmtlib/fmt/pull/792,
4138 https://github.com/fmtlib/fmt/pull/800).
4139 Thanks @Remotion, @gabime, @foonathan, @Dark-Passenger and @0x8000-0000.
4140
4141 # 5.0.0 - 2018-05-21
4142
4143 - Added a requirement for partial C++11 support, most importantly
4144 variadic templates and type traits, and dropped `FMT_VARIADIC_*`
4145 emulation macros. Variadic templates are available since GCC 4.4,
4146 Clang 2.9 and MSVC 18.0 (2013). For older compilers use {fmt}
4147 [version 4.x](https://github.com/fmtlib/fmt/releases/tag/4.1.0)
4148 which continues to be maintained and works with C++98 compilers.
4149
4150 - Renamed symbols to follow standard C++ naming conventions and
4151 proposed a subset of the library for standardization in [P0645R2
4152 Text Formatting](https://wg21.link/P0645).
4153
4154 - Implemented `constexpr` parsing of format strings and [compile-time
4155 format string
4156 checks](https://fmt.dev/latest/api.html#compile-time-format-string-checks).
4157 For example
4158
4159 ```c++
4160 #include <fmt/format.h>
4161
4162 std::string s = format(fmt("{:d}"), "foo");
4163 ```
4164
4165 gives a compile-time error because `d` is an invalid specifier for
4166 strings ([godbolt](https://godbolt.org/g/rnCy9Q)):
4167
4168 ...
4169 <source>:4:19: note: in instantiation of function template specialization 'fmt::v5::format<S, char [4]>' requested here
4170 std::string s = format(fmt("{:d}"), "foo");
4171 ^
4172 format.h:1337:13: note: non-constexpr function 'on_error' cannot be used in a constant expression
4173 handler.on_error("invalid type specifier");
4174
4175 Compile-time checks require relaxed `constexpr` (C++14 feature)
4176 support. If the latter is not available, checks will be performed at
4177 runtime.
4178
4179 - Separated format string parsing and formatting in the extension API
4180 to enable compile-time format string processing. For example
4181
4182 ```c++
4183 struct Answer {};
4184
4185 namespace fmt {
4186 template <>
4187 struct formatter<Answer> {
4188 constexpr auto parse(parse_context& ctx) {
4189 auto it = ctx.begin();
4190 spec = *it;
4191 if (spec != 'd' && spec != 's')
4192 throw format_error("invalid specifier");
4193 return ++it;
4194 }
4195
4196 template <typename FormatContext>
4197 auto format(Answer, FormatContext& ctx) {
4198 return spec == 's' ?
4199 format_to(ctx.begin(), "{}", "fourty-two") :
4200 format_to(ctx.begin(), "{}", 42);
4201 }
4202
4203 char spec = 0;
4204 };
4205 }
4206
4207 std::string s = format(fmt("{:x}"), Answer());
4208 ```
4209
4210 gives a compile-time error due to invalid format specifier
4211 ([godbolt](https://godbolt.org/g/2jQ1Dv)):
4212
4213 ...
4214 <source>:12:45: error: expression '<throw-expression>' is not a constant expression
4215 throw format_error("invalid specifier");
4216
4217 - Added [iterator
4218 support](https://fmt.dev/latest/api.html#output-iterator-support):
4219
4220 ```c++
4221 #include <vector>
4222 #include <fmt/format.h>
4223
4224 std::vector<char> out;
4225 fmt::format_to(std::back_inserter(out), "{}", 42);
4226 ```
4227
4228 - Added the
4229 [format_to_n](https://fmt.dev/latest/api.html#_CPPv2N3fmt11format_to_nE8OutputItNSt6size_tE11string_viewDpRK4Args)
4230 function that restricts the output to the specified number of
4231 characters (https://github.com/fmtlib/fmt/issues/298):
4232
4233 ```c++
4234 char out[4];
4235 fmt::format_to_n(out, sizeof(out), "{}", 12345);
4236 // out == "1234" (without terminating '\0')
4237 ```
4238
4239 - Added the [formatted_size](
4240 https://fmt.dev/latest/api.html#_CPPv2N3fmt14formatted_sizeE11string_viewDpRK4Args)
4241 function for computing the output size:
4242
4243 ```c++
4244 #include <fmt/format.h>
4245
4246 auto size = fmt::formatted_size("{}", 12345); // size == 5
4247 ```
4248
4249 - Improved compile times by reducing dependencies on standard headers
4250 and providing a lightweight [core
4251 API](https://fmt.dev/latest/api.html#core-api):
4252
4253 ```c++
4254 #include <fmt/core.h>
4255
4256 fmt::print("The answer is {}.", 42);
4257 ```
4258
4259 See [Compile time and code
4260 bloat](https://github.com/fmtlib/fmt#compile-time-and-code-bloat).
4261
4262 - Added the [make_format_args](
4263 https://fmt.dev/latest/api.html#_CPPv2N3fmt16make_format_argsEDpRK4Args)
4264 function for capturing formatting arguments:
4265
4266 ```c++
4267 // Prints formatted error message.
4268 void vreport_error(const char *format, fmt::format_args args) {
4269 fmt::print("Error: ");
4270 fmt::vprint(format, args);
4271 }
4272 template <typename... Args>
4273 void report_error(const char *format, const Args & ... args) {
4274 vreport_error(format, fmt::make_format_args(args...));
4275 }
4276 ```
4277
4278 - Added the `make_printf_args` function for capturing `printf`
4279 arguments (https://github.com/fmtlib/fmt/issues/687,
4280 https://github.com/fmtlib/fmt/pull/694). Thanks @Kronuz.
4281
4282 - Added prefix `v` to non-variadic functions taking `format_args` to
4283 distinguish them from variadic ones:
4284
4285 ```c++
4286 std::string vformat(string_view format_str, format_args args);
4287
4288 template <typename... Args>
4289 std::string format(string_view format_str, const Args & ... args);
4290 ```
4291
4292 - Added experimental support for formatting ranges, containers and
4293 tuple-like types in `fmt/ranges.h`
4294 (https://github.com/fmtlib/fmt/pull/735):
4295
4296 ```c++
4297 #include <fmt/ranges.h>
4298
4299 std::vector<int> v = {1, 2, 3};
4300 fmt::print("{}", v); // prints {1, 2, 3}
4301 ```
4302
4303 Thanks @Remotion.
4304
4305 - Implemented `wchar_t` date and time formatting
4306 (https://github.com/fmtlib/fmt/pull/712):
4307
4308 ```c++
4309 #include <fmt/time.h>
4310
4311 std::time_t t = std::time(nullptr);
4312 auto s = fmt::format(L"The date is {:%Y-%m-%d}.", *std::localtime(&t));
4313 ```
4314
4315 Thanks @DanielaE.
4316
4317 - Provided more wide string overloads
4318 (https://github.com/fmtlib/fmt/pull/724). Thanks @DanielaE.
4319
4320 - Switched from a custom null-terminated string view class to
4321 `string_view` in the format API and provided `fmt::string_view`
4322 which implements a subset of `std::string_view` API for pre-C++17
4323 systems.
4324
4325 - Added support for `std::experimental::string_view`
4326 (https://github.com/fmtlib/fmt/pull/607):
4327
4328 ```c++
4329 #include <fmt/core.h>
4330 #include <experimental/string_view>
4331
4332 fmt::print("{}", std::experimental::string_view("foo"));
4333 ```
4334
4335 Thanks @virgiliofornazin.
4336
4337 - Allowed mixing named and automatic arguments:
4338
4339 ```c++
4340 fmt::format("{} {two}", 1, fmt::arg("two", 2));
4341 ```
4342
4343 - Removed the write API in favor of the [format
4344 API](https://fmt.dev/latest/api.html#format-api) with compile-time
4345 handling of format strings.
4346
4347 - Disallowed formatting of multibyte strings into a wide character
4348 target (https://github.com/fmtlib/fmt/pull/606).
4349
4350 - Improved documentation
4351 (https://github.com/fmtlib/fmt/pull/515,
4352 https://github.com/fmtlib/fmt/issues/614,
4353 https://github.com/fmtlib/fmt/pull/617,
4354 https://github.com/fmtlib/fmt/pull/661,
4355 https://github.com/fmtlib/fmt/pull/680).
4356 Thanks @ibell, @mihaitodor and @johnthagen.
4357
4358 - Implemented more efficient handling of large number of format
4359 arguments.
4360
4361 - Introduced an inline namespace for symbol versioning.
4362
4363 - Added debug postfix `d` to the `fmt` library name
4364 (https://github.com/fmtlib/fmt/issues/636).
4365
4366 - Removed unnecessary `fmt/` prefix in includes
4367 (https://github.com/fmtlib/fmt/pull/397). Thanks @chronoxor.
4368
4369 - Moved `fmt/*.h` to `include/fmt/*.h` to prevent irrelevant files and
4370 directories appearing on the include search paths when fmt is used
4371 as a subproject and moved source files to the `src` directory.
4372
4373 - Added qmake project file `support/fmt.pro`
4374 (https://github.com/fmtlib/fmt/pull/641). Thanks @cowo78.
4375
4376 - Added Gradle build file `support/build.gradle`
4377 (https://github.com/fmtlib/fmt/pull/649). Thanks @luncliff.
4378
4379 - Removed `FMT_CPPFORMAT` CMake option.
4380
4381 - Fixed a name conflict with the macro `CHAR_WIDTH` in glibc
4382 (https://github.com/fmtlib/fmt/pull/616). Thanks @aroig.
4383
4384 - Fixed handling of nested braces in `fmt::join`
4385 (https://github.com/fmtlib/fmt/issues/638).
4386
4387 - Added `SOURCELINK_SUFFIX` for compatibility with Sphinx 1.5
4388 (https://github.com/fmtlib/fmt/pull/497). Thanks @ginggs.
4389
4390 - Added a missing `inline` in the header-only mode
4391 (https://github.com/fmtlib/fmt/pull/626). Thanks @aroig.
4392
4393 - Fixed various compiler warnings
4394 (https://github.com/fmtlib/fmt/pull/640,
4395 https://github.com/fmtlib/fmt/pull/656,
4396 https://github.com/fmtlib/fmt/pull/679,
4397 https://github.com/fmtlib/fmt/pull/681,
4398 https://github.com/fmtlib/fmt/pull/705,
4399 https://github.com/fmtlib/fmt/issues/715,
4400 https://github.com/fmtlib/fmt/pull/717,
4401 https://github.com/fmtlib/fmt/pull/720,
4402 https://github.com/fmtlib/fmt/pull/723,
4403 https://github.com/fmtlib/fmt/pull/726,
4404 https://github.com/fmtlib/fmt/pull/730,
4405 https://github.com/fmtlib/fmt/pull/739).
4406 Thanks @peterbell10, @LarsGullik, @foonathan, @eliaskosunen,
4407 @christianparpart, @DanielaE and @mwinterb.
4408
4409 - Worked around an MSVC bug and fixed several warnings
4410 (https://github.com/fmtlib/fmt/pull/653). Thanks @alabuzhev.
4411
4412 - Worked around GCC bug 67371
4413 (https://github.com/fmtlib/fmt/issues/682).
4414
4415 - Fixed compilation with `-fno-exceptions`
4416 (https://github.com/fmtlib/fmt/pull/655). Thanks @chenxiaolong.
4417
4418 - Made `constexpr remove_prefix` gcc version check tighter
4419 (https://github.com/fmtlib/fmt/issues/648).
4420
4421 - Renamed internal type enum constants to prevent collision with
4422 poorly written C libraries
4423 (https://github.com/fmtlib/fmt/issues/644).
4424
4425 - Added detection of `wostream operator<<`
4426 (https://github.com/fmtlib/fmt/issues/650).
4427
4428 - Fixed compilation on OpenBSD
4429 (https://github.com/fmtlib/fmt/pull/660). Thanks @hubslave.
4430
4431 - Fixed compilation on FreeBSD 12
4432 (https://github.com/fmtlib/fmt/pull/732). Thanks @dankm.
4433
4434 - Fixed compilation when there is a mismatch between `-std` options
4435 between the library and user code
4436 (https://github.com/fmtlib/fmt/issues/664).
4437
4438 - Fixed compilation with GCC 7 and `-std=c++11`
4439 (https://github.com/fmtlib/fmt/issues/734).
4440
4441 - Improved generated binary code on GCC 7 and older
4442 (https://github.com/fmtlib/fmt/issues/668).
4443
4444 - Fixed handling of numeric alignment with no width
4445 (https://github.com/fmtlib/fmt/issues/675).
4446
4447 - Fixed handling of empty strings in UTF8/16 converters
4448 (https://github.com/fmtlib/fmt/pull/676). Thanks @vgalka-sl.
4449
4450 - Fixed formatting of an empty `string_view`
4451 (https://github.com/fmtlib/fmt/issues/689).
4452
4453 - Fixed detection of `string_view` on libc++
4454 (https://github.com/fmtlib/fmt/issues/686).
4455
4456 - Fixed DLL issues (https://github.com/fmtlib/fmt/pull/696).
4457 Thanks @sebkoenig.
4458
4459 - Fixed compile checks for mixing narrow and wide strings
4460 (https://github.com/fmtlib/fmt/issues/690).
4461
4462 - Disabled unsafe implicit conversion to `std::string`
4463 (https://github.com/fmtlib/fmt/issues/729).
4464
4465 - Fixed handling of reused format specs (as in `fmt::join`) for
4466 pointers (https://github.com/fmtlib/fmt/pull/725). Thanks @mwinterb.
4467
4468 - Fixed installation of `fmt/ranges.h`
4469 (https://github.com/fmtlib/fmt/pull/738). Thanks @sv1990.
4470
4471 # 4.1.0 - 2017-12-20
4472
4473 - Added `fmt::to_wstring()` in addition to `fmt::to_string()`
4474 (https://github.com/fmtlib/fmt/pull/559). Thanks @alabuzhev.
4475 - Added support for C++17 `std::string_view`
4476 (https://github.com/fmtlib/fmt/pull/571 and
4477 https://github.com/fmtlib/fmt/pull/578).
4478 Thanks @thelostt and @mwinterb.
4479 - Enabled stream exceptions to catch errors
4480 (https://github.com/fmtlib/fmt/issues/581). Thanks @crusader-mike.
4481 - Allowed formatting of class hierarchies with `fmt::format_arg()`
4482 (https://github.com/fmtlib/fmt/pull/547). Thanks @rollbear.
4483 - Removed limitations on character types
4484 (https://github.com/fmtlib/fmt/pull/563). Thanks @Yelnats321.
4485 - Conditionally enabled use of `std::allocator_traits`
4486 (https://github.com/fmtlib/fmt/pull/583). Thanks @mwinterb.
4487 - Added support for `const` variadic member function emulation with
4488 `FMT_VARIADIC_CONST`
4489 (https://github.com/fmtlib/fmt/pull/591). Thanks @ludekvodicka.
4490 - Various bugfixes: bad overflow check, unsupported implicit type
4491 conversion when determining formatting function, test segfaults
4492 (https://github.com/fmtlib/fmt/issues/551), ill-formed
4493 macros (https://github.com/fmtlib/fmt/pull/542) and
4494 ambiguous overloads
4495 (https://github.com/fmtlib/fmt/issues/580). Thanks @xylosper.
4496 - Prevented warnings on MSVC
4497 (https://github.com/fmtlib/fmt/pull/605,
4498 https://github.com/fmtlib/fmt/pull/602, and
4499 https://github.com/fmtlib/fmt/pull/545), clang
4500 (https://github.com/fmtlib/fmt/pull/582), GCC
4501 (https://github.com/fmtlib/fmt/issues/573), various
4502 conversion warnings (https://github.com/fmtlib/fmt/pull/609,
4503 https://github.com/fmtlib/fmt/pull/567,
4504 https://github.com/fmtlib/fmt/pull/553 and
4505 https://github.com/fmtlib/fmt/pull/553), and added
4506 `override` and `[[noreturn]]`
4507 (https://github.com/fmtlib/fmt/pull/549 and
4508 https://github.com/fmtlib/fmt/issues/555).
4509 Thanks @alabuzhev, @virgiliofornazin, @alexanderbock, @yumetodo, @VaderY,
4510 @jpcima, @thelostt and @Manu343726.
4511 - Improved CMake: Used `GNUInstallDirs` to set installation location
4512 (https://github.com/fmtlib/fmt/pull/610) and fixed warnings
4513 (https://github.com/fmtlib/fmt/pull/536 and
4514 https://github.com/fmtlib/fmt/pull/556).
4515 Thanks @mikecrowe, @evgen231 and @henryiii.
4516
4517 # 4.0.0 - 2017-06-27
4518
4519 - Removed old compatibility headers `cppformat/*.h` and CMake options
4520 (https://github.com/fmtlib/fmt/pull/527). Thanks @maddinat0r.
4521
4522 - Added `string.h` containing `fmt::to_string()` as alternative to
4523 `std::to_string()` as well as other string writer functionality
4524 (https://github.com/fmtlib/fmt/issues/326 and
4525 https://github.com/fmtlib/fmt/pull/441):
4526
4527 ```c++
4528 #include "fmt/string.h"
4529
4530 std::string answer = fmt::to_string(42);
4531 ```
4532
4533 Thanks @glebov-andrey.
4534
4535 - Moved `fmt::printf()` to new `printf.h` header and allowed `%s` as
4536 generic specifier (https://github.com/fmtlib/fmt/pull/453),
4537 made `%.f` more conformant to regular `printf()`
4538 (https://github.com/fmtlib/fmt/pull/490), added custom
4539 writer support (https://github.com/fmtlib/fmt/issues/476)
4540 and implemented missing custom argument formatting
4541 (https://github.com/fmtlib/fmt/pull/339 and
4542 https://github.com/fmtlib/fmt/pull/340):
4543
4544 ```c++
4545 #include "fmt/printf.h"
4546
4547 // %s format specifier can be used with any argument type.
4548 fmt::printf("%s", 42);
4549 ```
4550
4551 Thanks @mojoBrendan, @manylegged and @spacemoose.
4552 See also https://github.com/fmtlib/fmt/issues/360,
4553 https://github.com/fmtlib/fmt/issues/335 and
4554 https://github.com/fmtlib/fmt/issues/331.
4555
4556 - Added `container.h` containing a `BasicContainerWriter` to write to
4557 containers like `std::vector`
4558 (https://github.com/fmtlib/fmt/pull/450). Thanks @polyvertex.
4559
4560 - Added `fmt::join()` function that takes a range and formats its
4561 elements separated by a given string
4562 (https://github.com/fmtlib/fmt/pull/466):
4563
4564 ```c++
4565 #include "fmt/format.h"
4566
4567 std::vector<double> v = {1.2, 3.4, 5.6};
4568 // Prints "(+01.20, +03.40, +05.60)".
4569 fmt::print("({:+06.2f})", fmt::join(v.begin(), v.end(), ", "));
4570 ```
4571
4572 Thanks @olivier80.
4573
4574 - Added support for custom formatting specifications to simplify
4575 customization of built-in formatting
4576 (https://github.com/fmtlib/fmt/pull/444). Thanks @polyvertex.
4577 See also https://github.com/fmtlib/fmt/issues/439.
4578
4579 - Added `fmt::format_system_error()` for error code formatting
4580 (https://github.com/fmtlib/fmt/issues/323 and
4581 https://github.com/fmtlib/fmt/pull/526). Thanks @maddinat0r.
4582
4583 - Added thread-safe `fmt::localtime()` and `fmt::gmtime()` as
4584 replacement for the standard version to `time.h`
4585 (https://github.com/fmtlib/fmt/pull/396). Thanks @codicodi.
4586
4587 - Internal improvements to `NamedArg` and `ArgLists`
4588 (https://github.com/fmtlib/fmt/pull/389 and
4589 https://github.com/fmtlib/fmt/pull/390). Thanks @chronoxor.
4590
4591 - Fixed crash due to bug in `FormatBuf`
4592 (https://github.com/fmtlib/fmt/pull/493). Thanks @effzeh. See also
4593 https://github.com/fmtlib/fmt/issues/480 and
4594 https://github.com/fmtlib/fmt/issues/491.
4595
4596 - Fixed handling of wide strings in `fmt::StringWriter`.
4597
4598 - Improved compiler error messages
4599 (https://github.com/fmtlib/fmt/issues/357).
4600
4601 - Fixed various warnings and issues with various compilers
4602 (https://github.com/fmtlib/fmt/pull/494,
4603 https://github.com/fmtlib/fmt/pull/499,
4604 https://github.com/fmtlib/fmt/pull/483,
4605 https://github.com/fmtlib/fmt/pull/485,
4606 https://github.com/fmtlib/fmt/pull/482,
4607 https://github.com/fmtlib/fmt/pull/475,
4608 https://github.com/fmtlib/fmt/pull/473 and
4609 https://github.com/fmtlib/fmt/pull/414).
4610 Thanks @chronoxor, @zhaohuaxishi, @pkestene, @dschmidt and @0x414c.
4611
4612 - Improved CMake: targets are now namespaced
4613 (https://github.com/fmtlib/fmt/pull/511 and
4614 https://github.com/fmtlib/fmt/pull/513), supported
4615 header-only `printf.h`
4616 (https://github.com/fmtlib/fmt/pull/354), fixed issue with
4617 minimal supported library subset
4618 (https://github.com/fmtlib/fmt/issues/418,
4619 https://github.com/fmtlib/fmt/pull/419 and
4620 https://github.com/fmtlib/fmt/pull/420).
4621 Thanks @bjoernthiel, @niosHD, @LogicalKnight and @alabuzhev.
4622
4623 - Improved documentation (https://github.com/fmtlib/fmt/pull/393).
4624 Thanks @pwm1234.
4625
4626 # 3.0.2 - 2017-06-14
4627
4628 - Added `FMT_VERSION` macro
4629 (https://github.com/fmtlib/fmt/issues/411).
4630 - Used `FMT_NULL` instead of literal `0`
4631 (https://github.com/fmtlib/fmt/pull/409). Thanks @alabuzhev.
4632 - Added extern templates for `format_float`
4633 (https://github.com/fmtlib/fmt/issues/413).
4634 - Fixed implicit conversion issue
4635 (https://github.com/fmtlib/fmt/issues/507).
4636 - Fixed signbit detection
4637 (https://github.com/fmtlib/fmt/issues/423).
4638 - Fixed naming collision
4639 (https://github.com/fmtlib/fmt/issues/425).
4640 - Fixed missing intrinsic for C++/CLI
4641 (https://github.com/fmtlib/fmt/pull/457). Thanks @calumr.
4642 - Fixed Android detection
4643 (https://github.com/fmtlib/fmt/pull/458). Thanks @Gachapen.
4644 - Use lean `windows.h` if not in header-only mode
4645 (https://github.com/fmtlib/fmt/pull/503). Thanks @Quentin01.
4646 - Fixed issue with CMake exporting C++11 flag
4647 (https://github.com/fmtlib/fmt/pull/455). Thanks @EricWF.
4648 - Fixed issue with nvcc and MSVC compiler bug and MinGW
4649 (https://github.com/fmtlib/fmt/issues/505).
4650 - Fixed DLL issues (https://github.com/fmtlib/fmt/pull/469 and
4651 https://github.com/fmtlib/fmt/pull/502).
4652 Thanks @richardeakin and @AndreasSchoenle.
4653 - Fixed test compilation under FreeBSD
4654 (https://github.com/fmtlib/fmt/issues/433).
4655 - Fixed various warnings
4656 (https://github.com/fmtlib/fmt/pull/403,
4657 https://github.com/fmtlib/fmt/pull/410 and
4658 https://github.com/fmtlib/fmt/pull/510).
4659 Thanks @Lecetem, @chenhayat and @trozen.
4660 - Worked around a broken `__builtin_clz` in clang with MS codegen
4661 (https://github.com/fmtlib/fmt/issues/519).
4662 - Removed redundant include
4663 (https://github.com/fmtlib/fmt/issues/479).
4664 - Fixed documentation issues.
4665
4666 # 3.0.1 - 2016-11-01
4667
4668 - Fixed handling of thousands separator
4669 (https://github.com/fmtlib/fmt/issues/353).
4670 - Fixed handling of `unsigned char` strings
4671 (https://github.com/fmtlib/fmt/issues/373).
4672 - Corrected buffer growth when formatting time
4673 (https://github.com/fmtlib/fmt/issues/367).
4674 - Removed warnings under MSVC and clang
4675 (https://github.com/fmtlib/fmt/issues/318,
4676 https://github.com/fmtlib/fmt/issues/250, also merged
4677 https://github.com/fmtlib/fmt/pull/385 and
4678 https://github.com/fmtlib/fmt/pull/361).
4679 Thanks @jcelerier and @nmoehrle.
4680 - Fixed compilation issues under Android
4681 (https://github.com/fmtlib/fmt/pull/327,
4682 https://github.com/fmtlib/fmt/issues/345 and
4683 https://github.com/fmtlib/fmt/pull/381), FreeBSD
4684 (https://github.com/fmtlib/fmt/pull/358), Cygwin
4685 (https://github.com/fmtlib/fmt/issues/388), MinGW
4686 (https://github.com/fmtlib/fmt/issues/355) as well as other
4687 issues (https://github.com/fmtlib/fmt/issues/350,
4688 https://github.com/fmtlib/fmt/issues/355,
4689 https://github.com/fmtlib/fmt/pull/348,
4690 https://github.com/fmtlib/fmt/pull/402,
4691 https://github.com/fmtlib/fmt/pull/405).
4692 Thanks @dpantele, @hghwng, @arvedarved, @LogicalKnight and @JanHellwig.
4693 - Fixed some documentation issues and extended specification
4694 (https://github.com/fmtlib/fmt/issues/320,
4695 https://github.com/fmtlib/fmt/pull/333,
4696 https://github.com/fmtlib/fmt/issues/347,
4697 https://github.com/fmtlib/fmt/pull/362). Thanks @smellman.
4698
4699 # 3.0.0 - 2016-05-07
4700
4701 - The project has been renamed from C++ Format (cppformat) to fmt for
4702 consistency with the used namespace and macro prefix
4703 (https://github.com/fmtlib/fmt/issues/307). Library headers
4704 are now located in the `fmt` directory:
4705
4706 ```c++
4707 #include "fmt/format.h"
4708 ```
4709
4710 Including `format.h` from the `cppformat` directory is deprecated
4711 but works via a proxy header which will be removed in the next major
4712 version.
4713
4714 The documentation is now available at <https://fmt.dev>.
4715
4716 - Added support for
4717 [strftime](http://en.cppreference.com/w/cpp/chrono/c/strftime)-like
4718 [date and time
4719 formatting](https://fmt.dev/3.0.0/api.html#date-and-time-formatting)
4720 (https://github.com/fmtlib/fmt/issues/283):
4721
4722 ```c++
4723 #include "fmt/time.h"
4724
4725 std::time_t t = std::time(nullptr);
4726 // Prints "The date is 2016-04-29." (with the current date)
4727 fmt::print("The date is {:%Y-%m-%d}.", *std::localtime(&t));
4728 ```
4729
4730 - `std::ostream` support including formatting of user-defined types
4731 that provide overloaded `operator<<` has been moved to
4732 `fmt/ostream.h`:
4733
4734 ```c++
4735 #include "fmt/ostream.h"
4736
4737 class Date {
4738 int year_, month_, day_;
4739 public:
4740 Date(int year, int month, int day) : year_(year), month_(month), day_(day) {}
4741
4742 friend std::ostream &operator<<(std::ostream &os, const Date &d) {
4743 return os << d.year_ << '-' << d.month_ << '-' << d.day_;
4744 }
4745 };
4746
4747 std::string s = fmt::format("The date is {}", Date(2012, 12, 9));
4748 // s == "The date is 2012-12-9"
4749 ```
4750
4751 - Added support for [custom argument
4752 formatters](https://fmt.dev/3.0.0/api.html#argument-formatters)
4753 (https://github.com/fmtlib/fmt/issues/235).
4754
4755 - Added support for locale-specific integer formatting with the `n`
4756 specifier (https://github.com/fmtlib/fmt/issues/305):
4757
4758 ```c++
4759 std::setlocale(LC_ALL, "en_US.utf8");
4760 fmt::print("cppformat: {:n}\n", 1234567); // prints 1,234,567
4761 ```
4762
4763 - Sign is now preserved when formatting an integer with an incorrect
4764 `printf` format specifier
4765 (https://github.com/fmtlib/fmt/issues/265):
4766
4767 ```c++
4768 fmt::printf("%lld", -42); // prints -42
4769 ```
4770
4771 Note that it would be an undefined behavior in `std::printf`.
4772
4773 - Length modifiers such as `ll` are now optional in printf formatting
4774 functions and the correct type is determined automatically
4775 (https://github.com/fmtlib/fmt/issues/255):
4776
4777 ```c++
4778 fmt::printf("%d", std::numeric_limits<long long>::max());
4779 ```
4780
4781 Note that it would be an undefined behavior in `std::printf`.
4782
4783 - Added initial support for custom formatters
4784 (https://github.com/fmtlib/fmt/issues/231).
4785
4786 - Fixed detection of user-defined literal support on Intel C++
4787 compiler (https://github.com/fmtlib/fmt/issues/311,
4788 https://github.com/fmtlib/fmt/pull/312).
4789 Thanks @dean0x7d and @speth.
4790
4791 - Reduced compile time
4792 (https://github.com/fmtlib/fmt/pull/243,
4793 https://github.com/fmtlib/fmt/pull/249,
4794 https://github.com/fmtlib/fmt/issues/317):
4795
4796 ![](https://cloud.githubusercontent.com/assets/4831417/11614060/b9e826d2-9c36-11e5-8666-d4131bf503ef.png)
4797
4798 ![](https://cloud.githubusercontent.com/assets/4831417/11614080/6ac903cc-9c37-11e5-8165-26df6efae364.png)
4799
4800 Thanks @dean0x7d.
4801
4802 - Compile test fixes (https://github.com/fmtlib/fmt/pull/313).
4803 Thanks @dean0x7d.
4804
4805 - Documentation fixes (https://github.com/fmtlib/fmt/pull/239,
4806 https://github.com/fmtlib/fmt/issues/248,
4807 https://github.com/fmtlib/fmt/issues/252,
4808 https://github.com/fmtlib/fmt/pull/258,
4809 https://github.com/fmtlib/fmt/issues/260,
4810 https://github.com/fmtlib/fmt/issues/301,
4811 https://github.com/fmtlib/fmt/pull/309).
4812 Thanks @ReadmeCritic @Gachapen and @jwilk.
4813
4814 - Fixed compiler and sanitizer warnings
4815 (https://github.com/fmtlib/fmt/issues/244,
4816 https://github.com/fmtlib/fmt/pull/256,
4817 https://github.com/fmtlib/fmt/pull/259,
4818 https://github.com/fmtlib/fmt/issues/263,
4819 https://github.com/fmtlib/fmt/issues/274,
4820 https://github.com/fmtlib/fmt/pull/277,
4821 https://github.com/fmtlib/fmt/pull/286,
4822 https://github.com/fmtlib/fmt/issues/291,
4823 https://github.com/fmtlib/fmt/issues/296,
4824 https://github.com/fmtlib/fmt/issues/308).
4825 Thanks @mwinterb, @pweiskircher and @Naios.
4826
4827 - Improved compatibility with Windows Store apps
4828 (https://github.com/fmtlib/fmt/issues/280,
4829 https://github.com/fmtlib/fmt/pull/285) Thanks @mwinterb.
4830
4831 - Added tests of compatibility with older C++ standards
4832 (https://github.com/fmtlib/fmt/pull/273). Thanks @niosHD.
4833
4834 - Fixed Android build
4835 (https://github.com/fmtlib/fmt/pull/271). Thanks @newnon.
4836
4837 - Changed `ArgMap` to be backed by a vector instead of a map.
4838 (https://github.com/fmtlib/fmt/issues/261,
4839 https://github.com/fmtlib/fmt/pull/262). Thanks @mwinterb.
4840
4841 - Added `fprintf` overload that writes to a `std::ostream`
4842 (https://github.com/fmtlib/fmt/pull/251).
4843 Thanks @nickhutchinson.
4844
4845 - Export symbols when building a Windows DLL
4846 (https://github.com/fmtlib/fmt/pull/245).
4847 Thanks @macdems.
4848
4849 - Fixed compilation on Cygwin
4850 (https://github.com/fmtlib/fmt/issues/304).
4851
4852 - Implemented a workaround for a bug in Apple LLVM version 4.2 of
4853 clang (https://github.com/fmtlib/fmt/issues/276).
4854
4855 - Implemented a workaround for Google Test bug
4856 https://github.com/google/googletest/issues/705 on gcc 6
4857 (https://github.com/fmtlib/fmt/issues/268). Thanks @octoploid.
4858
4859 - Removed Biicode support because the latter has been discontinued.
4860
4861 # 2.1.1 - 2016-04-11
4862
4863 - The install location for generated CMake files is now configurable
4864 via the `FMT_CMAKE_DIR` CMake variable
4865 (https://github.com/fmtlib/fmt/pull/299). Thanks @niosHD.
4866 - Documentation fixes
4867 (https://github.com/fmtlib/fmt/issues/252).
4868
4869 # 2.1.0 - 2016-03-21
4870
4871 - Project layout and build system improvements
4872 (https://github.com/fmtlib/fmt/pull/267):
4873
4874 - The code have been moved to the `cppformat` directory. Including
4875 `format.h` from the top-level directory is deprecated but works
4876 via a proxy header which will be removed in the next major
4877 version.
4878 - C++ Format CMake targets now have proper interface definitions.
4879 - Installed version of the library now supports the header-only
4880 configuration.
4881 - Targets `doc`, `install`, and `test` are now disabled if C++
4882 Format is included as a CMake subproject. They can be enabled by
4883 setting `FMT_DOC`, `FMT_INSTALL`, and `FMT_TEST` in the parent
4884 project.
4885
4886 Thanks @niosHD.
4887
4888 # 2.0.1 - 2016-03-13
4889
4890 - Improved CMake find and package support
4891 (https://github.com/fmtlib/fmt/issues/264). Thanks @niosHD.
4892 - Fix compile error with Android NDK and mingw32
4893 (https://github.com/fmtlib/fmt/issues/241). Thanks @Gachapen.
4894 - Documentation fixes
4895 (https://github.com/fmtlib/fmt/issues/248,
4896 https://github.com/fmtlib/fmt/issues/260).
4897
4898 # 2.0.0 - 2015-12-01
4899
4900 ## General
4901
4902 - \[Breaking\] Named arguments
4903 (https://github.com/fmtlib/fmt/pull/169,
4904 https://github.com/fmtlib/fmt/pull/173,
4905 https://github.com/fmtlib/fmt/pull/174):
4906
4907 ```c++
4908 fmt::print("The answer is {answer}.", fmt::arg("answer", 42));
4909 ```
4910
4911 Thanks @jamboree.
4912
4913 - \[Experimental\] User-defined literals for format and named
4914 arguments (https://github.com/fmtlib/fmt/pull/204,
4915 https://github.com/fmtlib/fmt/pull/206,
4916 https://github.com/fmtlib/fmt/pull/207):
4917
4918 ```c++
4919 using namespace fmt::literals;
4920 fmt::print("The answer is {answer}.", "answer"_a=42);
4921 ```
4922
4923 Thanks @dean0x7d.
4924
4925 - \[Breaking\] Formatting of more than 16 arguments is now supported
4926 when using variadic templates
4927 (https://github.com/fmtlib/fmt/issues/141). Thanks @Shauren.
4928
4929 - Runtime width specification
4930 (https://github.com/fmtlib/fmt/pull/168):
4931
4932 ```c++
4933 fmt::format("{0:{1}}", 42, 5); // gives " 42"
4934 ```
4935
4936 Thanks @jamboree.
4937
4938 - \[Breaking\] Enums are now formatted with an overloaded
4939 `std::ostream` insertion operator (`operator<<`) if available
4940 (https://github.com/fmtlib/fmt/issues/232).
4941
4942 - \[Breaking\] Changed default `bool` format to textual, \"true\" or
4943 \"false\" (https://github.com/fmtlib/fmt/issues/170):
4944
4945 ```c++
4946 fmt::print("{}", true); // prints "true"
4947 ```
4948
4949 To print `bool` as a number use numeric format specifier such as
4950 `d`:
4951
4952 ```c++
4953 fmt::print("{:d}", true); // prints "1"
4954 ```
4955
4956 - `fmt::printf` and `fmt::sprintf` now support formatting of `bool`
4957 with the `%s` specifier giving textual output, \"true\" or \"false\"
4958 (https://github.com/fmtlib/fmt/pull/223):
4959
4960 ```c++
4961 fmt::printf("%s", true); // prints "true"
4962 ```
4963
4964 Thanks @LarsGullik.
4965
4966 - \[Breaking\] `signed char` and `unsigned char` are now formatted as
4967 integers by default
4968 (https://github.com/fmtlib/fmt/pull/217).
4969
4970 - \[Breaking\] Pointers to C strings can now be formatted with the `p`
4971 specifier (https://github.com/fmtlib/fmt/pull/223):
4972
4973 ```c++
4974 fmt::print("{:p}", "test"); // prints pointer value
4975 ```
4976
4977 Thanks @LarsGullik.
4978
4979 - \[Breaking\] `fmt::printf` and `fmt::sprintf` now print null
4980 pointers as `(nil)` and null strings as `(null)` for consistency
4981 with glibc (https://github.com/fmtlib/fmt/pull/226).
4982 Thanks @LarsGullik.
4983
4984 - \[Breaking\] `fmt::(s)printf` now supports formatting of objects of
4985 user-defined types that provide an overloaded `std::ostream`
4986 insertion operator (`operator<<`)
4987 (https://github.com/fmtlib/fmt/issues/201):
4988
4989 ```c++
4990 fmt::printf("The date is %s", Date(2012, 12, 9));
4991 ```
4992
4993 - \[Breaking\] The `Buffer` template is now part of the public API and
4994 can be used to implement custom memory buffers
4995 (https://github.com/fmtlib/fmt/issues/140). Thanks @polyvertex.
4996
4997 - \[Breaking\] Improved compatibility between `BasicStringRef` and
4998 [std::experimental::basic_string_view](
4999 http://en.cppreference.com/w/cpp/experimental/basic_string_view)
5000 (https://github.com/fmtlib/fmt/issues/100,
5001 https://github.com/fmtlib/fmt/issues/159,
5002 https://github.com/fmtlib/fmt/issues/183):
5003
5004 - Comparison operators now compare string content, not pointers
5005 - `BasicStringRef::c_str` replaced by `BasicStringRef::data`
5006 - `BasicStringRef` is no longer assumed to be null-terminated
5007
5008 References to null-terminated strings are now represented by a new
5009 class, `BasicCStringRef`.
5010
5011 - Dependency on pthreads introduced by Google Test is now optional
5012 (https://github.com/fmtlib/fmt/issues/185).
5013
5014 - New CMake options `FMT_DOC`, `FMT_INSTALL` and `FMT_TEST` to control
5015 generation of `doc`, `install` and `test` targets respectively, on
5016 by default (https://github.com/fmtlib/fmt/issues/197,
5017 https://github.com/fmtlib/fmt/issues/198,
5018 https://github.com/fmtlib/fmt/issues/200). Thanks @maddinat0r.
5019
5020 - `noexcept` is now used when compiling with MSVC2015
5021 (https://github.com/fmtlib/fmt/pull/215). Thanks @dmkrepo.
5022
5023 - Added an option to disable use of `windows.h` when
5024 `FMT_USE_WINDOWS_H` is defined as 0 before including `format.h`
5025 (https://github.com/fmtlib/fmt/issues/171). Thanks @alfps.
5026
5027 - \[Breaking\] `windows.h` is now included with `NOMINMAX` unless
5028 `FMT_WIN_MINMAX` is defined. This is done to prevent breaking code
5029 using `std::min` and `std::max` and only affects the header-only
5030 configuration (https://github.com/fmtlib/fmt/issues/152,
5031 https://github.com/fmtlib/fmt/pull/153,
5032 https://github.com/fmtlib/fmt/pull/154). Thanks @DevO2012.
5033
5034 - Improved support for custom character types
5035 (https://github.com/fmtlib/fmt/issues/171). Thanks @alfps.
5036
5037 - Added an option to disable use of IOStreams when `FMT_USE_IOSTREAMS`
5038 is defined as 0 before including `format.h`
5039 (https://github.com/fmtlib/fmt/issues/205,
5040 https://github.com/fmtlib/fmt/pull/208). Thanks @JodiTheTigger.
5041
5042 - Improved detection of `isnan`, `isinf` and `signbit`.
5043
5044 ## Optimization
5045
5046 - Made formatting of user-defined types more efficient with a custom
5047 stream buffer (https://github.com/fmtlib/fmt/issues/92,
5048 https://github.com/fmtlib/fmt/pull/230). Thanks @NotImplemented.
5049 - Further improved performance of `fmt::Writer` on integer formatting
5050 and fixed a minor regression. Now it is \~7% faster than
5051 `karma::generate` on Karma\'s benchmark
5052 (https://github.com/fmtlib/fmt/issues/186).
5053 - \[Breaking\] Reduced [compiled code
5054 size](https://github.com/fmtlib/fmt#compile-time-and-code-bloat)
5055 (https://github.com/fmtlib/fmt/issues/143,
5056 https://github.com/fmtlib/fmt/pull/149).
5057
5058 ## Distribution
5059
5060 - \[Breaking\] Headers are now installed in
5061 `${CMAKE_INSTALL_PREFIX}/include/cppformat`
5062 (https://github.com/fmtlib/fmt/issues/178). Thanks @jackyf.
5063
5064 - \[Breaking\] Changed the library name from `format` to `cppformat`
5065 for consistency with the project name and to avoid potential
5066 conflicts (https://github.com/fmtlib/fmt/issues/178).
5067 Thanks @jackyf.
5068
5069 - C++ Format is now available in [Debian](https://www.debian.org/)
5070 GNU/Linux
5071 ([stretch](https://packages.debian.org/source/stretch/cppformat),
5072 [sid](https://packages.debian.org/source/sid/cppformat)) and derived
5073 distributions such as
5074 [Ubuntu](https://launchpad.net/ubuntu/+source/cppformat) 15.10 and
5075 later (https://github.com/fmtlib/fmt/issues/155):
5076
5077 $ sudo apt-get install libcppformat1-dev
5078
5079 Thanks @jackyf.
5080
5081 - [Packages for Fedora and
5082 RHEL](https://admin.fedoraproject.org/pkgdb/package/cppformat/) are
5083 now available. Thanks Dave Johansen.
5084
5085 - C++ Format can now be installed via [Homebrew](http://brew.sh/) on
5086 OS X (https://github.com/fmtlib/fmt/issues/157):
5087
5088 $ brew install cppformat
5089
5090 Thanks @ortho and Anatoliy Bulukin.
5091
5092 ## Documentation
5093
5094 - Migrated from ReadTheDocs to GitHub Pages for better responsiveness
5095 and reliability (https://github.com/fmtlib/fmt/issues/128).
5096 New documentation address is <http://cppformat.github.io/>.
5097 - Added [Building thedocumentation](
5098 https://fmt.dev/2.0.0/usage.html#building-the-documentation)
5099 section to the documentation.
5100 - Documentation build script is now compatible with Python 3 and newer
5101 pip versions. (https://github.com/fmtlib/fmt/pull/189,
5102 https://github.com/fmtlib/fmt/issues/209).
5103 Thanks @JodiTheTigger and @xentec.
5104 - Documentation fixes and improvements
5105 (https://github.com/fmtlib/fmt/issues/36,
5106 https://github.com/fmtlib/fmt/issues/75,
5107 https://github.com/fmtlib/fmt/issues/125,
5108 https://github.com/fmtlib/fmt/pull/160,
5109 https://github.com/fmtlib/fmt/pull/161,
5110 https://github.com/fmtlib/fmt/issues/162,
5111 https://github.com/fmtlib/fmt/issues/165,
5112 https://github.com/fmtlib/fmt/issues/210).
5113 Thanks @syohex.
5114 - Fixed out-of-tree documentation build
5115 (https://github.com/fmtlib/fmt/issues/177). Thanks @jackyf.
5116
5117 ## Fixes
5118
5119 - Fixed `initializer_list` detection
5120 (https://github.com/fmtlib/fmt/issues/136). Thanks @Gachapen.
5121
5122 - \[Breaking\] Fixed formatting of enums with numeric format
5123 specifiers in `fmt::(s)printf`
5124 (https://github.com/fmtlib/fmt/issues/131,
5125 https://github.com/fmtlib/fmt/issues/139):
5126
5127 ```c++
5128 enum { ANSWER = 42 };
5129 fmt::printf("%d", ANSWER);
5130 ```
5131
5132 Thanks @Naios.
5133
5134 - Improved compatibility with old versions of MinGW
5135 (https://github.com/fmtlib/fmt/issues/129,
5136 https://github.com/fmtlib/fmt/pull/130,
5137 https://github.com/fmtlib/fmt/issues/132). Thanks @cstamford.
5138
5139 - Fixed a compile error on MSVC with disabled exceptions
5140 (https://github.com/fmtlib/fmt/issues/144).
5141
5142 - Added a workaround for broken implementation of variadic templates
5143 in MSVC2012 (https://github.com/fmtlib/fmt/issues/148).
5144
5145 - Placed the anonymous namespace within `fmt` namespace for the
5146 header-only configuration (https://github.com/fmtlib/fmt/issues/171).
5147 Thanks @alfps.
5148
5149 - Fixed issues reported by Coverity Scan
5150 (https://github.com/fmtlib/fmt/issues/187,
5151 https://github.com/fmtlib/fmt/issues/192).
5152
5153 - Implemented a workaround for a name lookup bug in MSVC2010
5154 (https://github.com/fmtlib/fmt/issues/188).
5155
5156 - Fixed compiler warnings
5157 (https://github.com/fmtlib/fmt/issues/95,
5158 https://github.com/fmtlib/fmt/issues/96,
5159 https://github.com/fmtlib/fmt/pull/114,
5160 https://github.com/fmtlib/fmt/issues/135,
5161 https://github.com/fmtlib/fmt/issues/142,
5162 https://github.com/fmtlib/fmt/issues/145,
5163 https://github.com/fmtlib/fmt/issues/146,
5164 https://github.com/fmtlib/fmt/issues/158,
5165 https://github.com/fmtlib/fmt/issues/163,
5166 https://github.com/fmtlib/fmt/issues/175,
5167 https://github.com/fmtlib/fmt/issues/190,
5168 https://github.com/fmtlib/fmt/pull/191,
5169 https://github.com/fmtlib/fmt/issues/194,
5170 https://github.com/fmtlib/fmt/pull/196,
5171 https://github.com/fmtlib/fmt/issues/216,
5172 https://github.com/fmtlib/fmt/pull/218,
5173 https://github.com/fmtlib/fmt/pull/220,
5174 https://github.com/fmtlib/fmt/pull/229,
5175 https://github.com/fmtlib/fmt/issues/233,
5176 https://github.com/fmtlib/fmt/issues/234,
5177 https://github.com/fmtlib/fmt/pull/236,
5178 https://github.com/fmtlib/fmt/issues/281,
5179 https://github.com/fmtlib/fmt/issues/289).
5180 Thanks @seanmiddleditch, @dixlorenz, @CarterLi, @Naios, @fmatthew5876,
5181 @LevskiWeng, @rpopescu, @gabime, @cubicool, @jkflying, @LogicalKnight,
5182 @inguin and @Jopie64.
5183
5184 - Fixed portability issues (mostly causing test failures) on ARM,
5185 ppc64, ppc64le, s390x and SunOS 5.11 i386
5186 (https://github.com/fmtlib/fmt/issues/138,
5187 https://github.com/fmtlib/fmt/issues/179,
5188 https://github.com/fmtlib/fmt/issues/180,
5189 https://github.com/fmtlib/fmt/issues/202,
5190 https://github.com/fmtlib/fmt/issues/225, [Red Hat Bugzilla
5191 Bug 1260297](https://bugzilla.redhat.com/show_bug.cgi?id=1260297)).
5192 Thanks @Naios, @jackyf and Dave Johansen.
5193
5194 - Fixed a name conflict with macro `free` defined in `crtdbg.h` when
5195 `_CRTDBG_MAP_ALLOC` is set (https://github.com/fmtlib/fmt/issues/211).
5196
5197 - Fixed shared library build on OS X
5198 (https://github.com/fmtlib/fmt/pull/212). Thanks @dean0x7d.
5199
5200 - Fixed an overload conflict on MSVC when `/Zc:wchar_t-` option is
5201 specified (https://github.com/fmtlib/fmt/pull/214).
5202 Thanks @slavanap.
5203
5204 - Improved compatibility with MSVC 2008
5205 (https://github.com/fmtlib/fmt/pull/236). Thanks @Jopie64.
5206
5207 - Improved compatibility with bcc32
5208 (https://github.com/fmtlib/fmt/issues/227).
5209
5210 - Fixed `static_assert` detection on Clang
5211 (https://github.com/fmtlib/fmt/pull/228). Thanks @dean0x7d.
5212
5213 # 1.1.0 - 2015-03-06
5214
5215 - Added `BasicArrayWriter`, a class template that provides operations
5216 for formatting and writing data into a fixed-size array
5217 (https://github.com/fmtlib/fmt/issues/105 and
5218 https://github.com/fmtlib/fmt/issues/122):
5219
5220 ```c++
5221 char buffer[100];
5222 fmt::ArrayWriter w(buffer);
5223 w.write("The answer is {}", 42);
5224 ```
5225
5226 - Added [0 A.D.](http://play0ad.com/) and [PenUltima Online
5227 (POL)](http://www.polserver.com/) to the list of notable projects
5228 using C++ Format.
5229
5230 - C++ Format now uses MSVC intrinsics for better formatting performance
5231 (https://github.com/fmtlib/fmt/pull/115,
5232 https://github.com/fmtlib/fmt/pull/116,
5233 https://github.com/fmtlib/fmt/pull/118 and
5234 https://github.com/fmtlib/fmt/pull/121). Previously these
5235 optimizations where only used on GCC and Clang.
5236 Thanks @CarterLi and @objectx.
5237
5238 - CMake install target
5239 (https://github.com/fmtlib/fmt/pull/119). Thanks @TrentHouliston.
5240
5241 You can now install C++ Format with `make install` command.
5242
5243 - Improved [Biicode](http://www.biicode.com/) support
5244 (https://github.com/fmtlib/fmt/pull/98 and
5245 https://github.com/fmtlib/fmt/pull/104).
5246 Thanks @MariadeAnton and @franramirez688.
5247
5248 - Improved support for building with [Android NDK](
5249 https://developer.android.com/tools/sdk/ndk/index.html)
5250 (https://github.com/fmtlib/fmt/pull/107). Thanks @newnon.
5251
5252 The [android-ndk-example](https://github.com/fmtlib/android-ndk-example)
5253 repository provides and example of using C++ Format with Android NDK:
5254
5255 ![](https://raw.githubusercontent.com/fmtlib/android-ndk-example/master/screenshot.png)
5256
5257 - Improved documentation of `SystemError` and `WindowsError`
5258 (https://github.com/fmtlib/fmt/issues/54).
5259
5260 - Various code improvements
5261 (https://github.com/fmtlib/fmt/pull/110,
5262 https://github.com/fmtlib/fmt/pull/111
5263 https://github.com/fmtlib/fmt/pull/112). Thanks @CarterLi.
5264
5265 - Improved compile-time errors when formatting wide into narrow
5266 strings (https://github.com/fmtlib/fmt/issues/117).
5267
5268 - Fixed `BasicWriter::write` without formatting arguments when C++11
5269 support is disabled
5270 (https://github.com/fmtlib/fmt/issues/109).
5271
5272 - Fixed header-only build on OS X with GCC 4.9
5273 (https://github.com/fmtlib/fmt/issues/124).
5274
5275 - Fixed packaging issues (https://github.com/fmtlib/fmt/issues/94).
5276
5277 - Added [changelog](https://github.com/fmtlib/fmt/blob/master/ChangeLog.md)
5278 (https://github.com/fmtlib/fmt/issues/103).
5279
5280 # 1.0.0 - 2015-02-05
5281
5282 - Add support for a header-only configuration when `FMT_HEADER_ONLY`
5283 is defined before including `format.h`:
5284
5285 ```c++
5286 #define FMT_HEADER_ONLY
5287 #include "format.h"
5288 ```
5289
5290 - Compute string length in the constructor of `BasicStringRef` instead
5291 of the `size` method
5292 (https://github.com/fmtlib/fmt/issues/79). This eliminates
5293 size computation for string literals on reasonable optimizing
5294 compilers.
5295
5296 - Fix formatting of types with overloaded `operator <<` for
5297 `std::wostream` (https://github.com/fmtlib/fmt/issues/86):
5298
5299 ```c++
5300 fmt::format(L"The date is {0}", Date(2012, 12, 9));
5301 ```
5302
5303 - Fix linkage of tests on Arch Linux
5304 (https://github.com/fmtlib/fmt/issues/89).
5305
5306 - Allow precision specifier for non-float arguments
5307 (https://github.com/fmtlib/fmt/issues/90):
5308
5309 ```c++
5310 fmt::print("{:.3}\n", "Carpet"); // prints "Car"
5311 ```
5312
5313 - Fix build on Android NDK (https://github.com/fmtlib/fmt/issues/93).
5314
5315 - Improvements to documentation build procedure.
5316
5317 - Remove `FMT_SHARED` CMake variable in favor of standard [BUILD_SHARED_LIBS](
5318 http://www.cmake.org/cmake/help/v3.0/variable/BUILD_SHARED_LIBS.html).
5319
5320 - Fix error handling in `fmt::fprintf`.
5321
5322 - Fix a number of warnings.
5323
5324 # 0.12.0 - 2014-10-25
5325
5326 - \[Breaking\] Improved separation between formatting and buffer
5327 management. `Writer` is now a base class that cannot be instantiated
5328 directly. The new `MemoryWriter` class implements the default buffer
5329 management with small allocations done on stack. So `fmt::Writer`
5330 should be replaced with `fmt::MemoryWriter` in variable
5331 declarations.
5332
5333 Old code:
5334
5335 ```c++
5336 fmt::Writer w;
5337 ```
5338
5339 New code:
5340
5341 ```c++
5342 fmt::MemoryWriter w;
5343 ```
5344
5345 If you pass `fmt::Writer` by reference, you can continue to do so:
5346
5347 ```c++
5348 void f(fmt::Writer &w);
5349 ```
5350
5351 This doesn\'t affect the formatting API.
5352
5353 - Support for custom memory allocators
5354 (https://github.com/fmtlib/fmt/issues/69)
5355
5356 - Formatting functions now accept [signed char]{.title-ref} and
5357 [unsigned char]{.title-ref} strings as arguments
5358 (https://github.com/fmtlib/fmt/issues/73):
5359
5360 ```c++
5361 auto s = format("GLSL version: {}", glGetString(GL_VERSION));
5362 ```
5363
5364 - Reduced code bloat. According to the new [benchmark
5365 results](https://github.com/fmtlib/fmt#compile-time-and-code-bloat),
5366 cppformat is close to `printf` and by the order of magnitude better
5367 than Boost Format in terms of compiled code size.
5368
5369 - Improved appearance of the documentation on mobile by using the
5370 [Sphinx Bootstrap
5371 theme](http://ryan-roemer.github.io/sphinx-bootstrap-theme/):
5372
5373 | Old | New |
5374 | --- | --- |
5375 | ![](https://cloud.githubusercontent.com/assets/576385/4792130/cd256436-5de3-11e4-9a62-c077d0c2b003.png) | ![](https://cloud.githubusercontent.com/assets/576385/4792131/cd29896c-5de3-11e4-8f59-cac952942bf0.png) |
5376
5377 # 0.11.0 - 2014-08-21
5378
5379 - Safe printf implementation with a POSIX extension for positional
5380 arguments:
5381
5382 ```c++
5383 fmt::printf("Elapsed time: %.2f seconds", 1.23);
5384 fmt::printf("%1$s, %3$d %2$s", weekday, month, day);
5385 ```
5386
5387 - Arguments of `char` type can now be formatted as integers (Issue
5388 https://github.com/fmtlib/fmt/issues/55):
5389
5390 ```c++
5391 fmt::format("0x{0:02X}", 'a');
5392 ```
5393
5394 - Deprecated parts of the API removed.
5395
5396 - The library is now built and tested on MinGW with Appveyor in
5397 addition to existing test platforms Linux/GCC, OS X/Clang,
5398 Windows/MSVC.
5399
5400 # 0.10.0 - 2014-07-01
5401
5402 **Improved API**
5403
5404 - All formatting methods are now implemented as variadic functions
5405 instead of using `operator<<` for feeding arbitrary arguments into a
5406 temporary formatter object. This works both with C++11 where
5407 variadic templates are used and with older standards where variadic
5408 functions are emulated by providing lightweight wrapper functions
5409 defined with the `FMT_VARIADIC` macro. You can use this macro for
5410 defining your own portable variadic functions:
5411
5412 ```c++
5413 void report_error(const char *format, const fmt::ArgList &args) {
5414 fmt::print("Error: {}");
5415 fmt::print(format, args);
5416 }
5417 FMT_VARIADIC(void, report_error, const char *)
5418
5419 report_error("file not found: {}", path);
5420 ```
5421
5422 Apart from a more natural syntax, this also improves performance as
5423 there is no need to construct temporary formatter objects and
5424 control arguments\' lifetimes. Because the wrapper functions are
5425 very lightweight, this doesn\'t cause code bloat even in pre-C++11
5426 mode.
5427
5428 - Simplified common case of formatting an `std::string`. Now it
5429 requires a single function call:
5430
5431 ```c++
5432 std::string s = format("The answer is {}.", 42);
5433 ```
5434
5435 Previously it required 2 function calls:
5436
5437 ```c++
5438 std::string s = str(Format("The answer is {}.") << 42);
5439 ```
5440
5441 Instead of unsafe `c_str` function, `fmt::Writer` should be used
5442 directly to bypass creation of `std::string`:
5443
5444 ```c++
5445 fmt::Writer w;
5446 w.write("The answer is {}.", 42);
5447 w.c_str(); // returns a C string
5448 ```
5449
5450 This doesn\'t do dynamic memory allocation for small strings and is
5451 less error prone as the lifetime of the string is the same as for
5452 `std::string::c_str` which is well understood (hopefully).
5453
5454 - Improved consistency in naming functions that are a part of the
5455 public API. Now all public functions are lowercase following the
5456 standard library conventions. Previously it was a combination of
5457 lowercase and CapitalizedWords. Issue
5458 https://github.com/fmtlib/fmt/issues/50.
5459
5460 - Old functions are marked as deprecated and will be removed in the
5461 next release.
5462
5463 **Other Changes**
5464
5465 - Experimental support for printf format specifications (work in
5466 progress):
5467
5468 ```c++
5469 fmt::printf("The answer is %d.", 42);
5470 std::string s = fmt::sprintf("Look, a %s!", "string");
5471 ```
5472
5473 - Support for hexadecimal floating point format specifiers `a` and
5474 `A`:
5475
5476 ```c++
5477 print("{:a}", -42.0); // Prints -0x1.5p+5
5478 print("{:A}", -42.0); // Prints -0X1.5P+5
5479 ```
5480
5481 - CMake option `FMT_SHARED` that specifies whether to build format as
5482 a shared library (off by default).
5483
5484 # 0.9.0 - 2014-05-13
5485
5486 - More efficient implementation of variadic formatting functions.
5487
5488 - `Writer::Format` now has a variadic overload:
5489
5490 ```c++
5491 Writer out;
5492 out.Format("Look, I'm {}!", "variadic");
5493 ```
5494
5495 - For efficiency and consistency with other overloads, variadic
5496 overload of the `Format` function now returns `Writer` instead of
5497 `std::string`. Use the `str` function to convert it to
5498 `std::string`:
5499
5500 ```c++
5501 std::string s = str(Format("Look, I'm {}!", "variadic"));
5502 ```
5503
5504 - Replaced formatter actions with output sinks: `NoAction` -\>
5505 `NullSink`, `Write` -\> `FileSink`, `ColorWriter` -\>
5506 `ANSITerminalSink`. This improves naming consistency and shouldn\'t
5507 affect client code unless these classes are used directly which
5508 should be rarely needed.
5509
5510 - Added `ThrowSystemError` function that formats a message and throws
5511 `SystemError` containing the formatted message and system-specific
5512 error description. For example, the following code
5513
5514 ```c++
5515 FILE *f = fopen(filename, "r");
5516 if (!f)
5517 ThrowSystemError(errno, "Failed to open file '{}'") << filename;
5518 ```
5519
5520 will throw `SystemError` exception with description \"Failed to open
5521 file \'\<filename\>\': No such file or directory\" if file doesn\'t
5522 exist.
5523
5524 - Support for AppVeyor continuous integration platform.
5525
5526 - `Format` now throws `SystemError` in case of I/O errors.
5527
5528 - Improve test infrastructure. Print functions are now tested by
5529 redirecting the output to a pipe.
5530
5531 # 0.8.0 - 2014-04-14
5532
5533 - Initial release