Check that AltiVec is enabled before using it
[openal-soft.git] / fmt-11.0.2 / ChangeLog.md
blob6ba567d1d4b19d6d4e1d45fe264222a0c3024ee7
1 # 11.0.2 - 2024-07-20
3 - Fixed compatibility with non-POSIX systems
4   (https://github.com/fmtlib/fmt/issues/4054,
5   https://github.com/fmtlib/fmt/issues/4060).
7 - Fixed performance regressions when using `std::back_insert_iterator` with
8   `fmt::format_to` (https://github.com/fmtlib/fmt/issues/4070).
10 - Fixed handling of `std::generator` and move-only iterators
11   (https://github.com/fmtlib/fmt/issues/4053,
12   https://github.com/fmtlib/fmt/pull/4057). Thanks @Arghnews.
14 - Made `formatter<std::string_view>::parse` work with types convertible to
15   `std::string_view` (https://github.com/fmtlib/fmt/issues/4036,
16   https://github.com/fmtlib/fmt/pull/4055). Thanks @Arghnews.
18 - Made `volatile void*` formattable
19   (https://github.com/fmtlib/fmt/issues/4049,
20   https://github.com/fmtlib/fmt/pull/4056). Thanks @Arghnews.
22 - Made `Glib::ustring` not be confused with `std::string`
23   (https://github.com/fmtlib/fmt/issues/4052).
25 - Made `fmt::context` iterator compatible with STL algorithms that rely on
26   iterator category (https://github.com/fmtlib/fmt/issues/4079).
28 # 11.0.1 - 2024-07-05
30 - Fixed version number in the inline namespace
31   (https://github.com/fmtlib/fmt/issues/4047).
33 - Fixed disabling Unicode support via CMake
34   (https://github.com/fmtlib/fmt/issues/4051).
36 - Fixed deprecated `visit_format_arg` (https://github.com/fmtlib/fmt/pull/4043).
37   Thanks @nebkat.
39 - Fixed handling of a sign and improved the `std::complex` formater
40   (https://github.com/fmtlib/fmt/pull/4034,
41   https://github.com/fmtlib/fmt/pull/4050). Thanks @tesch1 and @phprus.
43 - Fixed ADL issues in `fmt::printf` when using C++20
44   (https://github.com/fmtlib/fmt/pull/4042). Thanks @toge.
46 - Removed a redundant check in the formatter for `std::expected`
47   (https://github.com/fmtlib/fmt/pull/4040). Thanks @phprus.
49 # 11.0.0 - 2024-07-01
51 - Added `fmt/base.h` which provides a subset of the API with minimal include
52   dependencies and enough functionality to replace all uses of the `printf`
53   family of functions. This brings the compile time of code using {fmt} much
54   closer to the equivalent `printf` code as shown on the following benchmark
55   that compiles 100 source files:
57   | Method       | Compile Time (s) |
58   |--------------|------------------|
59   | printf       | 1.6              |
60   | IOStreams    | 25.9             |
61   | fmt 10.x     | 19.0             |
62   | fmt 11.0     | 4.8              |
63   | tinyformat   | 29.1             |
64   | Boost Format | 55.0             |
66   This gives almost 4x improvement in build speed compared to version 10.
67   Note that the benchmark is purely formatting code and includes. In real
68   projects the difference from `printf` will be smaller partly because common
69   standard headers will be included in almost any translation unit (TU) anyway.
70   In particular, in every case except `printf` above ~1s is spent in total on
71   including `<type_traits>` in all TUs.
73 - Optimized includes in other headers such as `fmt/format.h` which is now
74   roughly equivalent to the old `fmt/core.h` in terms of build speed.
76 - Migrated the documentation at https://fmt.dev/ from Sphinx to MkDocs.
78 - Improved C++20 module support
79   (https://github.com/fmtlib/fmt/issues/3990,
80   https://github.com/fmtlib/fmt/pull/3991,
81   https://github.com/fmtlib/fmt/issues/3993,
82   https://github.com/fmtlib/fmt/pull/3994,
83   https://github.com/fmtlib/fmt/pull/3997,
84   https://github.com/fmtlib/fmt/pull/3998,
85   https://github.com/fmtlib/fmt/pull/4004,
86   https://github.com/fmtlib/fmt/pull/4005,
87   https://github.com/fmtlib/fmt/pull/4006,
88   https://github.com/fmtlib/fmt/pull/4013,
89   https://github.com/fmtlib/fmt/pull/4027,
90   https://github.com/fmtlib/fmt/pull/4029). In particular, native CMake support
91   for modules is now used if available. Thanks @yujincheng08 and @matt77hias.
93 - Added an option to replace standard includes with `import std` enabled via
94   the `FMT_IMPORT_STD` macro (https://github.com/fmtlib/fmt/issues/3921,
95   https://github.com/fmtlib/fmt/pull/3928). Thanks @matt77hias.
97 - Exported `fmt::range_format`, `fmt::range_format_kind` and
98   `fmt::compiled_string` from the `fmt` module
99   (https://github.com/fmtlib/fmt/pull/3970,
100   https://github.com/fmtlib/fmt/pull/3999).
101   Thanks @matt77hias and @yujincheng08.
103 - Improved integration with stdio in `fmt::print`, enabling direct writes
104   into a C stream buffer in common cases. This may give significant
105   performance improvements ranging from tens of percent to [2x](
106   https://stackoverflow.com/a/78457454/471164) and eliminates dynamic memory
107   allocations on the buffer level. It is currently enabled for built-in and
108   string types with wider availability coming up in future releases.
110   For example, it gives ~24% improvement on a [simple benchmark](
111   https://isocpp.org/files/papers/P3107R5.html#perf) compiled with Apple clang
112   version 15.0.0 (clang-1500.1.0.2.5) and run on macOS 14.2.1:
114   ```
115   -------------------------------------------------------
116   Benchmark             Time             CPU   Iterations
117   -------------------------------------------------------
118   printf             81.8 ns         81.5 ns      8496899
119   fmt::print (10.x)  63.8 ns         61.9 ns     11524151
120   fmt::print (11.0)  51.3 ns         51.0 ns     13846580
121   ```
123 - Improved safety of `fmt::format_to` when writing to an array
124   (https://github.com/fmtlib/fmt/pull/3805).
125   For example ([godbolt](https://www.godbolt.org/z/cYrn8dWY8)):
127   ```c++
128   auto volkswagen = char[4];
129   auto result = fmt::format_to(volkswagen, "elephant");
130   ```
132   no longer results in a buffer overflow. Instead the output will be truncated
133   and you can get the end iterator and whether truncation occurred from the
134   `result` object. Thanks @ThePhD.
136 - Enabled Unicode support by default in MSVC, bringing it on par with other
137   compilers and making it unnecessary for users to enable it explicitly.
138   Most of {fmt} is encoding-agnostic but this prevents mojibake in places
139   where encoding matters such as path formatting and terminal output.
140   You can control the Unicode support via the CMake `FMT_UNICODE` option.
141   Note that some {fmt} packages such as the one in vcpkg have already been
142   compiled with Unicode enabled.
144 - Added a formatter for `std::expected`
145   (https://github.com/fmtlib/fmt/pull/3834). Thanks @dominicpoeschko.
147 - Added a formatter for `std::complex`
148   (https://github.com/fmtlib/fmt/issues/1467,
149   https://github.com/fmtlib/fmt/issues/3886,
150   https://github.com/fmtlib/fmt/pull/3892,
151   https://github.com/fmtlib/fmt/pull/3900). Thanks @phprus.
153 - Added a formatter for `std::type_info`
154   (https://github.com/fmtlib/fmt/pull/3978). Thanks @matt77hias.
156 - Specialized `formatter` for `std::basic_string` types with custom traits
157   and allocators (https://github.com/fmtlib/fmt/issues/3938,
158   https://github.com/fmtlib/fmt/pull/3943). Thanks @dieram3.
160 - Added formatters for `std::chrono::day`, `std::chrono::month`,
161   `std::chrono::year` and `std::chrono::year_month_day`
162   (https://github.com/fmtlib/fmt/issues/3758,
163   https://github.com/fmtlib/fmt/issues/3772,
164   https://github.com/fmtlib/fmt/pull/3906,
165   https://github.com/fmtlib/fmt/pull/3913). For example:
167   ```c++
168   #include <fmt/chrono.h>
169   #include <fmt/color.h>
171   int main() {
172     fmt::print(fg(fmt::color::green), "{}\n", std::chrono::day(7));
173   }
174   ```
176   prints a green day:
178   <img width="306" alt="image" src="https://github.com/fmtlib/fmt/assets/576385/6e395f8b-451a-4cf7-bccc-ee92ca0dec65">
180   Thanks @zivshek.
182 - Fixed handling of precision in `%S` (https://github.com/fmtlib/fmt/issues/3794,
183   https://github.com/fmtlib/fmt/pull/3814). Thanks @js324.
185 - Added support for the `-` specifier (glibc `strftime` extension) to day of
186   the month (`%d`) and week of the year (`%W`, `%U`, `%V`) specifiers
187   (https://github.com/fmtlib/fmt/pull/3976). Thanks @ZaheenJ.
189 - Fixed the scope of the `-` extension in chrono formatting so that it doesn't
190   apply to subsequent specifiers (https://github.com/fmtlib/fmt/issues/3811,
191   https://github.com/fmtlib/fmt/pull/3812). Thanks @phprus.
193 - Improved handling of `time_point::min()`
194   (https://github.com/fmtlib/fmt/issues/3282).
196 - Added support for character range formatting
197   (https://github.com/fmtlib/fmt/issues/3857,
198   https://github.com/fmtlib/fmt/pull/3863). Thanks @js324.
200 - Added `string` and `debug_string` range formatters
201   (https://github.com/fmtlib/fmt/pull/3973,
202   https://github.com/fmtlib/fmt/pull/4024). Thanks @matt77hias.
204 - Enabled ADL for `begin` and `end` in `fmt::join`
205   (https://github.com/fmtlib/fmt/issues/3813,
206   https://github.com/fmtlib/fmt/pull/3824). Thanks @bbolli.
208 - Made contiguous iterator optimizations apply to `std::basic_string` iterators
209   (https://github.com/fmtlib/fmt/pull/3798). Thanks @phprus.
211 - Added support for ranges with mutable `begin` and `end`
212   (https://github.com/fmtlib/fmt/issues/3752,
213   https://github.com/fmtlib/fmt/pull/3800,
214   https://github.com/fmtlib/fmt/pull/3955). Thanks @tcbrindle and @Arghnews.
216 - Added support for move-only iterators to `fmt::join`
217   (https://github.com/fmtlib/fmt/issues/3802,
218   https://github.com/fmtlib/fmt/pull/3946). Thanks @Arghnews.
220 - Moved range and iterator overloads of `fmt::join` to `fmt/ranges.h`, next
221   to other overloads.
223 - Fixed handling of types with `begin` returning `void` such as Eigen matrices
224   (https://github.com/fmtlib/fmt/issues/3839,
225   https://github.com/fmtlib/fmt/pull/3964). Thanks @Arghnews.
227 - Added an `fmt::formattable` concept (https://github.com/fmtlib/fmt/pull/3974).
228   Thanks @matt77hias.
230 - Added support for `__float128` (https://github.com/fmtlib/fmt/issues/3494).
232 - Fixed rounding issues when formatting `long double` with fixed precision
233   (https://github.com/fmtlib/fmt/issues/3539).
235 - Made `fmt::isnan` not trigger floating-point exception for NaN values
236   (https://github.com/fmtlib/fmt/issues/3948,
237   https://github.com/fmtlib/fmt/pull/3951). Thanks @alexdewar.
239 - Removed dependency on `<memory>` for `std::allocator_traits` when possible
240   (https://github.com/fmtlib/fmt/pull/3804). Thanks @phprus.
242 - Enabled compile-time checks in formatting functions that take text colors and
243   styles.
245 - Deprecated wide stream overloads of `fmt::print` that take text styles.
247 - Made format string compilation work with clang 12 and later despite
248   only partial non-type template parameter support
249   (https://github.com/fmtlib/fmt/issues/4000,
250   https://github.com/fmtlib/fmt/pull/4001). Thanks @yujincheng08.
252 - Made `fmt::iterator_buffer`'s move constructor `noexcept`
253   (https://github.com/fmtlib/fmt/pull/3808). Thanks @waywardmonkeys.
255 - Started enforcing that `formatter::format` is const for compatibility
256   with `std::format` (https://github.com/fmtlib/fmt/issues/3447).
258 - Added `fmt::basic_format_arg::visit` and deprecated `fmt::visit_format_arg`.
260 - Made `fmt::basic_string_view` not constructible from `nullptr` for
261   consistency with `std::string_view` in C++23
262   (https://github.com/fmtlib/fmt/pull/3846). Thanks @dalle.
264 - Fixed `fmt::group_digits` for negative integers
265   (https://github.com/fmtlib/fmt/issues/3891,
266   https://github.com/fmtlib/fmt/pull/3901). Thanks @phprus.
268 - Fixed handling of negative ids in `fmt::basic_format_args::get`
269   (https://github.com/fmtlib/fmt/pull/3945). Thanks @marlenecota.
271 - Improved named argument validation
272   (https://github.com/fmtlib/fmt/issues/3817).
274 - Disabled copy construction/assignment for `fmt::format_arg_store` and
275   fixed moved construction (https://github.com/fmtlib/fmt/pull/3833).
276   Thanks @ivafanas.
278 - Worked around a locale issue in RHEL/devtoolset
279   (https://github.com/fmtlib/fmt/issues/3858,
280   https://github.com/fmtlib/fmt/pull/3859). Thanks @g199209.
282 - Added RTTI detection for MSVC (https://github.com/fmtlib/fmt/pull/3821,
283   https://github.com/fmtlib/fmt/pull/3963). Thanks @edo9300.
285 - Migrated the documentation from Sphinx to MkDocs.
287 - Improved documentation and README
288   (https://github.com/fmtlib/fmt/issues/3775,
289   https://github.com/fmtlib/fmt/pull/3784,
290   https://github.com/fmtlib/fmt/issues/3788,
291   https://github.com/fmtlib/fmt/pull/3789,
292   https://github.com/fmtlib/fmt/pull/3793,
293   https://github.com/fmtlib/fmt/issues/3818,
294   https://github.com/fmtlib/fmt/pull/3820,
295   https://github.com/fmtlib/fmt/pull/3822,
296   https://github.com/fmtlib/fmt/pull/3843,
297   https://github.com/fmtlib/fmt/pull/3890,
298   https://github.com/fmtlib/fmt/issues/3894,
299   https://github.com/fmtlib/fmt/pull/3895,
300   https://github.com/fmtlib/fmt/pull/3905,
301   https://github.com/fmtlib/fmt/issues/3942,
302   https://github.com/fmtlib/fmt/pull/4008).
303   Thanks @zencatalyst, WolleTD, @tupaschoal, @Dobiasd, @frank-weinberg, @bbolli,
304   @phprus, @waywardmonkeys, @js324 and @tchaikov.
306 - Improved CI and tests
307   (https://github.com/fmtlib/fmt/issues/3878,
308   https://github.com/fmtlib/fmt/pull/3883,
309   https://github.com/fmtlib/fmt/issues/3897,
310   https://github.com/fmtlib/fmt/pull/3979,
311   https://github.com/fmtlib/fmt/pull/3980,
312   https://github.com/fmtlib/fmt/pull/3988,
313   https://github.com/fmtlib/fmt/pull/4010,
314   https://github.com/fmtlib/fmt/pull/4012,
315   https://github.com/fmtlib/fmt/pull/4038).
316   Thanks @vgorrX, @waywardmonkeys, @tchaikov and @phprus.
318 - Fixed buffer overflow when using format string compilation with debug format
319   and `std::back_insert_iterator` (https://github.com/fmtlib/fmt/issues/3795,
320   https://github.com/fmtlib/fmt/pull/3797). Thanks @phprus.
322 - Improved Bazel support
323   (https://github.com/fmtlib/fmt/pull/3792,
324   https://github.com/fmtlib/fmt/pull/3801,
325   https://github.com/fmtlib/fmt/pull/3962,
326   https://github.com/fmtlib/fmt/pull/3965). Thanks @Vertexwahn.
328 - Improved/fixed the CMake config
329   (https://github.com/fmtlib/fmt/issues/3777,
330   https://github.com/fmtlib/fmt/pull/3783,
331   https://github.com/fmtlib/fmt/issues/3847,
332   https://github.com/fmtlib/fmt/pull/3907). Thanks @phprus and @xTachyon.
334 - Fixed various warnings and compilation issues
335   (https://github.com/fmtlib/fmt/issues/3685,
336   https://github.com/fmtlib/fmt/issues/3769,
337   https://github.com/fmtlib/fmt/issues/3796,
338   https://github.com/fmtlib/fmt/issues/3803,
339   https://github.com/fmtlib/fmt/pull/3806,
340   https://github.com/fmtlib/fmt/pull/3807,
341   https://github.com/fmtlib/fmt/issues/3809,
342   https://github.com/fmtlib/fmt/pull/3810,
343   https://github.com/fmtlib/fmt/issues/3830,
344   https://github.com/fmtlib/fmt/pull/3832,
345   https://github.com/fmtlib/fmt/issues/3835,
346   https://github.com/fmtlib/fmt/pull/3844,
347   https://github.com/fmtlib/fmt/issues/3854,
348   https://github.com/fmtlib/fmt/pull/3856,
349   https://github.com/fmtlib/fmt/pull/3865,
350   https://github.com/fmtlib/fmt/pull/3866,
351   https://github.com/fmtlib/fmt/pull/3880,
352   https://github.com/fmtlib/fmt/issues/3881,
353   https://github.com/fmtlib/fmt/issues/3884,
354   https://github.com/fmtlib/fmt/issues/3898,
355   https://github.com/fmtlib/fmt/pull/3899,
356   https://github.com/fmtlib/fmt/pull/3909,
357   https://github.com/fmtlib/fmt/pull/3917,
358   https://github.com/fmtlib/fmt/pull/3923,
359   https://github.com/fmtlib/fmt/pull/3924,
360   https://github.com/fmtlib/fmt/issues/3925,
361   https://github.com/fmtlib/fmt/pull/3930,
362   https://github.com/fmtlib/fmt/pull/3931,
363   https://github.com/fmtlib/fmt/pull/3933,
364   https://github.com/fmtlib/fmt/issues/3935,
365   https://github.com/fmtlib/fmt/pull/3937,
366   https://github.com/fmtlib/fmt/pull/3967,
367   https://github.com/fmtlib/fmt/pull/3968,
368   https://github.com/fmtlib/fmt/pull/3972,
369   https://github.com/fmtlib/fmt/pull/3983,
370   https://github.com/fmtlib/fmt/issues/3992,
371   https://github.com/fmtlib/fmt/pull/3995,
372   https://github.com/fmtlib/fmt/pull/4009,
373   https://github.com/fmtlib/fmt/pull/4023).
374   Thanks @hmbj, @phprus, @res2k, @Baardi, @matt77hias, @waywardmonkeys, @hmbj,
375   @yakra, @prlw1, @Arghnews, @mtillmann0, @ShifftC, @eepp, @jimmy-park and
376   @ChristianGebhardt.
378 # 10.2.1 - 2024-01-04
380 - Fixed ABI compatibility with earlier 10.x versions
381   (https://github.com/fmtlib/fmt/issues/3785,
382   https://github.com/fmtlib/fmt/pull/3786). Thanks @saraedum.
384 # 10.2.0 - 2024-01-01
386 - Added support for the `%j` specifier (the number of days) for
387   `std::chrono::duration` (https://github.com/fmtlib/fmt/issues/3643,
388   https://github.com/fmtlib/fmt/pull/3732). Thanks @intelfx.
390 - Added support for the chrono suffix for days and changed
391   the suffix for minutes from "m" to the correct "min"
392   (https://github.com/fmtlib/fmt/issues/3662,
393   https://github.com/fmtlib/fmt/pull/3664).
394   For example ([godbolt](https://godbolt.org/z/9KhMnq9ba)):
396   ```c++
397   #include <fmt/chrono.h>
399   int main() {
400     fmt::print("{}\n", std::chrono::days(42)); // prints "42d"
401   }
402   ```
404   Thanks @Richardk2n.
406 - Fixed an overflow in `std::chrono::time_point` formatting with large dates
407   (https://github.com/fmtlib/fmt/issues/3725,
408   https://github.com/fmtlib/fmt/pull/3727). Thanks @cschreib.
410 - Added a formatter for `std::source_location`
411   (https://github.com/fmtlib/fmt/pull/3730).
412   For example ([godbolt](https://godbolt.org/z/YajfKjhhr)):
414   ```c++
415   #include <source_location>
416   #include <fmt/std.h>
418   int main() {
419     fmt::print("{}\n", std::source_location::current());
420   }
421   ```
423   prints
425   ```
426   /app/example.cpp:5:51: int main()
427   ```
429   Thanks @felix642.
431 - Added a formatter for `std::bitset`
432   (https://github.com/fmtlib/fmt/pull/3660).
433   For example ([godbolt](https://godbolt.org/z/bdEaGeYxe)):
435   ```c++
436   #include <bitset>
437   #include <fmt/std.h>
439   int main() {
440     fmt::print("{}\n", std::bitset<6>(42)); // prints "101010"
441   }
442   ```
444   Thanks @muggenhor.
446 - Added an experimental `nested_formatter` that provides an easy way of
447   applying a formatter to one or more subobjects while automatically handling
448   width, fill and alignment. For example:
450   ```c++
451   #include <fmt/format.h>
453   struct point {
454     double x, y;
455   };
457   template <>
458   struct fmt::formatter<point> : nested_formatter<double> {
459     auto format(point p, format_context& ctx) const {
460       return write_padded(ctx, [=](auto out) {
461         return format_to(out, "({}, {})", nested(p.x), nested(p.y));
462       });
463     }
464   };
466   int main() {
467     fmt::print("[{:>20.2f}]", point{1, 2});
468   }
469   ```
471   prints
473   ```
474   [          (1.00, 2.00)]
475   ```
477 - Added the generic representation (`g`) to `std::filesystem::path`
478   (https://github.com/fmtlib/fmt/issues/3715,
479   https://github.com/fmtlib/fmt/pull/3729). For example:
481   ```c++
482   #include <filesystem>
483   #include <fmt/std.h>
485   int main() {
486     fmt::print("{:g}\n", std::filesystem::path("C:\\foo"));
487   }
488   ```
490   prints `"C:/foo"` on Windows.
492   Thanks @js324.
494 - Made `format_as` work with references
495   (https://github.com/fmtlib/fmt/pull/3739). Thanks @tchaikov.
497 - Fixed formatting of invalid UTF-8 with precision
498   (https://github.com/fmtlib/fmt/issues/3284).
500 - Fixed an inconsistency between `fmt::to_string` and `fmt::format`
501   (https://github.com/fmtlib/fmt/issues/3684).
503 - Disallowed unsafe uses of `fmt::styled`
504   (https://github.com/fmtlib/fmt/issues/3625):
506   ```c++
507   auto s = fmt::styled(std::string("dangle"), fmt::emphasis::bold);
508   fmt::print("{}\n", s); // compile error
509   ```
511   Pass `fmt::styled(...)` as a parameter instead.
513 - Added a null check when formatting a C string with the `s` specifier
514   (https://github.com/fmtlib/fmt/issues/3706).
516 - Disallowed the `c` specifier for `bool`
517   (https://github.com/fmtlib/fmt/issues/3726,
518   https://github.com/fmtlib/fmt/pull/3734). Thanks @js324.
520 - Made the default formatting unlocalized in `fmt::ostream_formatter` for
521   consistency with the rest of the library
522   (https://github.com/fmtlib/fmt/issues/3460).
524 - Fixed localized formatting in bases other than decimal
525   (https://github.com/fmtlib/fmt/issues/3693,
526   https://github.com/fmtlib/fmt/pull/3750). Thanks @js324.
528 - Fixed a performance regression in experimental `fmt::ostream::print`
529   (https://github.com/fmtlib/fmt/issues/3674).
531 - Added synchronization with the underlying output stream when writing to
532   the Windows console
533   (https://github.com/fmtlib/fmt/pull/3668,
534   https://github.com/fmtlib/fmt/issues/3688,
535   https://github.com/fmtlib/fmt/pull/3689).
536   Thanks @Roman-Koshelev and @dimztimz.
538 - Changed to only export `format_error` when {fmt} is built as a shared
539   library (https://github.com/fmtlib/fmt/issues/3626,
540   https://github.com/fmtlib/fmt/pull/3627). Thanks @phprus.
542 - Made `fmt::streamed` `constexpr`.
543   (https://github.com/fmtlib/fmt/pull/3650). Thanks @muggenhor.
545 - Made `fmt::format_int` `constexpr`
546   (https://github.com/fmtlib/fmt/issues/4031,
547   https://github.com/fmtlib/fmt/pull/4032). Thanks @dixlorenz.
549 - Enabled `consteval` on older versions of MSVC
550   (https://github.com/fmtlib/fmt/pull/3757). Thanks @phprus.
552 - Added an option to build without `wchar_t` support on Windows
553   (https://github.com/fmtlib/fmt/issues/3631,
554   https://github.com/fmtlib/fmt/pull/3636). Thanks @glebm.
556 - Improved build and CI configuration
557   (https://github.com/fmtlib/fmt/pull/3679,
558   https://github.com/fmtlib/fmt/issues/3701,
559   https://github.com/fmtlib/fmt/pull/3702,
560   https://github.com/fmtlib/fmt/pull/3749).
561   Thanks @jcar87, @pklima and @tchaikov.
563 - Fixed various warnings, compilation and test issues
564   (https://github.com/fmtlib/fmt/issues/3607,
565   https://github.com/fmtlib/fmt/pull/3610,
566   https://github.com/fmtlib/fmt/pull/3624,
567   https://github.com/fmtlib/fmt/pull/3630,
568   https://github.com/fmtlib/fmt/pull/3634,
569   https://github.com/fmtlib/fmt/pull/3638,
570   https://github.com/fmtlib/fmt/issues/3645,
571   https://github.com/fmtlib/fmt/issues/3646,
572   https://github.com/fmtlib/fmt/pull/3647,
573   https://github.com/fmtlib/fmt/pull/3652,
574   https://github.com/fmtlib/fmt/issues/3654,
575   https://github.com/fmtlib/fmt/pull/3663,
576   https://github.com/fmtlib/fmt/issues/3670,
577   https://github.com/fmtlib/fmt/pull/3680,
578   https://github.com/fmtlib/fmt/issues/3694,
579   https://github.com/fmtlib/fmt/pull/3695,
580   https://github.com/fmtlib/fmt/pull/3699,
581   https://github.com/fmtlib/fmt/issues/3705,
582   https://github.com/fmtlib/fmt/issues/3710,
583   https://github.com/fmtlib/fmt/issues/3712,
584   https://github.com/fmtlib/fmt/pull/3713,
585   https://github.com/fmtlib/fmt/issues/3714,
586   https://github.com/fmtlib/fmt/pull/3716,
587   https://github.com/fmtlib/fmt/pull/3723,
588   https://github.com/fmtlib/fmt/issues/3738,
589   https://github.com/fmtlib/fmt/issues/3740,
590   https://github.com/fmtlib/fmt/pull/3741,
591   https://github.com/fmtlib/fmt/pull/3743,
592   https://github.com/fmtlib/fmt/issues/3745,
593   https://github.com/fmtlib/fmt/pull/3747,
594   https://github.com/fmtlib/fmt/pull/3748,
595   https://github.com/fmtlib/fmt/pull/3751,
596   https://github.com/fmtlib/fmt/pull/3754,
597   https://github.com/fmtlib/fmt/pull/3755,
598   https://github.com/fmtlib/fmt/issues/3760,
599   https://github.com/fmtlib/fmt/pull/3762,
600   https://github.com/fmtlib/fmt/issues/3763,
601   https://github.com/fmtlib/fmt/pull/3764,
602   https://github.com/fmtlib/fmt/issues/3774,
603   https://github.com/fmtlib/fmt/pull/3779).
604   Thanks @danakj, @vinayyadav3016, @cyyever, @phprus, @qimiko, @saschasc,
605   @gsjaardema, @lazka, @Zhaojun-Liu, @carlsmedstad, @hotwatermorning,
606   @cptFracassa, @kuguma, @PeterJohnson, @H1X4Dev, @asantoni, @eltociear,
607   @msimberg, @tchaikov, @waywardmonkeys.
609 - Improved documentation and README
610   (https://github.com/fmtlib/fmt/issues/2086,
611   https://github.com/fmtlib/fmt/issues/3637,
612   https://github.com/fmtlib/fmt/pull/3642,
613   https://github.com/fmtlib/fmt/pull/3653,
614   https://github.com/fmtlib/fmt/pull/3655,
615   https://github.com/fmtlib/fmt/pull/3661,
616   https://github.com/fmtlib/fmt/issues/3673,
617   https://github.com/fmtlib/fmt/pull/3677,
618   https://github.com/fmtlib/fmt/pull/3737,
619   https://github.com/fmtlib/fmt/issues/3742,
620   https://github.com/fmtlib/fmt/pull/3744).
621   Thanks @idzm, @perlun, @joycebrum, @fennewald, @reinhardt1053, @GeorgeLS.
623 - Updated CI dependencies
624   (https://github.com/fmtlib/fmt/pull/3615,
625   https://github.com/fmtlib/fmt/pull/3622,
626   https://github.com/fmtlib/fmt/pull/3623,
627   https://github.com/fmtlib/fmt/pull/3666,
628   https://github.com/fmtlib/fmt/pull/3696,
629   https://github.com/fmtlib/fmt/pull/3697,
630   https://github.com/fmtlib/fmt/pull/3759,
631   https://github.com/fmtlib/fmt/pull/3782).
633 # 10.1.1 - 2023-08-28
635 - Added formatters for `std::atomic` and `atomic_flag`
636   (https://github.com/fmtlib/fmt/pull/3574,
637   https://github.com/fmtlib/fmt/pull/3594).
638   Thanks @wangzw and @AlexGuteniev.
639 - Fixed an error about partial specialization of `formatter<string>`
640   after instantiation when compiled with gcc and C++20
641   (https://github.com/fmtlib/fmt/issues/3584).
642 - Fixed compilation as a C++20 module with gcc and clang
643   (https://github.com/fmtlib/fmt/issues/3587,
644   https://github.com/fmtlib/fmt/pull/3597,
645   https://github.com/fmtlib/fmt/pull/3605).
646   Thanks @MathewBensonCode.
647 - Made `fmt::to_string` work with types that have `format_as`
648   overloads (https://github.com/fmtlib/fmt/pull/3575). Thanks @phprus.
649 - Made `formatted_size` work with integral format specifiers at
650   compile time (https://github.com/fmtlib/fmt/pull/3591).
651   Thanks @elbeno.
652 - Fixed a warning about the `no_unique_address` attribute on clang-cl
653   (https://github.com/fmtlib/fmt/pull/3599). Thanks @lukester1975.
654 - Improved compatibility with the legacy GBK encoding
655   (https://github.com/fmtlib/fmt/issues/3598,
656   https://github.com/fmtlib/fmt/pull/3599). Thanks @YuHuanTin.
657 - Added OpenSSF Scorecard analysis
658   (https://github.com/fmtlib/fmt/issues/3530,
659   https://github.com/fmtlib/fmt/pull/3571). Thanks @joycebrum.
660 - Updated CI dependencies
661   (https://github.com/fmtlib/fmt/pull/3591,
662   https://github.com/fmtlib/fmt/pull/3592,
663   https://github.com/fmtlib/fmt/pull/3593,
664   https://github.com/fmtlib/fmt/pull/3602).
666 # 10.1.0 - 2023-08-12
668 - Optimized format string compilation resulting in up to 40% speed up
669   in compiled `format_to` and \~4x speed up in compiled `format_to_n`
670   on a concatenation benchmark
671   (https://github.com/fmtlib/fmt/issues/3133,
672   https://github.com/fmtlib/fmt/issues/3484).
674   {fmt} 10.0:
676       ---------------------------------------------------------
677       Benchmark               Time             CPU   Iterations
678       ---------------------------------------------------------
679       BM_format_to         78.9 ns         78.9 ns      8881746
680       BM_format_to_n        568 ns          568 ns      1232089
682   {fmt} 10.1:
684       ---------------------------------------------------------
685       Benchmark               Time             CPU   Iterations
686       ---------------------------------------------------------
687       BM_format_to         54.9 ns         54.9 ns     12727944
688       BM_format_to_n        133 ns          133 ns      5257795
690 - Optimized storage of an empty allocator in `basic_memory_buffer`
691   (https://github.com/fmtlib/fmt/pull/3485). Thanks @Minty-Meeo.
693 - Added formatters for proxy references to elements of
694   `std::vector<bool>` and `std::bitset<N>`
695   (https://github.com/fmtlib/fmt/issues/3567,
696   https://github.com/fmtlib/fmt/pull/3570). For example
697   ([godbolt](https://godbolt.org/z/zYb79Pvn8)):
699   ```c++
700   #include <vector>
701   #include <fmt/std.h>
703   int main() {
704     auto v = std::vector<bool>{true};
705     fmt::print("{}", v[0]);
706   }
707   ```
709   Thanks @phprus and @felix642.
711 - Fixed an ambiguous formatter specialization for containers that look
712   like container adaptors such as `boost::flat_set`
713   (https://github.com/fmtlib/fmt/issues/3556,
714   https://github.com/fmtlib/fmt/pull/3561). Thanks @5chmidti.
716 - Fixed compilation when formatting durations not convertible from
717   `std::chrono::seconds`
718   (https://github.com/fmtlib/fmt/pull/3430). Thanks @patlkli.
720 - Made the `formatter` specialization for `char*` const-correct
721   (https://github.com/fmtlib/fmt/pull/3432). Thanks @timsong-cpp.
723 - Made `{}` and `{:}` handled consistently during compile-time checks
724   (https://github.com/fmtlib/fmt/issues/3526).
726 - Disallowed passing temporaries to `make_format_args` to improve API
727   safety by preventing dangling references.
729 - Improved the compile-time error for unformattable types
730   (https://github.com/fmtlib/fmt/pull/3478). Thanks @BRevzin.
732 - Improved the floating-point formatter
733   (https://github.com/fmtlib/fmt/pull/3448,
734   https://github.com/fmtlib/fmt/pull/3450).
735   Thanks @florimond-collette.
737 - Fixed handling of precision for `long double` larger than 64 bits.
738   (https://github.com/fmtlib/fmt/issues/3539,
739   https://github.com/fmtlib/fmt/issues/3564).
741 - Made floating-point and chrono tests less platform-dependent
742   (https://github.com/fmtlib/fmt/issues/3337,
743   https://github.com/fmtlib/fmt/issues/3433,
744   https://github.com/fmtlib/fmt/pull/3434). Thanks @phprus.
746 - Removed the remnants of the Grisu floating-point formatter that has
747   been replaced by Dragonbox in earlier versions.
749 - Added `throw_format_error` to the public API
750   (https://github.com/fmtlib/fmt/pull/3551). Thanks @mjerabek.
752 - Made `FMT_THROW` assert even if assertions are disabled when
753   compiling with exceptions disabled
754   (https://github.com/fmtlib/fmt/issues/3418,
755   https://github.com/fmtlib/fmt/pull/3439). Thanks @BRevzin.
757 - Made `format_as` and `std::filesystem::path` formatter work with
758   exotic code unit types.
759   (https://github.com/fmtlib/fmt/pull/3457,
760   https://github.com/fmtlib/fmt/pull/3476). Thanks @gix and @hmbj.
762 - Added support for the `?` format specifier to
763   `std::filesystem::path` and made the default unescaped for
764   consistency with strings.
766 - Deprecated the wide stream overload of `printf`.
768 - Removed unused `basic_printf_parse_context`.
770 - Improved RTTI detection used when formatting exceptions
771   (https://github.com/fmtlib/fmt/pull/3468). Thanks @danakj.
773 - Improved compatibility with VxWorks7
774   (https://github.com/fmtlib/fmt/pull/3467). Thanks @wenshan1.
776 - Improved documentation
777   (https://github.com/fmtlib/fmt/issues/3174,
778   https://github.com/fmtlib/fmt/issues/3423,
779   https://github.com/fmtlib/fmt/pull/3454,
780   https://github.com/fmtlib/fmt/issues/3458,
781   https://github.com/fmtlib/fmt/pull/3461,
782   https://github.com/fmtlib/fmt/issues/3487,
783   https://github.com/fmtlib/fmt/pull/3515).
784   Thanks @zencatalyst, @rlalik and @mikecrowe.
786 - Improved build and CI configurations
787   (https://github.com/fmtlib/fmt/issues/3449,
788   https://github.com/fmtlib/fmt/pull/3451,
789   https://github.com/fmtlib/fmt/pull/3452,
790   https://github.com/fmtlib/fmt/pull/3453,
791   https://github.com/fmtlib/fmt/pull/3459,
792   https://github.com/fmtlib/fmt/issues/3481,
793   https://github.com/fmtlib/fmt/pull/3486,
794   https://github.com/fmtlib/fmt/issues/3489,
795   https://github.com/fmtlib/fmt/pull/3496,
796   https://github.com/fmtlib/fmt/issues/3517,
797   https://github.com/fmtlib/fmt/pull/3523,
798   https://github.com/fmtlib/fmt/pull/3563).
799   Thanks @joycebrum, @glebm, @phprus, @petrmanek, @setoye and @abouvier.
801 - Fixed various warnings and compilation issues
802   (https://github.com/fmtlib/fmt/issues/3408,
803   https://github.com/fmtlib/fmt/issues/3424,
804   https://github.com/fmtlib/fmt/issues/3444,
805   https://github.com/fmtlib/fmt/pull/3446,
806   https://github.com/fmtlib/fmt/pull/3475,
807   https://github.com/fmtlib/fmt/pull/3482,
808   https://github.com/fmtlib/fmt/issues/3492,
809   https://github.com/fmtlib/fmt/pull/3493,
810   https://github.com/fmtlib/fmt/pull/3508,
811   https://github.com/fmtlib/fmt/issues/3509,
812   https://github.com/fmtlib/fmt/issues/3533,
813   https://github.com/fmtlib/fmt/pull/3542,
814   https://github.com/fmtlib/fmt/issues/3543,
815   https://github.com/fmtlib/fmt/issues/3540,
816   https://github.com/fmtlib/fmt/pull/3544,
817   https://github.com/fmtlib/fmt/issues/3548,
818   https://github.com/fmtlib/fmt/pull/3549,
819   https://github.com/fmtlib/fmt/pull/3550,
820   https://github.com/fmtlib/fmt/pull/3552).
821   Thanks @adesitter, @hmbj, @Minty-Meeo, @phprus, @TobiSchluter,
822   @kieranclancy, @alexeedm, @jurihock, @Ozomahtli and @razaqq.
824 # 10.0.0 - 2023-05-09
826 - Replaced Grisu with a new floating-point formatting algorithm for
827   given precision (https://github.com/fmtlib/fmt/issues/3262,
828   https://github.com/fmtlib/fmt/issues/2750,
829   https://github.com/fmtlib/fmt/pull/3269,
830   https://github.com/fmtlib/fmt/pull/3276). The new algorithm
831   is based on Dragonbox already used for the shortest representation
832   and gives substantial performance improvement:
834   ![](https://user-images.githubusercontent.com/33922675/211956670-84891a09-6867-47d9-82fc-3230da7abe0f.png)
836   -   Red: new algorithm
837   -   Green: new algorithm with `FMT_USE_FULL_CACHE_DRAGONBOX` defined
838       to 1
839   -   Blue: old algorithm
841   Thanks @jk-jeon.
843 - Replaced `snprintf`-based hex float formatter with an internal
844   implementation (https://github.com/fmtlib/fmt/pull/3179,
845   https://github.com/fmtlib/fmt/pull/3203). This removes the
846   last usage of `s(n)printf` in {fmt}. Thanks @phprus.
848 - Fixed alignment of floating-point numbers with localization
849   (https://github.com/fmtlib/fmt/issues/3263,
850   https://github.com/fmtlib/fmt/pull/3272). Thanks @ShawnZhong.
852 - Made handling of `#` consistent with `std::format`.
854 - Improved C++20 module support
855   (https://github.com/fmtlib/fmt/pull/3134,
856   https://github.com/fmtlib/fmt/pull/3254,
857   https://github.com/fmtlib/fmt/pull/3386,
858   https://github.com/fmtlib/fmt/pull/3387,
859   https://github.com/fmtlib/fmt/pull/3388,
860   https://github.com/fmtlib/fmt/pull/3392,
861   https://github.com/fmtlib/fmt/pull/3397,
862   https://github.com/fmtlib/fmt/pull/3399,
863   https://github.com/fmtlib/fmt/pull/3400).
864   Thanks @laitingsheng, @Orvid and @DanielaE.
865   
866 - Switched to the [modules CMake library](https://github.com/vitaut/modules)
867   which allows building {fmt} as a C++20 module with clang:
869       CXX=clang++ cmake -DFMT_MODULE=ON .
870       make
872 - Made `format_as` work with any user-defined type and not just enums.
873   For example ([godbolt](https://godbolt.org/z/b7rqhq5Kh)):
875   ```c++
876   #include <fmt/format.h>
878   struct floaty_mc_floatface {
879     double value;
880   };
882   auto format_as(floaty_mc_floatface f) { return f.value; }
884   int main() {
885     fmt::print("{:8}\n", floaty_mc_floatface{0.42}); // prints "    0.42"
886   }
887   ```
889 - Removed deprecated implicit conversions for enums and conversions to
890   primitive types for compatibility with `std::format` and to prevent
891   potential ODR violations. Use `format_as` instead.
893 - Added support for fill, align and width to the time point formatter
894   (https://github.com/fmtlib/fmt/issues/3237,
895   https://github.com/fmtlib/fmt/pull/3260,
896   https://github.com/fmtlib/fmt/pull/3275). For example
897   ([godbolt](https://godbolt.org/z/rKP6MGz6c)):
899   ```c++
900   #include <fmt/chrono.h>
902   int main() {
903     // prints "    2023"
904     fmt::print("{:>8%Y}\n", std::chrono::system_clock::now());
905   }
906   ```
908   Thanks @ShawnZhong.
910 - Implemented formatting of subseconds
911   (https://github.com/fmtlib/fmt/issues/2207,
912   https://github.com/fmtlib/fmt/issues/3117,
913   https://github.com/fmtlib/fmt/pull/3115,
914   https://github.com/fmtlib/fmt/pull/3143,
915   https://github.com/fmtlib/fmt/pull/3144,
916   https://github.com/fmtlib/fmt/pull/3349). For example
917   ([godbolt](https://godbolt.org/z/45738oGEo)):
919   ```c++
920   #include <fmt/chrono.h>
922   int main() {
923     // prints 01.234567
924     fmt::print("{:%S}\n", std::chrono::microseconds(1234567));
925   }
926   ```
928   Thanks @patrickroocks @phprus and @BRevzin.
930 - Added precision support to `%S`
931   (https://github.com/fmtlib/fmt/pull/3148). Thanks @SappyJoy
933 - Added support for `std::utc_time`
934   (https://github.com/fmtlib/fmt/issues/3098,
935   https://github.com/fmtlib/fmt/pull/3110). Thanks @patrickroocks.
937 - Switched formatting of `std::chrono::system_clock` from local time
938   to UTC for compatibility with the standard
939   (https://github.com/fmtlib/fmt/issues/3199,
940   https://github.com/fmtlib/fmt/pull/3230). Thanks @ned14.
942 - Added support for `%Ez` and `%Oz` to chrono formatters.
943   (https://github.com/fmtlib/fmt/issues/3220,
944   https://github.com/fmtlib/fmt/pull/3222). Thanks @phprus.
946 - Improved validation of format specifiers for `std::chrono::duration`
947   (https://github.com/fmtlib/fmt/issues/3219,
948   https://github.com/fmtlib/fmt/pull/3232). Thanks @ShawnZhong.
950 - Fixed formatting of time points before the epoch
951   (https://github.com/fmtlib/fmt/issues/3117,
952   https://github.com/fmtlib/fmt/pull/3261). For example
953   ([godbolt](https://godbolt.org/z/f7bcznb3W)):
955   ```c++
956   #include <fmt/chrono.h>
958   int main() {
959     auto t = std::chrono::system_clock::from_time_t(0) -
960              std::chrono::milliseconds(250);
961     fmt::print("{:%S}\n", t); // prints 59.750000000
962   }
963   ```
965   Thanks @ShawnZhong.
967 - Experimental: implemented glibc extension for padding seconds,
968   minutes and hours
969   (https://github.com/fmtlib/fmt/issues/2959,
970   https://github.com/fmtlib/fmt/pull/3271). Thanks @ShawnZhong.
972 - Added a formatter for `std::exception`
973   (https://github.com/fmtlib/fmt/issues/2977,
974   https://github.com/fmtlib/fmt/issues/3012,
975   https://github.com/fmtlib/fmt/pull/3062,
976   https://github.com/fmtlib/fmt/pull/3076,
977   https://github.com/fmtlib/fmt/pull/3119). For example
978   ([godbolt](https://godbolt.org/z/8xoWGs9e4)):
980   ```c++
981   #include <fmt/std.h>
982   #include <vector>
984   int main() {
985     try {
986       std::vector<bool>().at(0);
987     } catch(const std::exception& e) {
988       fmt::print("{}", e);
989     }
990   }
991   ```
993   prints:
995       vector<bool>::_M_range_check: __n (which is 0) >= this->size() (which is 0)
997   on libstdc++. Thanks @zach2good and @phprus.
999 - Moved `std::error_code` formatter from `fmt/os.h` to `fmt/std.h`.
1000   (https://github.com/fmtlib/fmt/pull/3125). Thanks @phprus.
1002 - Added formatters for standard container adapters:
1003   `std::priority_queue`, `std::queue` and `std::stack`
1004   (https://github.com/fmtlib/fmt/issues/3215,
1005   https://github.com/fmtlib/fmt/pull/3279). For example
1006   ([godbolt](https://godbolt.org/z/74h1xY9qK)):
1008   ```c++
1009   #include <fmt/ranges.h>
1010   #include <stack>
1011   #include <vector>
1013   int main() {
1014     auto s = std::stack<bool, std::vector<bool>>();
1015     for (auto b: {true, false, true}) s.push(b);
1016     fmt::print("{}\n", s); // prints [true, false, true]
1017   }
1018   ```
1020   Thanks @ShawnZhong.
1022 - Added a formatter for `std::optional` to `fmt/std.h`
1023   (https://github.com/fmtlib/fmt/issues/1367,
1024   https://github.com/fmtlib/fmt/pull/3303).
1025   Thanks @tom-huntington.
1027 - Fixed formatting of valueless by exception variants
1028   (https://github.com/fmtlib/fmt/pull/3347). Thanks @TheOmegaCarrot.
1030 - Made `fmt::ptr` accept `unique_ptr` with a custom deleter
1031   (https://github.com/fmtlib/fmt/pull/3177). Thanks @hmbj.
1033 - Fixed formatting of noncopyable ranges and nested ranges of chars
1034   (https://github.com/fmtlib/fmt/pull/3158
1035   https://github.com/fmtlib/fmt/issues/3286,
1036   https://github.com/fmtlib/fmt/pull/3290). Thanks @BRevzin.
1038 - Fixed issues with formatting of paths and ranges of paths
1039   (https://github.com/fmtlib/fmt/issues/3319,
1040   https://github.com/fmtlib/fmt/pull/3321
1041   https://github.com/fmtlib/fmt/issues/3322). Thanks @phprus.
1043 - Improved handling of invalid Unicode in paths.
1045 - Enabled compile-time checks on Apple clang 14 and later
1046   (https://github.com/fmtlib/fmt/pull/3331). Thanks @cloyce.
1048 - Improved compile-time checks of named arguments
1049   (https://github.com/fmtlib/fmt/issues/3105,
1050   https://github.com/fmtlib/fmt/pull/3214). Thanks @rbrich.
1052 - Fixed formatting when both alignment and `0` are given
1053   (https://github.com/fmtlib/fmt/issues/3236,
1054   https://github.com/fmtlib/fmt/pull/3248). Thanks @ShawnZhong.
1056 - Improved Unicode support in the experimental file API on Windows
1057   (https://github.com/fmtlib/fmt/issues/3234,
1058   https://github.com/fmtlib/fmt/pull/3293). Thanks @Fros1er.
1060 - Unified UTF transcoding
1061   (https://github.com/fmtlib/fmt/pull/3416). Thanks @phprus.
1063 - Added support for UTF-8 digit separators via an experimental locale
1064   facet (https://github.com/fmtlib/fmt/issues/1861). For
1065   example ([godbolt](https://godbolt.org/z/f7bcznb3W)):
1067   ```c++
1068   auto loc = std::locale(
1069     std::locale(), new fmt::format_facet<std::locale>("’"));
1070   auto s = fmt::format(loc, "{:L}", 1000);
1071   ```
1073   where `’` is U+2019 used as a digit separator in the de_CH locale.
1075 - Added an overload of `formatted_size` that takes a locale
1076   (https://github.com/fmtlib/fmt/issues/3084,
1077   https://github.com/fmtlib/fmt/pull/3087). Thanks @gerboengels.
1079 - Removed the deprecated `FMT_DEPRECATED_OSTREAM`.
1081 - Fixed a UB when using a null `std::string_view` with
1082   `fmt::to_string` or format string compilation
1083   (https://github.com/fmtlib/fmt/issues/3241,
1084   https://github.com/fmtlib/fmt/pull/3244). Thanks @phprus.
1086 - Added `starts_with` to the fallback `string_view` implementation
1087   (https://github.com/fmtlib/fmt/pull/3080). Thanks @phprus.
1089 - Added `fmt::basic_format_string::get()` for compatibility with
1090   `basic_format_string`
1091   (https://github.com/fmtlib/fmt/pull/3111). Thanks @huangqinjin.
1093 - Added `println` for compatibility with C++23
1094   (https://github.com/fmtlib/fmt/pull/3267). Thanks @ShawnZhong.
1096 - Renamed the `FMT_EXPORT` macro for shared library usage to
1097   `FMT_LIB_EXPORT`.
1099 - Improved documentation
1100   (https://github.com/fmtlib/fmt/issues/3108,
1101   https://github.com/fmtlib/fmt/issues/3169,
1102   https://github.com/fmtlib/fmt/pull/3243).
1103   https://github.com/fmtlib/fmt/pull/3404,
1104   https://github.com/fmtlib/fmt/pull/4002).
1105   Thanks @Cleroth, @Vertexwahn and @yujincheng08.
1107 - Improved build configuration and tests
1108   (https://github.com/fmtlib/fmt/pull/3118,
1109   https://github.com/fmtlib/fmt/pull/3120,
1110   https://github.com/fmtlib/fmt/pull/3188,
1111   https://github.com/fmtlib/fmt/issues/3189,
1112   https://github.com/fmtlib/fmt/pull/3198,
1113   https://github.com/fmtlib/fmt/pull/3205,
1114   https://github.com/fmtlib/fmt/pull/3207,
1115   https://github.com/fmtlib/fmt/pull/3210,
1116   https://github.com/fmtlib/fmt/pull/3240,
1117   https://github.com/fmtlib/fmt/pull/3256,
1118   https://github.com/fmtlib/fmt/pull/3264,
1119   https://github.com/fmtlib/fmt/issues/3299,
1120   https://github.com/fmtlib/fmt/pull/3302,
1121   https://github.com/fmtlib/fmt/pull/3312,
1122   https://github.com/fmtlib/fmt/issues/3317,
1123   https://github.com/fmtlib/fmt/pull/3328,
1124   https://github.com/fmtlib/fmt/pull/3333,
1125   https://github.com/fmtlib/fmt/pull/3369,
1126   https://github.com/fmtlib/fmt/issues/3373,
1127   https://github.com/fmtlib/fmt/pull/3395,
1128   https://github.com/fmtlib/fmt/pull/3406,
1129   https://github.com/fmtlib/fmt/pull/3411).
1130   Thanks @dimztimz, @phprus, @DavidKorczynski, @ChrisThrasher,
1131   @FrancoisCarouge, @kennyweiss, @luzpaz, @codeinred, @Mixaill, @joycebrum,
1132   @kevinhwang and @Vertexwahn.
1134 - Fixed a regression in handling empty format specifiers after a colon
1135   (`{:}`) (https://github.com/fmtlib/fmt/pull/3086). Thanks @oxidase.
1137 - Worked around a broken implementation of
1138   `std::is_constant_evaluated` in some versions of libstdc++ on clang
1139   (https://github.com/fmtlib/fmt/issues/3247,
1140   https://github.com/fmtlib/fmt/pull/3281). Thanks @phprus.
1142 - Fixed formatting of volatile variables
1143   (https://github.com/fmtlib/fmt/pull/3068).
1145 - Fixed various warnings and compilation issues
1146   (https://github.com/fmtlib/fmt/pull/3057,
1147   https://github.com/fmtlib/fmt/pull/3066,
1148   https://github.com/fmtlib/fmt/pull/3072,
1149   https://github.com/fmtlib/fmt/pull/3082,
1150   https://github.com/fmtlib/fmt/pull/3091,
1151   https://github.com/fmtlib/fmt/issues/3092,
1152   https://github.com/fmtlib/fmt/pull/3093,
1153   https://github.com/fmtlib/fmt/pull/3095,
1154   https://github.com/fmtlib/fmt/issues/3096,
1155   https://github.com/fmtlib/fmt/pull/3097,
1156   https://github.com/fmtlib/fmt/issues/3128,
1157   https://github.com/fmtlib/fmt/pull/3129,
1158   https://github.com/fmtlib/fmt/pull/3137,
1159   https://github.com/fmtlib/fmt/pull/3139,
1160   https://github.com/fmtlib/fmt/issues/3140,
1161   https://github.com/fmtlib/fmt/pull/3142,
1162   https://github.com/fmtlib/fmt/issues/3149,
1163   https://github.com/fmtlib/fmt/pull/3150,
1164   https://github.com/fmtlib/fmt/issues/3154,
1165   https://github.com/fmtlib/fmt/issues/3163,
1166   https://github.com/fmtlib/fmt/issues/3178,
1167   https://github.com/fmtlib/fmt/pull/3184,
1168   https://github.com/fmtlib/fmt/pull/3196,
1169   https://github.com/fmtlib/fmt/issues/3204,
1170   https://github.com/fmtlib/fmt/pull/3206,
1171   https://github.com/fmtlib/fmt/pull/3208,
1172   https://github.com/fmtlib/fmt/issues/3213,
1173   https://github.com/fmtlib/fmt/pull/3216,
1174   https://github.com/fmtlib/fmt/issues/3224,
1175   https://github.com/fmtlib/fmt/issues/3226,
1176   https://github.com/fmtlib/fmt/issues/3228,
1177   https://github.com/fmtlib/fmt/pull/3229,
1178   https://github.com/fmtlib/fmt/pull/3259,
1179   https://github.com/fmtlib/fmt/issues/3274,
1180   https://github.com/fmtlib/fmt/issues/3287,
1181   https://github.com/fmtlib/fmt/pull/3288,
1182   https://github.com/fmtlib/fmt/issues/3292,
1183   https://github.com/fmtlib/fmt/pull/3295,
1184   https://github.com/fmtlib/fmt/pull/3296,
1185   https://github.com/fmtlib/fmt/issues/3298,
1186   https://github.com/fmtlib/fmt/issues/3325,
1187   https://github.com/fmtlib/fmt/pull/3326,
1188   https://github.com/fmtlib/fmt/issues/3334,
1189   https://github.com/fmtlib/fmt/issues/3342,
1190   https://github.com/fmtlib/fmt/pull/3343,
1191   https://github.com/fmtlib/fmt/issues/3351,
1192   https://github.com/fmtlib/fmt/pull/3352,
1193   https://github.com/fmtlib/fmt/pull/3362,
1194   https://github.com/fmtlib/fmt/issues/3365,
1195   https://github.com/fmtlib/fmt/pull/3366,
1196   https://github.com/fmtlib/fmt/pull/3374,
1197   https://github.com/fmtlib/fmt/issues/3377,
1198   https://github.com/fmtlib/fmt/pull/3378,
1199   https://github.com/fmtlib/fmt/issues/3381,
1200   https://github.com/fmtlib/fmt/pull/3398,
1201   https://github.com/fmtlib/fmt/pull/3413,
1202   https://github.com/fmtlib/fmt/issues/3415).
1203   Thanks @phprus, @gsjaardema, @NewbieOrange, @EngineLessCC, @asmaloney,
1204   @HazardyKnusperkeks, @sergiud, @Youw, @thesmurph, @czudziakm,
1205   @Roman-Koshelev, @chronoxor, @ShawnZhong, @russelltg, @glebm, @tmartin-gh,
1206   @Zhaojun-Liu, @louiswins and @mogemimi.
1208 # 9.1.0 - 2022-08-27
1210 - `fmt::formatted_size` now works at compile time
1211   (https://github.com/fmtlib/fmt/pull/3026). For example
1212   ([godbolt](https://godbolt.org/z/1MW5rMdf8)):
1214   ```c++
1215   #include <fmt/compile.h>
1217   int main() {
1218     using namespace fmt::literals;
1219     constexpr size_t n = fmt::formatted_size("{}"_cf, 42);
1220     fmt::print("{}\n", n); // prints 2
1221   }
1222   ```
1224   Thanks @marksantaniello.
1226 - Fixed handling of invalid UTF-8
1227   (https://github.com/fmtlib/fmt/pull/3038,
1228   https://github.com/fmtlib/fmt/pull/3044,
1229   https://github.com/fmtlib/fmt/pull/3056).
1230   Thanks @phprus and @skeeto.
1232 - Improved Unicode support in `ostream` overloads of `print`
1233   (https://github.com/fmtlib/fmt/pull/2994,
1234   https://github.com/fmtlib/fmt/pull/3001,
1235   https://github.com/fmtlib/fmt/pull/3025). Thanks @dimztimz.
1237 - Fixed handling of the sign specifier in localized formatting on
1238   systems with 32-bit `wchar_t`
1239   (https://github.com/fmtlib/fmt/issues/3041).
1241 - Added support for wide streams to `fmt::streamed`
1242   (https://github.com/fmtlib/fmt/pull/2994). Thanks @phprus.
1244 - Added the `n` specifier that disables the output of delimiters when
1245   formatting ranges (https://github.com/fmtlib/fmt/pull/2981,
1246   https://github.com/fmtlib/fmt/pull/2983). For example
1247   ([godbolt](https://godbolt.org/z/roKqGdj8c)):
1249   ```c++
1250   #include <fmt/ranges.h>
1251   #include <vector>
1253   int main() {
1254     auto v = std::vector{1, 2, 3};
1255     fmt::print("{:n}\n", v); // prints 1, 2, 3
1256   }
1257   ```
1259   Thanks @BRevzin.
1261 - Worked around problematic `std::string_view` constructors introduced
1262   in C++23 (https://github.com/fmtlib/fmt/issues/3030,
1263   https://github.com/fmtlib/fmt/issues/3050). Thanks @strega-nil-ms.
1265 - Improve handling (exclusion) of recursive ranges
1266   (https://github.com/fmtlib/fmt/issues/2968,
1267   https://github.com/fmtlib/fmt/pull/2974). Thanks @Dani-Hub.
1269 - Improved error reporting in format string compilation
1270   (https://github.com/fmtlib/fmt/issues/3055).
1272 - Improved the implementation of
1273   [Dragonbox](https://github.com/jk-jeon/dragonbox), the algorithm
1274   used for the default floating-point formatting
1275   (https://github.com/fmtlib/fmt/pull/2984). Thanks @jk-jeon.
1277 - Fixed issues with floating-point formatting on exotic platforms.
1279 - Improved the implementation of chrono formatting
1280   (https://github.com/fmtlib/fmt/pull/3010). Thanks @phprus.
1282 - Improved documentation
1283   (https://github.com/fmtlib/fmt/pull/2966,
1284   https://github.com/fmtlib/fmt/pull/3009,
1285   https://github.com/fmtlib/fmt/issues/3020,
1286   https://github.com/fmtlib/fmt/pull/3037).
1287   Thanks @mwinterb, @jcelerier and @remiburtin.
1289 - Improved build configuration
1290   (https://github.com/fmtlib/fmt/pull/2991,
1291   https://github.com/fmtlib/fmt/pull/2995,
1292   https://github.com/fmtlib/fmt/issues/3004,
1293   https://github.com/fmtlib/fmt/pull/3007,
1294   https://github.com/fmtlib/fmt/pull/3040).
1295   Thanks @dimztimz and @hwhsu1231.
1297 - Fixed various warnings and compilation issues
1298   (https://github.com/fmtlib/fmt/issues/2969,
1299   https://github.com/fmtlib/fmt/pull/2971,
1300   https://github.com/fmtlib/fmt/issues/2975,
1301   https://github.com/fmtlib/fmt/pull/2982,
1302   https://github.com/fmtlib/fmt/pull/2985,
1303   https://github.com/fmtlib/fmt/issues/2988,
1304   https://github.com/fmtlib/fmt/issues/2989,
1305   https://github.com/fmtlib/fmt/issues/3000,
1306   https://github.com/fmtlib/fmt/issues/3006,
1307   https://github.com/fmtlib/fmt/issues/3014,
1308   https://github.com/fmtlib/fmt/issues/3015,
1309   https://github.com/fmtlib/fmt/pull/3021,
1310   https://github.com/fmtlib/fmt/issues/3023,
1311   https://github.com/fmtlib/fmt/pull/3024,
1312   https://github.com/fmtlib/fmt/pull/3029,
1313   https://github.com/fmtlib/fmt/pull/3043,
1314   https://github.com/fmtlib/fmt/issues/3052,
1315   https://github.com/fmtlib/fmt/pull/3053,
1316   https://github.com/fmtlib/fmt/pull/3054).
1317   Thanks @h-friederich, @dimztimz, @olupton, @bernhardmgruber and @phprus.
1319 # 9.0.0 - 2022-07-04
1321 - Switched to the internal floating point formatter for all decimal
1322   presentation formats. In particular this results in consistent
1323   rounding on all platforms and removing the `s[n]printf` fallback for
1324   decimal FP formatting.
1326 - Compile-time floating point formatting no longer requires the
1327   header-only mode. For example
1328   ([godbolt](https://godbolt.org/z/G37PTeG3b)):
1330   ```c++
1331   #include <array>
1332   #include <fmt/compile.h>
1334   consteval auto compile_time_dtoa(double value) -> std::array<char, 10> {
1335     auto result = std::array<char, 10>();
1336     fmt::format_to(result.data(), FMT_COMPILE("{}"), value);
1337     return result;
1338   }
1340   constexpr auto answer = compile_time_dtoa(0.42);
1341   ```
1343   works with the default settings.
1345 - Improved the implementation of
1346   [Dragonbox](https://github.com/jk-jeon/dragonbox), the algorithm
1347   used for the default floating-point formatting
1348   (https://github.com/fmtlib/fmt/pull/2713,
1349   https://github.com/fmtlib/fmt/pull/2750). Thanks @jk-jeon.
1351 - Made `fmt::to_string` work with `__float128`. This uses the internal
1352   FP formatter and works even on system without `__float128` support
1353   in `[s]printf`.
1355 - Disabled automatic `std::ostream` insertion operator (`operator<<`)
1356   discovery when `fmt/ostream.h` is included to prevent ODR
1357   violations. You can get the old behavior by defining
1358   `FMT_DEPRECATED_OSTREAM` but this will be removed in the next major
1359   release. Use `fmt::streamed` or `fmt::ostream_formatter` to enable
1360   formatting via `std::ostream` instead.
1362 - Added `fmt::ostream_formatter` that can be used to write `formatter`
1363   specializations that perform formatting via `std::ostream`. For
1364   example ([godbolt](https://godbolt.org/z/5sEc5qMsf)):
1366   ```c++
1367   #include <fmt/ostream.h>
1369   struct date {
1370     int year, month, day;
1372     friend std::ostream& operator<<(std::ostream& os, const date& d) {
1373       return os << d.year << '-' << d.month << '-' << d.day;
1374     }
1375   };
1377   template <> struct fmt::formatter<date> : ostream_formatter {};
1379   std::string s = fmt::format("The date is {}", date{2012, 12, 9});
1380   // s == "The date is 2012-12-9"
1381   ```
1383 - Added the `fmt::streamed` function that takes an object and formats
1384   it via `std::ostream`. For example
1385   ([godbolt](https://godbolt.org/z/5G3346G1f)):
1387   ```c++
1388   #include <thread>
1389   #include <fmt/ostream.h>
1391   int main() {
1392     fmt::print("Current thread id: {}\n",
1393                fmt::streamed(std::this_thread::get_id()));
1394   }
1395   ```
1397   Note that `fmt/std.h` provides a `formatter` specialization for
1398   `std::thread::id` so you don\'t need to format it via
1399   `std::ostream`.
1401 - Deprecated implicit conversions of unscoped enums to integers for
1402   consistency with scoped enums.
1404 - Added an argument-dependent lookup based `format_as` extension API
1405   to simplify formatting of enums.
1407 - Added experimental `std::variant` formatting support
1408   (https://github.com/fmtlib/fmt/pull/2941). For example
1409   ([godbolt](https://godbolt.org/z/KG9z6cq68)):
1411   ```c++
1412   #include <variant>
1413   #include <fmt/std.h>
1415   int main() {
1416     auto v = std::variant<int, std::string>(42);
1417     fmt::print("{}\n", v);
1418   }
1419   ```
1421   prints:
1423       variant(42)
1425   Thanks @jehelset.
1427 - Added experimental `std::filesystem::path` formatting support
1428   (https://github.com/fmtlib/fmt/issues/2865,
1429   https://github.com/fmtlib/fmt/pull/2902,
1430   https://github.com/fmtlib/fmt/issues/2917,
1431   https://github.com/fmtlib/fmt/pull/2918). For example
1432   ([godbolt](https://godbolt.org/z/o44dMexEb)):
1434   ```c++
1435   #include <filesystem>
1436   #include <fmt/std.h>
1438   int main() {
1439     fmt::print("There is no place like {}.", std::filesystem::path("/home"));
1440   }
1441   ```
1443   prints:
1445       There is no place like "/home".
1447   Thanks @phprus.
1449 - Added a `std::thread::id` formatter to `fmt/std.h`. For example
1450   ([godbolt](https://godbolt.org/z/j1azbYf3E)):
1452   ```c++
1453   #include <thread>
1454   #include <fmt/std.h>
1456   int main() {
1457     fmt::print("Current thread id: {}\n", std::this_thread::get_id());
1458   }
1459   ```
1461 - Added `fmt::styled` that applies a text style to an individual
1462   argument (https://github.com/fmtlib/fmt/pull/2793). For
1463   example ([godbolt](https://godbolt.org/z/vWGW7v5M6)):
1465   ```c++
1466   #include <fmt/chrono.h>
1467   #include <fmt/color.h>
1469   int main() {
1470     auto now = std::chrono::system_clock::now();
1471     fmt::print(
1472       "[{}] {}: {}\n",
1473       fmt::styled(now, fmt::emphasis::bold),
1474       fmt::styled("error", fg(fmt::color::red)),
1475       "something went wrong");
1476   }
1477   ```
1479   prints
1481   ![](https://user-images.githubusercontent.com/576385/175071215-12809244-dab0-4005-96d8-7cd911c964d5.png)
1483   Thanks @rbrugo.
1485 - Made `fmt::print` overload for text styles correctly handle UTF-8
1486   (https://github.com/fmtlib/fmt/issues/2681,
1487   https://github.com/fmtlib/fmt/pull/2701). Thanks @AlexGuteniev.
1489 - Fixed Unicode handling when writing to an ostream.
1491 - Added support for nested specifiers to range formatting
1492   (https://github.com/fmtlib/fmt/pull/2673). For example
1493   ([godbolt](https://godbolt.org/z/xd3Gj38cf)):
1495   ```c++
1496   #include <vector>
1497   #include <fmt/ranges.h>
1499   int main() {
1500     fmt::print("{::#x}\n", std::vector{10, 20, 30});
1501   }
1502   ```
1504   prints `[0xa, 0x14, 0x1e]`.
1506   Thanks @BRevzin.
1508 - Implemented escaping of wide strings in ranges
1509   (https://github.com/fmtlib/fmt/pull/2904). Thanks @phprus.
1511 - Added support for ranges with `begin` / `end` found via the
1512   argument-dependent lookup
1513   (https://github.com/fmtlib/fmt/pull/2807). Thanks @rbrugo.
1515 - Fixed formatting of certain kinds of ranges of ranges
1516   (https://github.com/fmtlib/fmt/pull/2787). Thanks @BRevzin.
1518 - Fixed handling of maps with element types other than `std::pair`
1519   (https://github.com/fmtlib/fmt/pull/2944). Thanks @BrukerJWD.
1521 - Made tuple formatter enabled only if elements are formattable
1522   (https://github.com/fmtlib/fmt/issues/2939,
1523   https://github.com/fmtlib/fmt/pull/2940). Thanks @jehelset.
1525 - Made `fmt::join` compatible with format string compilation
1526   (https://github.com/fmtlib/fmt/issues/2719,
1527   https://github.com/fmtlib/fmt/pull/2720). Thanks @phprus.
1529 - Made compile-time checks work with named arguments of custom types
1530   and `std::ostream` `print` overloads
1531   (https://github.com/fmtlib/fmt/issues/2816,
1532   https://github.com/fmtlib/fmt/issues/2817,
1533   https://github.com/fmtlib/fmt/pull/2819). Thanks @timsong-cpp.
1535 - Removed `make_args_checked` because it is no longer needed for
1536   compile-time checks
1537   (https://github.com/fmtlib/fmt/pull/2760). Thanks @phprus.
1539 - Removed the following deprecated APIs: `_format`, `arg_join`, the
1540   `format_to` overload that takes a memory buffer, `[v]fprintf` that
1541   takes an `ostream`.
1543 - Removed the deprecated implicit conversion of `[const] signed char*`
1544   and `[const] unsigned char*` to C strings.
1546 - Removed the deprecated `fmt/locale.h`.
1548 - Replaced the deprecated `fileno()` with `descriptor()` in
1549   `buffered_file`.
1551 - Moved `to_string_view` to the `detail` namespace since it\'s an
1552   implementation detail.
1554 - Made access mode of a created file consistent with `fopen` by
1555   setting `S_IWGRP` and `S_IWOTH`
1556   (https://github.com/fmtlib/fmt/pull/2733). Thanks @arogge.
1558 - Removed a redundant buffer resize when formatting to `std::ostream`
1559   (https://github.com/fmtlib/fmt/issues/2842,
1560   https://github.com/fmtlib/fmt/pull/2843). Thanks @jcelerier.
1562 - Made precision computation for strings consistent with width
1563   (https://github.com/fmtlib/fmt/issues/2888).
1565 - Fixed handling of locale separators in floating point formatting
1566   (https://github.com/fmtlib/fmt/issues/2830).
1568 - Made sign specifiers work with `__int128_t`
1569   (https://github.com/fmtlib/fmt/issues/2773).
1571 - Improved support for systems such as CHERI with extra data stored in
1572   pointers (https://github.com/fmtlib/fmt/pull/2932).
1573   Thanks @davidchisnall.
1575 - Improved documentation
1576   (https://github.com/fmtlib/fmt/pull/2706,
1577   https://github.com/fmtlib/fmt/pull/2712,
1578   https://github.com/fmtlib/fmt/pull/2789,
1579   https://github.com/fmtlib/fmt/pull/2803,
1580   https://github.com/fmtlib/fmt/pull/2805,
1581   https://github.com/fmtlib/fmt/pull/2815,
1582   https://github.com/fmtlib/fmt/pull/2924).
1583   Thanks @BRevzin, @Pokechu22, @setoye, @rtobar, @rbrugo, @anoonD and
1584   @leha-bot.
1586 - Improved build configuration
1587   (https://github.com/fmtlib/fmt/pull/2766,
1588   https://github.com/fmtlib/fmt/pull/2772,
1589   https://github.com/fmtlib/fmt/pull/2836,
1590   https://github.com/fmtlib/fmt/pull/2852,
1591   https://github.com/fmtlib/fmt/pull/2907,
1592   https://github.com/fmtlib/fmt/pull/2913,
1593   https://github.com/fmtlib/fmt/pull/2914).
1594   Thanks @kambala-decapitator, @mattiasljungstrom, @kieselnb, @nathannaveen
1595   and @Vertexwahn.
1597 - Fixed various warnings and compilation issues
1598   (https://github.com/fmtlib/fmt/issues/2408,
1599   https://github.com/fmtlib/fmt/issues/2507,
1600   https://github.com/fmtlib/fmt/issues/2697,
1601   https://github.com/fmtlib/fmt/issues/2715,
1602   https://github.com/fmtlib/fmt/issues/2717,
1603   https://github.com/fmtlib/fmt/pull/2722,
1604   https://github.com/fmtlib/fmt/pull/2724,
1605   https://github.com/fmtlib/fmt/pull/2725,
1606   https://github.com/fmtlib/fmt/issues/2726,
1607   https://github.com/fmtlib/fmt/pull/2728,
1608   https://github.com/fmtlib/fmt/pull/2732,
1609   https://github.com/fmtlib/fmt/issues/2738,
1610   https://github.com/fmtlib/fmt/pull/2742,
1611   https://github.com/fmtlib/fmt/issues/2744,
1612   https://github.com/fmtlib/fmt/issues/2745,
1613   https://github.com/fmtlib/fmt/issues/2746,
1614   https://github.com/fmtlib/fmt/issues/2754,
1615   https://github.com/fmtlib/fmt/pull/2755,
1616   https://github.com/fmtlib/fmt/issues/2757,
1617   https://github.com/fmtlib/fmt/pull/2758,
1618   https://github.com/fmtlib/fmt/issues/2761,
1619   https://github.com/fmtlib/fmt/pull/2762,
1620   https://github.com/fmtlib/fmt/issues/2763,
1621   https://github.com/fmtlib/fmt/pull/2765,
1622   https://github.com/fmtlib/fmt/issues/2769,
1623   https://github.com/fmtlib/fmt/pull/2770,
1624   https://github.com/fmtlib/fmt/issues/2771,
1625   https://github.com/fmtlib/fmt/issues/2777,
1626   https://github.com/fmtlib/fmt/pull/2779,
1627   https://github.com/fmtlib/fmt/pull/2782,
1628   https://github.com/fmtlib/fmt/pull/2783,
1629   https://github.com/fmtlib/fmt/issues/2794,
1630   https://github.com/fmtlib/fmt/issues/2796,
1631   https://github.com/fmtlib/fmt/pull/2797,
1632   https://github.com/fmtlib/fmt/pull/2801,
1633   https://github.com/fmtlib/fmt/pull/2802,
1634   https://github.com/fmtlib/fmt/issues/2808,
1635   https://github.com/fmtlib/fmt/issues/2818,
1636   https://github.com/fmtlib/fmt/pull/2819,
1637   https://github.com/fmtlib/fmt/issues/2829,
1638   https://github.com/fmtlib/fmt/issues/2835,
1639   https://github.com/fmtlib/fmt/issues/2848,
1640   https://github.com/fmtlib/fmt/issues/2860,
1641   https://github.com/fmtlib/fmt/pull/2861,
1642   https://github.com/fmtlib/fmt/pull/2882,
1643   https://github.com/fmtlib/fmt/issues/2886,
1644   https://github.com/fmtlib/fmt/issues/2891,
1645   https://github.com/fmtlib/fmt/pull/2892,
1646   https://github.com/fmtlib/fmt/issues/2895,
1647   https://github.com/fmtlib/fmt/issues/2896,
1648   https://github.com/fmtlib/fmt/pull/2903,
1649   https://github.com/fmtlib/fmt/issues/2906,
1650   https://github.com/fmtlib/fmt/issues/2908,
1651   https://github.com/fmtlib/fmt/pull/2909,
1652   https://github.com/fmtlib/fmt/issues/2920,
1653   https://github.com/fmtlib/fmt/pull/2922,
1654   https://github.com/fmtlib/fmt/pull/2927,
1655   https://github.com/fmtlib/fmt/pull/2929,
1656   https://github.com/fmtlib/fmt/issues/2936,
1657   https://github.com/fmtlib/fmt/pull/2937,
1658   https://github.com/fmtlib/fmt/pull/2938,
1659   https://github.com/fmtlib/fmt/pull/2951,
1660   https://github.com/fmtlib/fmt/issues/2954,
1661   https://github.com/fmtlib/fmt/pull/2957,
1662   https://github.com/fmtlib/fmt/issues/2958,
1663   https://github.com/fmtlib/fmt/pull/2960).
1664   Thanks @matrackif @Tobi823, @ivan-volnov, @VasiliPupkin256,
1665   @federico-busato, @barcharcraz, @jk-jeon, @HazardyKnusperkeks, @dalboris,
1666   @seanm, @gsjaardema, @timsong-cpp, @seanm, @frithrah, @chronoxor, @Agga,
1667   @madmaxoft, @JurajX, @phprus and @Dani-Hub.
1669 # 8.1.1 - 2022-01-06
1671 - Restored ABI compatibility with version 8.0.x
1672   (https://github.com/fmtlib/fmt/issues/2695,
1673   https://github.com/fmtlib/fmt/pull/2696). Thanks @saraedum.
1674 - Fixed chrono formatting on big endian systems
1675   (https://github.com/fmtlib/fmt/issues/2698,
1676   https://github.com/fmtlib/fmt/pull/2699).
1677   Thanks @phprus and @xvitaly.
1678 - Fixed a linkage error with mingw
1679   (https://github.com/fmtlib/fmt/issues/2691,
1680   https://github.com/fmtlib/fmt/pull/2692). Thanks @rbberger.
1682 # 8.1.0 - 2022-01-02
1684 - Optimized chrono formatting
1685   (https://github.com/fmtlib/fmt/pull/2500,
1686   https://github.com/fmtlib/fmt/pull/2537,
1687   https://github.com/fmtlib/fmt/issues/2541,
1688   https://github.com/fmtlib/fmt/pull/2544,
1689   https://github.com/fmtlib/fmt/pull/2550,
1690   https://github.com/fmtlib/fmt/pull/2551,
1691   https://github.com/fmtlib/fmt/pull/2576,
1692   https://github.com/fmtlib/fmt/issues/2577,
1693   https://github.com/fmtlib/fmt/pull/2586,
1694   https://github.com/fmtlib/fmt/pull/2591,
1695   https://github.com/fmtlib/fmt/pull/2594,
1696   https://github.com/fmtlib/fmt/pull/2602,
1697   https://github.com/fmtlib/fmt/pull/2617,
1698   https://github.com/fmtlib/fmt/issues/2628,
1699   https://github.com/fmtlib/fmt/pull/2633,
1700   https://github.com/fmtlib/fmt/issues/2670,
1701   https://github.com/fmtlib/fmt/pull/2671).
1703   Processing of some specifiers such as `%z` and `%Y` is now up to
1704   10-20 times faster, for example on GCC 11 with libstdc++:
1706       ----------------------------------------------------------------------------
1707       Benchmark                                  Before             After
1708       ----------------------------------------------------------------------------
1709       FMTFormatter_z                             261 ns             26.3 ns
1710       FMTFormatterCompile_z                      246 ns             11.6 ns
1711       FMTFormatter_Y                             263 ns             26.1 ns
1712       FMTFormatterCompile_Y                      244 ns             10.5 ns
1713       ----------------------------------------------------------------------------
1715   Thanks @phprus and @toughengineer.
1717 - Implemented subsecond formatting for chrono durations
1718   (https://github.com/fmtlib/fmt/pull/2623). For example
1719   ([godbolt](https://godbolt.org/z/es7vWTETe)):
1721   ```c++
1722   #include <fmt/chrono.h>
1724   int main() {
1725     fmt::print("{:%S}", std::chrono::milliseconds(1234));
1726   }
1727   ```
1729   prints \"01.234\".
1731   Thanks @matrackif.
1733 - Fixed handling of precision 0 when formatting chrono durations
1734   (https://github.com/fmtlib/fmt/issues/2587,
1735   https://github.com/fmtlib/fmt/pull/2588). Thanks @lukester1975.
1737 - Fixed an overflow on invalid inputs in the `tm` formatter
1738   (https://github.com/fmtlib/fmt/pull/2564). Thanks @phprus.
1740 - Added `fmt::group_digits` that formats integers with a non-localized
1741   digit separator (comma) for groups of three digits. For example
1742   ([godbolt](https://godbolt.org/z/TxGxG9Poq)):
1744   ```c++
1745   #include <fmt/format.h>
1747   int main() {
1748     fmt::print("{} dollars", fmt::group_digits(1000000));
1749   }
1750   ```
1752   prints \"1,000,000 dollars\".
1754 - Added support for faint, conceal, reverse and blink text styles
1755   (https://github.com/fmtlib/fmt/pull/2394):
1757   <https://user-images.githubusercontent.com/576385/147710227-c68f5317-f8fa-42c3-9123-7c4ba3c398cb.mp4>
1759   Thanks @benit8 and @data-man.
1761 - Added experimental support for compile-time floating point
1762   formatting (https://github.com/fmtlib/fmt/pull/2426,
1763   https://github.com/fmtlib/fmt/pull/2470). It is currently
1764   limited to the header-only mode. Thanks @alexezeder.
1766 - Added UDL-based named argument support to compile-time format string
1767   checks (https://github.com/fmtlib/fmt/issues/2640,
1768   https://github.com/fmtlib/fmt/pull/2649). For example
1769   ([godbolt](https://godbolt.org/z/ohGbbvonv)):
1771   ```c++
1772   #include <fmt/format.h>
1774   int main() {
1775     using namespace fmt::literals;
1776     fmt::print("{answer:s}", "answer"_a=42);
1777   }
1778   ```
1780   gives a compile-time error on compilers with C++20 `consteval` and
1781   non-type template parameter support (gcc 10+) because `s` is not a
1782   valid format specifier for an integer.
1784   Thanks @alexezeder.
1786 - Implemented escaping of string range elements. For example
1787   ([godbolt](https://godbolt.org/z/rKvM1vKf3)):
1789   ```c++
1790   #include <fmt/ranges.h>
1791   #include <vector>
1793   int main() {
1794     fmt::print("{}", std::vector<std::string>{"\naan"});
1795   }
1796   ```
1798   is now printed as:
1800       ["\naan"]
1802   instead of:
1804       ["
1805       aan"]
1807 - Added an experimental `?` specifier for escaping strings.
1808   (https://github.com/fmtlib/fmt/pull/2674). Thanks @BRevzin.
1810 - Switched to JSON-like representation of maps and sets for
1811   consistency with Python\'s `str.format`. For example
1812   ([godbolt](https://godbolt.org/z/seKjoY9W5)):
1814   ```c++
1815   #include <fmt/ranges.h>
1816   #include <map>
1818   int main() {
1819     fmt::print("{}", std::map<std::string, int>{{"answer", 42}});
1820   }
1821   ```
1823   is now printed as:
1825       {"answer": 42}
1827 - Extended `fmt::join` to support C++20-only ranges
1828   (https://github.com/fmtlib/fmt/pull/2549). Thanks @BRevzin.
1830 - Optimized handling of non-const-iterable ranges and implemented
1831   initial support for non-const-formattable types.
1833 - Disabled implicit conversions of scoped enums to integers that was
1834   accidentally introduced in earlier versions
1835   (https://github.com/fmtlib/fmt/pull/1841).
1837 - Deprecated implicit conversion of `[const] signed char*` and
1838   `[const] unsigned char*` to C strings.
1840 - Deprecated `_format`, a legacy UDL-based format API
1841   (https://github.com/fmtlib/fmt/pull/2646). Thanks @alexezeder.
1843 - Marked `format`, `formatted_size` and `to_string` as `[[nodiscard]]`
1844   (https://github.com/fmtlib/fmt/pull/2612). @0x8000-0000.
1846 - Added missing diagnostic when trying to format function and member
1847   pointers as well as objects convertible to pointers which is
1848   explicitly disallowed
1849   (https://github.com/fmtlib/fmt/issues/2598,
1850   https://github.com/fmtlib/fmt/pull/2609,
1851   https://github.com/fmtlib/fmt/pull/2610). Thanks @AlexGuteniev.
1853 - Optimized writing to a contiguous buffer with `format_to_n`
1854   (https://github.com/fmtlib/fmt/pull/2489). Thanks @Roman-Koshelev.
1856 - Optimized writing to non-`char` buffers
1857   (https://github.com/fmtlib/fmt/pull/2477). Thanks @Roman-Koshelev.
1859 - Decimal point is now localized when using the `L` specifier.
1861 - Improved floating point formatter implementation
1862   (https://github.com/fmtlib/fmt/pull/2498,
1863   https://github.com/fmtlib/fmt/pull/2499). Thanks @Roman-Koshelev.
1865 - Fixed handling of very large precision in fixed format
1866   (https://github.com/fmtlib/fmt/pull/2616).
1868 - Made a table of cached powers used in FP formatting static
1869   (https://github.com/fmtlib/fmt/pull/2509). Thanks @jk-jeon.
1871 - Resolved a lookup ambiguity with C++20 format-related functions due
1872   to ADL (https://github.com/fmtlib/fmt/issues/2639,
1873   https://github.com/fmtlib/fmt/pull/2641). Thanks @mkurdej.
1875 - Removed unnecessary inline namespace qualification
1876   (https://github.com/fmtlib/fmt/issues/2642,
1877   https://github.com/fmtlib/fmt/pull/2643). Thanks @mkurdej.
1879 - Implemented argument forwarding in `format_to_n`
1880   (https://github.com/fmtlib/fmt/issues/2462,
1881   https://github.com/fmtlib/fmt/pull/2463). Thanks @owent.
1883 - Fixed handling of implicit conversions in `fmt::to_string` and
1884   format string compilation
1885   (https://github.com/fmtlib/fmt/issues/2565).
1887 - Changed the default access mode of files created by
1888   `fmt::output_file` to `-rw-r--r--` for consistency with `fopen`
1889   (https://github.com/fmtlib/fmt/issues/2530).
1891 - Make `fmt::ostream::flush` public
1892   (https://github.com/fmtlib/fmt/issues/2435).
1894 - Improved C++14/17 attribute detection
1895   (https://github.com/fmtlib/fmt/pull/2615). Thanks @AlexGuteniev.
1897 - Improved `consteval` detection for MSVC
1898   (https://github.com/fmtlib/fmt/pull/2559). Thanks @DanielaE.
1900 - Improved documentation
1901   (https://github.com/fmtlib/fmt/issues/2406,
1902   https://github.com/fmtlib/fmt/pull/2446,
1903   https://github.com/fmtlib/fmt/issues/2493,
1904   https://github.com/fmtlib/fmt/issues/2513,
1905   https://github.com/fmtlib/fmt/pull/2515,
1906   https://github.com/fmtlib/fmt/issues/2522,
1907   https://github.com/fmtlib/fmt/pull/2562,
1908   https://github.com/fmtlib/fmt/pull/2575,
1909   https://github.com/fmtlib/fmt/pull/2606,
1910   https://github.com/fmtlib/fmt/pull/2620,
1911   https://github.com/fmtlib/fmt/issues/2676).
1912   Thanks @sobolevn, @UnePierre, @zhsj, @phprus, @ericcurtin and @Lounarok.
1914 - Improved fuzzers and added a fuzzer for chrono timepoint formatting
1915   (https://github.com/fmtlib/fmt/pull/2461,
1916   https://github.com/fmtlib/fmt/pull/2469). @pauldreik,
1918 - Added the `FMT_SYSTEM_HEADERS` CMake option setting which marks
1919   {fmt}\'s headers as system. It can be used to suppress warnings
1920   (https://github.com/fmtlib/fmt/issues/2644,
1921   https://github.com/fmtlib/fmt/pull/2651). Thanks @alexezeder.
1923 - Added the Bazel build system support
1924   (https://github.com/fmtlib/fmt/pull/2505,
1925   https://github.com/fmtlib/fmt/pull/2516). Thanks @Vertexwahn.
1927 - Improved build configuration and tests
1928   (https://github.com/fmtlib/fmt/issues/2437,
1929   https://github.com/fmtlib/fmt/pull/2558,
1930   https://github.com/fmtlib/fmt/pull/2648,
1931   https://github.com/fmtlib/fmt/pull/2650,
1932   https://github.com/fmtlib/fmt/pull/2663,
1933   https://github.com/fmtlib/fmt/pull/2677).
1934   Thanks @DanielaE, @alexezeder and @phprus.
1936 - Fixed various warnings and compilation issues
1937   (https://github.com/fmtlib/fmt/pull/2353,
1938   https://github.com/fmtlib/fmt/pull/2356,
1939   https://github.com/fmtlib/fmt/pull/2399,
1940   https://github.com/fmtlib/fmt/issues/2408,
1941   https://github.com/fmtlib/fmt/pull/2414,
1942   https://github.com/fmtlib/fmt/pull/2427,
1943   https://github.com/fmtlib/fmt/pull/2432,
1944   https://github.com/fmtlib/fmt/pull/2442,
1945   https://github.com/fmtlib/fmt/pull/2434,
1946   https://github.com/fmtlib/fmt/issues/2439,
1947   https://github.com/fmtlib/fmt/pull/2447,
1948   https://github.com/fmtlib/fmt/pull/2450,
1949   https://github.com/fmtlib/fmt/issues/2455,
1950   https://github.com/fmtlib/fmt/issues/2465,
1951   https://github.com/fmtlib/fmt/issues/2472,
1952   https://github.com/fmtlib/fmt/issues/2474,
1953   https://github.com/fmtlib/fmt/pull/2476,
1954   https://github.com/fmtlib/fmt/issues/2478,
1955   https://github.com/fmtlib/fmt/issues/2479,
1956   https://github.com/fmtlib/fmt/issues/2481,
1957   https://github.com/fmtlib/fmt/pull/2482,
1958   https://github.com/fmtlib/fmt/pull/2483,
1959   https://github.com/fmtlib/fmt/issues/2490,
1960   https://github.com/fmtlib/fmt/pull/2491,
1961   https://github.com/fmtlib/fmt/pull/2510,
1962   https://github.com/fmtlib/fmt/pull/2518,
1963   https://github.com/fmtlib/fmt/issues/2528,
1964   https://github.com/fmtlib/fmt/pull/2529,
1965   https://github.com/fmtlib/fmt/pull/2539,
1966   https://github.com/fmtlib/fmt/issues/2540,
1967   https://github.com/fmtlib/fmt/pull/2545,
1968   https://github.com/fmtlib/fmt/pull/2555,
1969   https://github.com/fmtlib/fmt/issues/2557,
1970   https://github.com/fmtlib/fmt/issues/2570,
1971   https://github.com/fmtlib/fmt/pull/2573,
1972   https://github.com/fmtlib/fmt/pull/2582,
1973   https://github.com/fmtlib/fmt/issues/2605,
1974   https://github.com/fmtlib/fmt/pull/2611,
1975   https://github.com/fmtlib/fmt/pull/2647,
1976   https://github.com/fmtlib/fmt/issues/2627,
1977   https://github.com/fmtlib/fmt/pull/2630,
1978   https://github.com/fmtlib/fmt/issues/2635,
1979   https://github.com/fmtlib/fmt/issues/2638,
1980   https://github.com/fmtlib/fmt/issues/2653,
1981   https://github.com/fmtlib/fmt/issues/2654,
1982   https://github.com/fmtlib/fmt/issues/2661,
1983   https://github.com/fmtlib/fmt/pull/2664,
1984   https://github.com/fmtlib/fmt/pull/2684).
1985   Thanks @DanielaE, @mwinterb, @cdacamar, @TrebledJ, @bodomartin, @cquammen,
1986   @white238, @mmarkeloff, @palacaze, @jcelerier, @mborn-adi, @BrukerJWD,
1987   @spyridon97, @phprus, @oliverlee, @joshessman-llnl, @akohlmey, @timkalu,
1988   @olupton, @Acretock, @alexezeder, @andrewcorrigan, @lucpelletier and
1989   @HazardyKnusperkeks.
1991 # 8.0.1 - 2021-07-02
1993 - Fixed the version number in the inline namespace
1994   (https://github.com/fmtlib/fmt/issues/2374).
1995 - Added a missing presentation type check for `std::string`
1996   (https://github.com/fmtlib/fmt/issues/2402).
1997 - Fixed a linkage error when mixing code built with clang and gcc
1998   (https://github.com/fmtlib/fmt/issues/2377).
1999 - Fixed documentation issues
2000   (https://github.com/fmtlib/fmt/pull/2396,
2001   https://github.com/fmtlib/fmt/issues/2403,
2002   https://github.com/fmtlib/fmt/issues/2406). Thanks @mkurdej.
2003 - Removed dead code in FP formatter (
2004   https://github.com/fmtlib/fmt/pull/2398). Thanks @javierhonduco.
2005 - Fixed various warnings and compilation issues
2006   (https://github.com/fmtlib/fmt/issues/2351,
2007   https://github.com/fmtlib/fmt/issues/2359,
2008   https://github.com/fmtlib/fmt/pull/2365,
2009   https://github.com/fmtlib/fmt/issues/2368,
2010   https://github.com/fmtlib/fmt/pull/2370,
2011   https://github.com/fmtlib/fmt/pull/2376,
2012   https://github.com/fmtlib/fmt/pull/2381,
2013   https://github.com/fmtlib/fmt/pull/2382,
2014   https://github.com/fmtlib/fmt/issues/2386,
2015   https://github.com/fmtlib/fmt/pull/2389,
2016   https://github.com/fmtlib/fmt/pull/2395,
2017   https://github.com/fmtlib/fmt/pull/2397,
2018   https://github.com/fmtlib/fmt/issues/2400,
2019   https://github.com/fmtlib/fmt/issues/2401,
2020   https://github.com/fmtlib/fmt/pull/2407).
2021   Thanks @zx2c4, @AidanSun05, @mattiasljungstrom, @joemmett, @erengy,
2022   @patlkli, @gsjaardema and @phprus.
2024 # 8.0.0 - 2021-06-21
2026 - Enabled compile-time format string checks by default. For example
2027   ([godbolt](https://godbolt.org/z/sMxcohGjz)):
2029   ```c++
2030   #include <fmt/core.h>
2032   int main() {
2033     fmt::print("{:d}", "I am not a number");
2034   }
2035   ```
2037   gives a compile-time error on compilers with C++20 `consteval`
2038   support (gcc 10+, clang 11+) because `d` is not a valid format
2039   specifier for a string.
2041   To pass a runtime string wrap it in `fmt::runtime`:
2043   ```c++
2044   fmt::print(fmt::runtime("{:d}"), "I am not a number");
2045   ```
2047 - Added compile-time formatting
2048   (https://github.com/fmtlib/fmt/pull/2019,
2049   https://github.com/fmtlib/fmt/pull/2044,
2050   https://github.com/fmtlib/fmt/pull/2056,
2051   https://github.com/fmtlib/fmt/pull/2072,
2052   https://github.com/fmtlib/fmt/pull/2075,
2053   https://github.com/fmtlib/fmt/issues/2078,
2054   https://github.com/fmtlib/fmt/pull/2129,
2055   https://github.com/fmtlib/fmt/pull/2326). For example
2056   ([godbolt](https://godbolt.org/z/Mxx9d89jM)):
2058   ```c++
2059   #include <fmt/compile.h>
2061   consteval auto compile_time_itoa(int value) -> std::array<char, 10> {
2062     auto result = std::array<char, 10>();
2063     fmt::format_to(result.data(), FMT_COMPILE("{}"), value);
2064     return result;
2065   }
2067   constexpr auto answer = compile_time_itoa(42);
2068   ```
2070   Most of the formatting functionality is available at compile time
2071   with a notable exception of floating-point numbers and pointers.
2072   Thanks @alexezeder.
2074 - Optimized handling of format specifiers during format string
2075   compilation. For example, hexadecimal formatting (`"{:x}"`) is now
2076   3-7x faster than before when using `format_to` with format string
2077   compilation and a stack-allocated buffer
2078   (https://github.com/fmtlib/fmt/issues/1944).
2080   Before (7.1.3):
2082       ----------------------------------------------------------------------------
2083       Benchmark                                  Time             CPU   Iterations
2084       ----------------------------------------------------------------------------
2085       FMTCompileOld/0                         15.5 ns         15.5 ns     43302898
2086       FMTCompileOld/42                        16.6 ns         16.6 ns     43278267
2087       FMTCompileOld/273123                    18.7 ns         18.6 ns     37035861
2088       FMTCompileOld/9223372036854775807       19.4 ns         19.4 ns     35243000
2089       ----------------------------------------------------------------------------
2091   After (8.x):
2093       ----------------------------------------------------------------------------
2094       Benchmark                                  Time             CPU   Iterations
2095       ----------------------------------------------------------------------------
2096       FMTCompileNew/0                         1.99 ns         1.99 ns    360523686
2097       FMTCompileNew/42                        2.33 ns         2.33 ns    279865664
2098       FMTCompileNew/273123                    3.72 ns         3.71 ns    190230315
2099       FMTCompileNew/9223372036854775807       5.28 ns         5.26 ns    130711631
2100       ----------------------------------------------------------------------------
2102   It is even faster than `std::to_chars` from libc++ compiled with
2103   clang on macOS:
2105       ----------------------------------------------------------------------------
2106       Benchmark                                  Time             CPU   Iterations
2107       ----------------------------------------------------------------------------
2108       ToChars/0                               4.42 ns         4.41 ns    160196630
2109       ToChars/42                              5.00 ns         4.98 ns    140735201
2110       ToChars/273123                          7.26 ns         7.24 ns     95784130
2111       ToChars/9223372036854775807             8.77 ns         8.75 ns     75872534
2112       ----------------------------------------------------------------------------
2114   In other cases, especially involving `std::string` construction, the
2115   speed up is usually lower because handling format specifiers takes a
2116   smaller fraction of the total time.
2118 - Added the `_cf` user-defined literal to represent a compiled format
2119   string. It can be used instead of the `FMT_COMPILE` macro
2120   (https://github.com/fmtlib/fmt/pull/2043,
2121   https://github.com/fmtlib/fmt/pull/2242):
2123   ```c++
2124   #include <fmt/compile.h>
2126   using namespace fmt::literals;
2127   auto s = fmt::format(FMT_COMPILE("{}"), 42); // 🙁 not modern
2128   auto s = fmt::format("{}"_cf, 42);           // 🙂 modern as hell
2129   ```
2131   It requires compiler support for class types in non-type template
2132   parameters (a C++20 feature) which is available in GCC 9.3+.
2133   Thanks @alexezeder.
2135 - Format string compilation now requires `format` functions of
2136   `formatter` specializations for user-defined types to be `const`:
2138   ```c++
2139   template <> struct fmt::formatter<my_type>: formatter<string_view> {
2140     template <typename FormatContext>
2141     auto format(my_type obj, FormatContext& ctx) const {  // Note const here.
2142       // ...
2143     }
2144   };
2145   ```
2147 - Added UDL-based named argument support to format string compilation
2148   (https://github.com/fmtlib/fmt/pull/2243,
2149   https://github.com/fmtlib/fmt/pull/2281). For example:
2151   ```c++
2152   #include <fmt/compile.h>
2154   using namespace fmt::literals;
2155   auto s = fmt::format(FMT_COMPILE("{answer}"), "answer"_a = 42);
2156   ```
2158   Here the argument named \"answer\" is resolved at compile time with
2159   no runtime overhead. Thanks @alexezeder.
2161 - Added format string compilation support to `fmt::print`
2162   (https://github.com/fmtlib/fmt/issues/2280,
2163   https://github.com/fmtlib/fmt/pull/2304). Thanks @alexezeder.
2165 - Added initial support for compiling {fmt} as a C++20 module
2166   (https://github.com/fmtlib/fmt/pull/2235,
2167   https://github.com/fmtlib/fmt/pull/2240,
2168   https://github.com/fmtlib/fmt/pull/2260,
2169   https://github.com/fmtlib/fmt/pull/2282,
2170   https://github.com/fmtlib/fmt/pull/2283,
2171   https://github.com/fmtlib/fmt/pull/2288,
2172   https://github.com/fmtlib/fmt/pull/2298,
2173   https://github.com/fmtlib/fmt/pull/2306,
2174   https://github.com/fmtlib/fmt/pull/2307,
2175   https://github.com/fmtlib/fmt/pull/2309,
2176   https://github.com/fmtlib/fmt/pull/2318,
2177   https://github.com/fmtlib/fmt/pull/2324,
2178   https://github.com/fmtlib/fmt/pull/2332,
2179   https://github.com/fmtlib/fmt/pull/2340). Thanks @DanielaE.
2181 - Made symbols private by default reducing shared library size
2182   (https://github.com/fmtlib/fmt/pull/2301). For example
2183   there was a \~15% reported reduction on one platform. Thanks @sergiud.
2185 - Optimized includes making the result of preprocessing `fmt/format.h`
2186   \~20% smaller with libstdc++/C++20 and slightly improving build
2187   times (https://github.com/fmtlib/fmt/issues/1998).
2189 - Added support of ranges with non-const `begin` / `end`
2190   (https://github.com/fmtlib/fmt/pull/1953). Thanks @kitegi.
2192 - Added support of `std::byte` and other formattable types to
2193   `fmt::join` (https://github.com/fmtlib/fmt/issues/1981,
2194   https://github.com/fmtlib/fmt/issues/2040,
2195   https://github.com/fmtlib/fmt/pull/2050,
2196   https://github.com/fmtlib/fmt/issues/2262). For example:
2198   ```c++
2199   #include <fmt/format.h>
2200   #include <cstddef>
2201   #include <vector>
2203   int main() {
2204     auto bytes = std::vector{std::byte(4), std::byte(2)};
2205     fmt::print("{}", fmt::join(bytes, ""));
2206   }
2207   ```
2209   prints \"42\".
2211   Thanks @kamibo.
2213 - Implemented the default format for `std::chrono::system_clock`
2214   (https://github.com/fmtlib/fmt/issues/2319,
2215   https://github.com/fmtlib/fmt/pull/2345). For example:
2217   ```c++
2218   #include <fmt/chrono.h>
2220   int main() {
2221     fmt::print("{}", std::chrono::system_clock::now());
2222   }
2223   ```
2225   prints \"2021-06-18 15:22:00\" (the output depends on the current
2226   date and time). Thanks @sunmy2019.
2228 - Made more chrono specifiers locale independent by default. Use the
2229   `'L'` specifier to get localized formatting. For example:
2231   ```c++
2232   #include <fmt/chrono.h>
2234   int main() {
2235     std::locale::global(std::locale("ru_RU.UTF-8"));
2236     auto monday = std::chrono::weekday(1);
2237     fmt::print("{}\n", monday);   // prints "Mon"
2238     fmt::print("{:L}\n", monday); // prints "пн"
2239   }
2240   ```
2242 - Improved locale handling in chrono formatting
2243   (https://github.com/fmtlib/fmt/issues/2337,
2244   https://github.com/fmtlib/fmt/pull/2349,
2245   https://github.com/fmtlib/fmt/pull/2350). Thanks @phprus.
2247 - Deprecated `fmt/locale.h` moving the formatting functions that take
2248   a locale to `fmt/format.h` (`char`) and `fmt/xchar` (other
2249   overloads). This doesn\'t introduce a dependency on `<locale>` so
2250   there is virtually no compile time effect.
2252 - Deprecated an undocumented `format_to` overload that takes
2253   `basic_memory_buffer`.
2255 - Made parameter order in `vformat_to` consistent with `format_to`
2256   (https://github.com/fmtlib/fmt/issues/2327).
2258 - Added support for time points with arbitrary durations
2259   (https://github.com/fmtlib/fmt/issues/2208). For example:
2261   ```c++
2262   #include <fmt/chrono.h>
2264   int main() {
2265     using tp = std::chrono::time_point<
2266       std::chrono::system_clock, std::chrono::seconds>;
2267     fmt::print("{:%S}", tp(std::chrono::seconds(42)));
2268   }
2269   ```
2271   prints \"42\".
2273 - Formatting floating-point numbers no longer produces trailing zeros
2274   by default for consistency with `std::format`. For example:
2276   ```c++
2277   #include <fmt/core.h>
2279   int main() {
2280     fmt::print("{0:.3}", 1.1);
2281   }
2282   ```
2284   prints \"1.1\". Use the `'#'` specifier to keep trailing zeros.
2286 - Dropped a limit on the number of elements in a range and replaced
2287   `{}` with `[]` as range delimiters for consistency with Python\'s
2288   `str.format`.
2290 - The `'L'` specifier for locale-specific numeric formatting can now
2291   be combined with presentation specifiers as in `std::format`. For
2292   example:
2294   ```c++
2295   #include <fmt/core.h>
2296   #include <locale>
2298   int main() {
2299     std::locale::global(std::locale("fr_FR.UTF-8"));
2300     fmt::print("{0:.2Lf}", 0.42);
2301   }
2302   ```
2304   prints \"0,42\". The deprecated `'n'` specifier has been removed.
2306 - Made the `0` specifier ignored for infinity and NaN
2307   (https://github.com/fmtlib/fmt/issues/2305,
2308   https://github.com/fmtlib/fmt/pull/2310). Thanks @Liedtke.
2310 - Made the hexfloat formatting use the right alignment by default
2311   (https://github.com/fmtlib/fmt/issues/2308,
2312   https://github.com/fmtlib/fmt/pull/2317). Thanks @Liedtke.
2314 - Removed the deprecated numeric alignment (`'='`). Use the `'0'`
2315   specifier instead.
2317 - Removed the deprecated `fmt/posix.h` header that has been replaced
2318   with `fmt/os.h`.
2320 - Removed the deprecated `format_to_n_context`, `format_to_n_args` and
2321   `make_format_to_n_args`. They have been replaced with
2322   `format_context`, `` format_args` and ``make_format_args\`\`
2323   respectively.
2325 - Moved `wchar_t`-specific functions and types to `fmt/xchar.h`. You
2326   can define `FMT_DEPRECATED_INCLUDE_XCHAR` to automatically include
2327   `fmt/xchar.h` from `fmt/format.h` but this will be disabled in the
2328   next major release.
2330 - Fixed handling of the `'+'` specifier in localized formatting
2331   (https://github.com/fmtlib/fmt/issues/2133).
2333 - Added support for the `'s'` format specifier that gives textual
2334   representation of `bool`
2335   (https://github.com/fmtlib/fmt/issues/2094,
2336   https://github.com/fmtlib/fmt/pull/2109). For example:
2338   ```c++
2339   #include <fmt/core.h>
2341   int main() {
2342     fmt::print("{:s}", true);
2343   }
2344   ```
2346   prints \"true\". Thanks @powercoderlol.
2348 - Made `fmt::ptr` work with function pointers
2349   (https://github.com/fmtlib/fmt/pull/2131). For example:
2351   ```c++
2352   #include <fmt/format.h>
2354   int main() {
2355     fmt::print("My main: {}\n", fmt::ptr(main));
2356   }
2357   ```
2359   Thanks @mikecrowe.
2361 - The undocumented support for specializing `formatter` for pointer
2362   types has been removed.
2364 - Fixed `fmt::formatted_size` with format string compilation
2365   (https://github.com/fmtlib/fmt/pull/2141,
2366   https://github.com/fmtlib/fmt/pull/2161). Thanks @alexezeder.
2368 - Fixed handling of empty format strings during format string
2369   compilation (https://github.com/fmtlib/fmt/issues/2042):
2371   ```c++
2372   auto s = fmt::format(FMT_COMPILE(""));
2373   ```
2375   Thanks @alexezeder.
2377 - Fixed handling of enums in `fmt::to_string`
2378   (https://github.com/fmtlib/fmt/issues/2036).
2380 - Improved width computation
2381   (https://github.com/fmtlib/fmt/issues/2033,
2382   https://github.com/fmtlib/fmt/issues/2091). For example:
2384   ```c++
2385   #include <fmt/core.h>
2387   int main() {
2388     fmt::print("{:-<10}{}\n", "你好", "世界");
2389     fmt::print("{:-<10}{}\n", "hello", "world");
2390   }
2391   ```
2393   prints
2395   ![](https://user-images.githubusercontent.com/576385/119840373-cea3ca80-beb9-11eb-91e0-54266c48e181.png)
2397   on a modern terminal.
2399 - The experimental fast output stream (`fmt::ostream`) is now
2400   truncated by default for consistency with `fopen`
2401   (https://github.com/fmtlib/fmt/issues/2018). For example:
2403   ```c++
2404   #include <fmt/os.h>
2406   int main() {
2407     fmt::ostream out1 = fmt::output_file("guide");
2408     out1.print("Zaphod");
2409     out1.close();
2410     fmt::ostream out2 = fmt::output_file("guide");
2411     out2.print("Ford");
2412   }
2413   ```
2415   writes \"Ford\" to the file \"guide\". To preserve the old file
2416   content if any pass `fmt::file::WRONLY | fmt::file::CREATE` flags to
2417   `fmt::output_file`.
2419 - Fixed moving of `fmt::ostream` that holds buffered data
2420   (https://github.com/fmtlib/fmt/issues/2197,
2421   https://github.com/fmtlib/fmt/pull/2198). Thanks @vtta.
2423 - Replaced the `fmt::system_error` exception with a function of the
2424   same name that constructs `std::system_error`
2425   (https://github.com/fmtlib/fmt/issues/2266).
2427 - Replaced the `fmt::windows_error` exception with a function of the
2428   same name that constructs `std::system_error` with the category
2429   returned by `fmt::system_category()`
2430   (https://github.com/fmtlib/fmt/issues/2274,
2431   https://github.com/fmtlib/fmt/pull/2275). The latter is
2432   similar to `std::system_category` but correctly handles UTF-8.
2433   Thanks @phprus.
2435 - Replaced `fmt::error_code` with `std::error_code` and made it
2436   formattable (https://github.com/fmtlib/fmt/issues/2269,
2437   https://github.com/fmtlib/fmt/pull/2270,
2438   https://github.com/fmtlib/fmt/pull/2273). Thanks @phprus.
2440 - Added speech synthesis support
2441   (https://github.com/fmtlib/fmt/pull/2206).
2443 - Made `format_to` work with a memory buffer that has a custom
2444   allocator (https://github.com/fmtlib/fmt/pull/2300).
2445   Thanks @voxmea.
2447 - Added `Allocator::max_size` support to `basic_memory_buffer`.
2448   (https://github.com/fmtlib/fmt/pull/1960). Thanks @phprus.
2450 - Added wide string support to `fmt::join`
2451   (https://github.com/fmtlib/fmt/pull/2236). Thanks @crbrz.
2453 - Made iterators passed to `formatter` specializations via a format
2454   context satisfy C++20 `std::output_iterator` requirements
2455   (https://github.com/fmtlib/fmt/issues/2156,
2456   https://github.com/fmtlib/fmt/pull/2158,
2457   https://github.com/fmtlib/fmt/issues/2195,
2458   https://github.com/fmtlib/fmt/pull/2204). Thanks @randomnetcat.
2460 - Optimized the `printf` implementation
2461   (https://github.com/fmtlib/fmt/pull/1982,
2462   https://github.com/fmtlib/fmt/pull/1984,
2463   https://github.com/fmtlib/fmt/pull/2016,
2464   https://github.com/fmtlib/fmt/pull/2164).
2465   Thanks @rimathia and @moiwi.
2467 - Improved detection of `constexpr` `char_traits`
2468   (https://github.com/fmtlib/fmt/pull/2246,
2469   https://github.com/fmtlib/fmt/pull/2257). Thanks @phprus.
2471 - Fixed writing to `stdout` when it is redirected to `NUL` on Windows
2472   (https://github.com/fmtlib/fmt/issues/2080).
2474 - Fixed exception propagation from iterators
2475   (https://github.com/fmtlib/fmt/issues/2097).
2477 - Improved `strftime` error handling
2478   (https://github.com/fmtlib/fmt/issues/2238,
2479   https://github.com/fmtlib/fmt/pull/2244). Thanks @yumeyao.
2481 - Stopped using deprecated GCC UDL template extension.
2483 - Added `fmt/args.h` to the install target
2484   (https://github.com/fmtlib/fmt/issues/2096).
2486 - Error messages are now passed to assert when exceptions are disabled
2487   (https://github.com/fmtlib/fmt/pull/2145). Thanks @NobodyXu.
2489 - Added the `FMT_MASTER_PROJECT` CMake option to control build and
2490   install targets when {fmt} is included via `add_subdirectory`
2491   (https://github.com/fmtlib/fmt/issues/2098,
2492   https://github.com/fmtlib/fmt/pull/2100).
2493   Thanks @randomizedthinking.
2495 - Improved build configuration
2496   (https://github.com/fmtlib/fmt/pull/2026,
2497   https://github.com/fmtlib/fmt/pull/2122).
2498   Thanks @luncliff and @ibaned.
2500 - Fixed various warnings and compilation issues
2501   (https://github.com/fmtlib/fmt/issues/1947,
2502   https://github.com/fmtlib/fmt/pull/1959,
2503   https://github.com/fmtlib/fmt/pull/1963,
2504   https://github.com/fmtlib/fmt/pull/1965,
2505   https://github.com/fmtlib/fmt/issues/1966,
2506   https://github.com/fmtlib/fmt/pull/1974,
2507   https://github.com/fmtlib/fmt/pull/1975,
2508   https://github.com/fmtlib/fmt/pull/1990,
2509   https://github.com/fmtlib/fmt/issues/2000,
2510   https://github.com/fmtlib/fmt/pull/2001,
2511   https://github.com/fmtlib/fmt/issues/2002,
2512   https://github.com/fmtlib/fmt/issues/2004,
2513   https://github.com/fmtlib/fmt/pull/2006,
2514   https://github.com/fmtlib/fmt/pull/2009,
2515   https://github.com/fmtlib/fmt/pull/2010,
2516   https://github.com/fmtlib/fmt/issues/2038,
2517   https://github.com/fmtlib/fmt/issues/2039,
2518   https://github.com/fmtlib/fmt/issues/2047,
2519   https://github.com/fmtlib/fmt/pull/2053,
2520   https://github.com/fmtlib/fmt/issues/2059,
2521   https://github.com/fmtlib/fmt/pull/2065,
2522   https://github.com/fmtlib/fmt/pull/2067,
2523   https://github.com/fmtlib/fmt/pull/2068,
2524   https://github.com/fmtlib/fmt/pull/2073,
2525   https://github.com/fmtlib/fmt/issues/2103,
2526   https://github.com/fmtlib/fmt/issues/2105,
2527   https://github.com/fmtlib/fmt/pull/2106,
2528   https://github.com/fmtlib/fmt/pull/2107,
2529   https://github.com/fmtlib/fmt/issues/2116,
2530   https://github.com/fmtlib/fmt/pull/2117,
2531   https://github.com/fmtlib/fmt/issues/2118,
2532   https://github.com/fmtlib/fmt/pull/2119,
2533   https://github.com/fmtlib/fmt/issues/2127,
2534   https://github.com/fmtlib/fmt/pull/2128,
2535   https://github.com/fmtlib/fmt/issues/2140,
2536   https://github.com/fmtlib/fmt/issues/2142,
2537   https://github.com/fmtlib/fmt/pull/2143,
2538   https://github.com/fmtlib/fmt/pull/2144,
2539   https://github.com/fmtlib/fmt/issues/2147,
2540   https://github.com/fmtlib/fmt/issues/2148,
2541   https://github.com/fmtlib/fmt/issues/2149,
2542   https://github.com/fmtlib/fmt/pull/2152,
2543   https://github.com/fmtlib/fmt/pull/2160,
2544   https://github.com/fmtlib/fmt/issues/2170,
2545   https://github.com/fmtlib/fmt/issues/2175,
2546   https://github.com/fmtlib/fmt/issues/2176,
2547   https://github.com/fmtlib/fmt/pull/2177,
2548   https://github.com/fmtlib/fmt/issues/2178,
2549   https://github.com/fmtlib/fmt/pull/2179,
2550   https://github.com/fmtlib/fmt/issues/2180,
2551   https://github.com/fmtlib/fmt/issues/2181,
2552   https://github.com/fmtlib/fmt/pull/2183,
2553   https://github.com/fmtlib/fmt/issues/2184,
2554   https://github.com/fmtlib/fmt/issues/2185,
2555   https://github.com/fmtlib/fmt/pull/2186,
2556   https://github.com/fmtlib/fmt/pull/2187,
2557   https://github.com/fmtlib/fmt/pull/2190,
2558   https://github.com/fmtlib/fmt/pull/2192,
2559   https://github.com/fmtlib/fmt/pull/2194,
2560   https://github.com/fmtlib/fmt/pull/2205,
2561   https://github.com/fmtlib/fmt/issues/2210,
2562   https://github.com/fmtlib/fmt/pull/2211,
2563   https://github.com/fmtlib/fmt/pull/2215,
2564   https://github.com/fmtlib/fmt/pull/2216,
2565   https://github.com/fmtlib/fmt/pull/2218,
2566   https://github.com/fmtlib/fmt/pull/2220,
2567   https://github.com/fmtlib/fmt/issues/2228,
2568   https://github.com/fmtlib/fmt/pull/2229,
2569   https://github.com/fmtlib/fmt/pull/2230,
2570   https://github.com/fmtlib/fmt/issues/2233,
2571   https://github.com/fmtlib/fmt/pull/2239,
2572   https://github.com/fmtlib/fmt/issues/2248,
2573   https://github.com/fmtlib/fmt/issues/2252,
2574   https://github.com/fmtlib/fmt/pull/2253,
2575   https://github.com/fmtlib/fmt/pull/2255,
2576   https://github.com/fmtlib/fmt/issues/2261,
2577   https://github.com/fmtlib/fmt/issues/2278,
2578   https://github.com/fmtlib/fmt/issues/2284,
2579   https://github.com/fmtlib/fmt/pull/2287,
2580   https://github.com/fmtlib/fmt/pull/2289,
2581   https://github.com/fmtlib/fmt/pull/2290,
2582   https://github.com/fmtlib/fmt/pull/2293,
2583   https://github.com/fmtlib/fmt/issues/2295,
2584   https://github.com/fmtlib/fmt/pull/2296,
2585   https://github.com/fmtlib/fmt/pull/2297,
2586   https://github.com/fmtlib/fmt/issues/2311,
2587   https://github.com/fmtlib/fmt/pull/2313,
2588   https://github.com/fmtlib/fmt/pull/2315,
2589   https://github.com/fmtlib/fmt/issues/2320,
2590   https://github.com/fmtlib/fmt/pull/2321,
2591   https://github.com/fmtlib/fmt/pull/2323,
2592   https://github.com/fmtlib/fmt/issues/2328,
2593   https://github.com/fmtlib/fmt/pull/2329,
2594   https://github.com/fmtlib/fmt/pull/2333,
2595   https://github.com/fmtlib/fmt/pull/2338,
2596   https://github.com/fmtlib/fmt/pull/2341).
2597   Thanks @darklukee, @fagg, @killerbot242, @jgopel, @yeswalrus, @Finkman,
2598   @HazardyKnusperkeks, @dkavolis, @concatime, @chronoxor, @summivox, @yNeo,
2599   @Apache-HB, @alexezeder, @toojays, @Brainy0207, @vadz, @imsherlock, @phprus,
2600   @white238, @yafshar, @BillyDonahue, @jstaahl, @denchat, @DanielaE,
2601   @ilyakurdyukov, @ilmai, @JessyDL, @sergiud, @mwinterb, @sven-herrmann,
2602   @jmelas, @twoixter, @crbrz and @upsj.
2604 - Improved documentation
2605   (https://github.com/fmtlib/fmt/issues/1986,
2606   https://github.com/fmtlib/fmt/pull/2051,
2607   https://github.com/fmtlib/fmt/issues/2057,
2608   https://github.com/fmtlib/fmt/pull/2081,
2609   https://github.com/fmtlib/fmt/issues/2084,
2610   https://github.com/fmtlib/fmt/pull/2312).
2611   Thanks @imba-tjd, @0x416c69 and @mordante.
2613 - Continuous integration and test improvements
2614   (https://github.com/fmtlib/fmt/issues/1969,
2615   https://github.com/fmtlib/fmt/pull/1991,
2616   https://github.com/fmtlib/fmt/pull/2020,
2617   https://github.com/fmtlib/fmt/pull/2110,
2618   https://github.com/fmtlib/fmt/pull/2114,
2619   https://github.com/fmtlib/fmt/issues/2196,
2620   https://github.com/fmtlib/fmt/pull/2217,
2621   https://github.com/fmtlib/fmt/pull/2247,
2622   https://github.com/fmtlib/fmt/pull/2256,
2623   https://github.com/fmtlib/fmt/pull/2336,
2624   https://github.com/fmtlib/fmt/pull/2346).
2625   Thanks @jgopel, @alexezeder and @DanielaE.
2627 The change log for versions 0.8.0 - 7.1.3 is available [here](
2628 doc/ChangeLog-old.md).