aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/fmt/doc
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2025-11-07 14:49:13 +0100
committerGitHub Enterprise <[email protected]>2025-11-07 14:49:13 +0100
commit24e43a913f29ac3b314354e8ce5175f135bcc64f (patch)
treeca442937ceeb63461012b33a4576e9835099f106 /thirdparty/fmt/doc
parentget oplog attachments (#622) (diff)
downloadzen-24e43a913f29ac3b314354e8ce5175f135bcc64f.tar.xz
zen-24e43a913f29ac3b314354e8ce5175f135bcc64f.zip
switch to xmake for package management (#611)
This change removes our dependency on vcpkg for package management, in favour of bringing some code in-tree in the `thirdparty` folder as well as using the xmake build-in package management feature. For the latter, all the package definitions are maintained in the zen repo itself, in the `repo` folder. It should now also be easier to build the project as it will no longer depend on having the right version of vcpkg installed, which has been a common problem for new people coming in to the codebase. Now you should only need xmake to build. * Bumps xmake requirement on github runners to 2.9.9 to resolve an issue where xmake on Windows invokes cmake with `v144` toolchain which does not exist * BLAKE3 is now in-tree at `thirdparty/blake3` * cpr is now in-tree at `thirdparty/cpr` * cxxopts is now in-tree at `thirdparty/cxxopts` * fmt is now in-tree at `thirdparty/fmt` * robin-map is now in-tree at `thirdparty/robin-map` * ryml is now in-tree at `thirdparty/ryml` * sol2 is now in-tree at `thirdparty/sol2` * spdlog is now in-tree at `thirdparty/spdlog` * utfcpp is now in-tree at `thirdparty/utfcpp` * xmake package repo definitions is in `repo` * implemented support for sanitizers. ASAN is supported on windows, TSAN, UBSAN, MSAN etc are supported on Linux/MacOS though I have not yet tested it extensively on MacOS * the zencore encryption implementation also now supports using mbedTLS which is used on MacOS, though for now we still use openssl on Linux * crashpad * bumps libcurl to 8.11.0 (from 8.8.0) which should address a rare build upload bug
Diffstat (limited to 'thirdparty/fmt/doc')
-rw-r--r--thirdparty/fmt/doc/ChangeLog-old.md3290
-rw-r--r--thirdparty/fmt/doc/api.md710
-rw-r--r--thirdparty/fmt/doc/fmt.css61
-rw-r--r--thirdparty/fmt/doc/fmt.js4
-rw-r--r--thirdparty/fmt/doc/get-started.md233
-rw-r--r--thirdparty/fmt/doc/index.md151
-rw-r--r--thirdparty/fmt/doc/perf.svg1
-rw-r--r--thirdparty/fmt/doc/python-license.txt290
-rw-r--r--thirdparty/fmt/doc/syntax.md886
9 files changed, 5626 insertions, 0 deletions
diff --git a/thirdparty/fmt/doc/ChangeLog-old.md b/thirdparty/fmt/doc/ChangeLog-old.md
new file mode 100644
index 000000000..e8f993c42
--- /dev/null
+++ b/thirdparty/fmt/doc/ChangeLog-old.md
@@ -0,0 +1,3290 @@
+# 7.1.3 - 2020-11-24
+
+- Fixed handling of buffer boundaries in `format_to_n`
+ (https://github.com/fmtlib/fmt/issues/1996,
+ https://github.com/fmtlib/fmt/issues/2029).
+- Fixed linkage errors when linking with a shared library
+ (https://github.com/fmtlib/fmt/issues/2011).
+- Reintroduced ostream support to range formatters
+ (https://github.com/fmtlib/fmt/issues/2014).
+- Worked around an issue with mixing std versions in gcc
+ (https://github.com/fmtlib/fmt/issues/2017).
+
+# 7.1.2 - 2020-11-04
+
+- Fixed floating point formatting with large precision
+ (https://github.com/fmtlib/fmt/issues/1976).
+
+# 7.1.1 - 2020-11-01
+
+- Fixed ABI compatibility with 7.0.x
+ (https://github.com/fmtlib/fmt/issues/1961).
+- Added the `FMT_ARM_ABI_COMPATIBILITY` macro to work around ABI
+ incompatibility between GCC and Clang on ARM
+ (https://github.com/fmtlib/fmt/issues/1919).
+- Worked around a SFINAE bug in GCC 8
+ (https://github.com/fmtlib/fmt/issues/1957).
+- Fixed linkage errors when building with GCC\'s LTO
+ (https://github.com/fmtlib/fmt/issues/1955).
+- Fixed a compilation error when building without `__builtin_clz` or
+ equivalent (https://github.com/fmtlib/fmt/pull/1968).
+ Thanks @tohammer.
+- Fixed a sign conversion warning
+ (https://github.com/fmtlib/fmt/pull/1964). Thanks @OptoCloud.
+
+# 7.1.0 - 2020-10-25
+
+- Switched from
+ [Grisu3](https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf)
+ to [Dragonbox](https://github.com/jk-jeon/dragonbox) for the default
+ floating-point formatting which gives the shortest decimal
+ representation with round-trip guarantee and correct rounding
+ (https://github.com/fmtlib/fmt/pull/1882,
+ https://github.com/fmtlib/fmt/pull/1887,
+ https://github.com/fmtlib/fmt/pull/1894). This makes {fmt}
+ up to 20-30x faster than common implementations of
+ `std::ostringstream` and `sprintf` on
+ [dtoa-benchmark](https://github.com/fmtlib/dtoa-benchmark) and
+ faster than double-conversion and Ryū:
+
+ ![](https://user-images.githubusercontent.com/576385/95684665-11719600-0ba8-11eb-8e5b-972ff4e49428.png)
+
+ It is possible to get even better performance at the cost of larger
+ binary size by compiling with the `FMT_USE_FULL_CACHE_DRAGONBOX`
+ macro set to 1.
+
+ Thanks @jk-jeon.
+
+- Added an experimental unsynchronized file output API which, together
+ with [format string
+ compilation](https://fmt.dev/latest/api.html#compile-api), can give
+ [5-9 times speed up compared to
+ fprintf](https://www.zverovich.net/2020/08/04/optimal-file-buffer-size.html)
+ on common platforms ([godbolt](https://godbolt.org/z/nsTcG8)):
+
+ ```c++
+ #include <fmt/os.h>
+
+ int main() {
+ auto f = fmt::output_file("guide");
+ f.print("The answer is {}.", 42);
+ }
+ ```
+
+- Added a formatter for `std::chrono::time_point<system_clock>`
+ (https://github.com/fmtlib/fmt/issues/1819,
+ https://github.com/fmtlib/fmt/pull/1837). For example
+ ([godbolt](https://godbolt.org/z/c4M6fh)):
+
+ ```c++
+ #include <fmt/chrono.h>
+
+ int main() {
+ auto now = std::chrono::system_clock::now();
+ fmt::print("The time is {:%H:%M:%S}.\n", now);
+ }
+ ```
+
+ Thanks @adamburgess.
+
+- Added support for ranges with non-const `begin`/`end` to `fmt::join`
+ (https://github.com/fmtlib/fmt/issues/1784,
+ https://github.com/fmtlib/fmt/pull/1786). For example
+ ([godbolt](https://godbolt.org/z/jP63Tv)):
+
+ ```c++
+ #include <fmt/ranges.h>
+ #include <range/v3/view/filter.hpp>
+
+ int main() {
+ using std::literals::string_literals::operator""s;
+ auto strs = std::array{"a"s, "bb"s, "ccc"s};
+ auto range = strs | ranges::views::filter(
+ [] (const std::string &x) { return x.size() != 2; }
+ );
+ fmt::print("{}\n", fmt::join(range, ""));
+ }
+ ```
+
+ prints \"accc\".
+
+ Thanks @tonyelewis.
+
+- Added a `memory_buffer::append` overload that takes a range
+ (https://github.com/fmtlib/fmt/pull/1806). Thanks @BRevzin.
+
+- Improved handling of single code units in `FMT_COMPILE`. For
+ example:
+
+ ```c++
+ #include <fmt/compile.h>
+
+ char* f(char* buf) {
+ return fmt::format_to(buf, FMT_COMPILE("x{}"), 42);
+ }
+ ```
+
+ compiles to just ([godbolt](https://godbolt.org/z/5vncz3)):
+
+ ```asm
+ _Z1fPc:
+ movb $120, (%rdi)
+ xorl %edx, %edx
+ cmpl $42, _ZN3fmt2v76detail10basic_dataIvE23zero_or_powers_of_10_32E+8(%rip)
+ movl $3, %eax
+ seta %dl
+ subl %edx, %eax
+ movzwl _ZN3fmt2v76detail10basic_dataIvE6digitsE+84(%rip), %edx
+ cltq
+ addq %rdi, %rax
+ movw %dx, -2(%rax)
+ ret
+ ```
+
+ Here a single `mov` instruction writes `'x'` (`$120`) to the output
+ buffer.
+
+- Added dynamic width support to format string compilation
+ (https://github.com/fmtlib/fmt/issues/1809).
+
+- Improved error reporting for unformattable types: now you\'ll get
+ the type name directly in the error message instead of the note:
+
+ ```c++
+ #include <fmt/core.h>
+
+ struct how_about_no {};
+
+ int main() {
+ fmt::print("{}", how_about_no());
+ }
+ ```
+
+ Error ([godbolt](https://godbolt.org/z/GoxM4e)):
+
+ `fmt/core.h:1438:3: error: static_assert failed due to requirement 'fmt::v7::formattable<how_about_no>()' "Cannot format an argument. To make type T formattable provide a formatter<T> specialization: https://fmt.dev/latest/api.html#udt" ...`
+
+- Added the
+ [make_args_checked](https://fmt.dev/7.1.0/api.html#argument-lists)
+ function template that allows you to write formatting functions with
+ compile-time format string checks and avoid binary code bloat
+ ([godbolt](https://godbolt.org/z/PEf9qr)):
+
+ ```c++
+ void vlog(const char* file, int line, fmt::string_view format,
+ fmt::format_args args) {
+ fmt::print("{}: {}: ", file, line);
+ fmt::vprint(format, args);
+ }
+
+ template <typename S, typename... Args>
+ void log(const char* file, int line, const S& format, Args&&... args) {
+ vlog(file, line, format,
+ fmt::make_args_checked<Args...>(format, args...));
+ }
+
+ #define MY_LOG(format, ...) \
+ log(__FILE__, __LINE__, FMT_STRING(format), __VA_ARGS__)
+
+ MY_LOG("invalid squishiness: {}", 42);
+ ```
+
+- Replaced `snprintf` fallback with a faster internal IEEE 754 `float`
+ and `double` formatter for arbitrary precision. For example
+ ([godbolt](https://godbolt.org/z/dPhWvj)):
+
+ ```c++
+ #include <fmt/core.h>
+
+ int main() {
+ fmt::print("{:.500}\n", 4.9406564584124654E-324);
+ }
+ ```
+
+ prints
+
+ `4.9406564584124654417656879286822137236505980261432476442558568250067550727020875186529983636163599237979656469544571773092665671035593979639877479601078187812630071319031140452784581716784898210368871863605699873072305000638740915356498438731247339727316961514003171538539807412623856559117102665855668676818703956031062493194527159149245532930545654440112748012970999954193198940908041656332452475714786901472678015935523861155013480352649347201937902681071074917033322268447533357208324319360923829e-324`.
+
+- Made `format_to_n` and `formatted_size` part of the [core
+ API](https://fmt.dev/latest/api.html#core-api)
+ ([godbolt](https://godbolt.org/z/sPjY1K)):
+
+ ```c++
+ #include <fmt/core.h>
+
+ int main() {
+ char buffer[10];
+ auto result = fmt::format_to_n(buffer, sizeof(buffer), "{}", 42);
+ }
+ ```
+
+- Added `fmt::format_to_n` overload with format string compilation
+ (https://github.com/fmtlib/fmt/issues/1764,
+ https://github.com/fmtlib/fmt/pull/1767,
+ https://github.com/fmtlib/fmt/pull/1869). For example
+ ([godbolt](https://godbolt.org/z/93h86q)):
+
+ ```c++
+ #include <fmt/compile.h>
+
+ int main() {
+ char buffer[8];
+ fmt::format_to_n(buffer, sizeof(buffer), FMT_COMPILE("{}"), 42);
+ }
+ ```
+
+ Thanks @Kurkin and @alexezeder.
+
+- Added `fmt::format_to` overload that take `text_style`
+ (https://github.com/fmtlib/fmt/issues/1593,
+ https://github.com/fmtlib/fmt/issues/1842,
+ https://github.com/fmtlib/fmt/pull/1843). For example
+ ([godbolt](https://godbolt.org/z/91153r)):
+
+ ```c++
+ #include <fmt/color.h>
+
+ int main() {
+ std::string out;
+ fmt::format_to(std::back_inserter(out),
+ fmt::emphasis::bold | fg(fmt::color::red),
+ "The answer is {}.", 42);
+ }
+ ```
+
+ Thanks @Naios.
+
+- Made the `'#'` specifier emit trailing zeros in addition to the
+ decimal point (https://github.com/fmtlib/fmt/issues/1797).
+ For example ([godbolt](https://godbolt.org/z/bhdcW9)):
+
+ ```c++
+ #include <fmt/core.h>
+
+ int main() {
+ fmt::print("{:#.2g}", 0.5);
+ }
+ ```
+
+ prints `0.50`.
+
+- Changed the default floating point format to not include `.0` for
+ consistency with `std::format` and `std::to_chars`
+ (https://github.com/fmtlib/fmt/issues/1893,
+ https://github.com/fmtlib/fmt/issues/1943). It is possible
+ to get the decimal point and trailing zero with the `#` specifier.
+
+- Fixed an issue with floating-point formatting that could result in
+ addition of a non-significant trailing zero in rare cases e.g.
+ `1.00e-34` instead of `1.0e-34`
+ (https://github.com/fmtlib/fmt/issues/1873,
+ https://github.com/fmtlib/fmt/issues/1917).
+
+- Made `fmt::to_string` fallback on `ostream` insertion operator if
+ the `formatter` specialization is not provided
+ (https://github.com/fmtlib/fmt/issues/1815,
+ https://github.com/fmtlib/fmt/pull/1829). Thanks @alexezeder.
+
+- Added support for the append mode to the experimental file API and
+ improved `fcntl.h` detection.
+ (https://github.com/fmtlib/fmt/pull/1847,
+ https://github.com/fmtlib/fmt/pull/1848). Thanks @t-wiser.
+
+- Fixed handling of types that have both an implicit conversion
+ operator and an overloaded `ostream` insertion operator
+ (https://github.com/fmtlib/fmt/issues/1766).
+
+- Fixed a slicing issue in an internal iterator type
+ (https://github.com/fmtlib/fmt/pull/1822). Thanks @BRevzin.
+
+- Fixed an issue in locale-specific integer formatting
+ (https://github.com/fmtlib/fmt/issues/1927).
+
+- Fixed handling of exotic code unit types
+ (https://github.com/fmtlib/fmt/issues/1870,
+ https://github.com/fmtlib/fmt/issues/1932).
+
+- Improved `FMT_ALWAYS_INLINE`
+ (https://github.com/fmtlib/fmt/pull/1878). Thanks @jk-jeon.
+
+- Removed dependency on `windows.h`
+ (https://github.com/fmtlib/fmt/pull/1900). Thanks @bernd5.
+
+- Optimized counting of decimal digits on MSVC
+ (https://github.com/fmtlib/fmt/pull/1890). Thanks @mwinterb.
+
+- Improved documentation
+ (https://github.com/fmtlib/fmt/issues/1772,
+ https://github.com/fmtlib/fmt/pull/1775,
+ https://github.com/fmtlib/fmt/pull/1792,
+ https://github.com/fmtlib/fmt/pull/1838,
+ https://github.com/fmtlib/fmt/pull/1888,
+ https://github.com/fmtlib/fmt/pull/1918,
+ https://github.com/fmtlib/fmt/pull/1939).
+ Thanks @leolchat, @pepsiman, @Klaim, @ravijanjam, @francesco-st and @udnaan.
+
+- Added the `FMT_REDUCE_INT_INSTANTIATIONS` CMake option that reduces
+ the binary code size at the cost of some integer formatting
+ performance. This can be useful for extremely memory-constrained
+ embedded systems
+ (https://github.com/fmtlib/fmt/issues/1778,
+ https://github.com/fmtlib/fmt/pull/1781). Thanks @kammce.
+
+- Added the `FMT_USE_INLINE_NAMESPACES` macro to control usage of
+ inline namespaces
+ (https://github.com/fmtlib/fmt/pull/1945). Thanks @darklukee.
+
+- Improved build configuration
+ (https://github.com/fmtlib/fmt/pull/1760,
+ https://github.com/fmtlib/fmt/pull/1770,
+ https://github.com/fmtlib/fmt/issues/1779,
+ https://github.com/fmtlib/fmt/pull/1783,
+ https://github.com/fmtlib/fmt/pull/1823).
+ Thanks @dvetutnev, @xvitaly, @tambry, @medithe and @martinwuehrer.
+
+- Fixed various warnings and compilation issues
+ (https://github.com/fmtlib/fmt/pull/1790,
+ https://github.com/fmtlib/fmt/pull/1802,
+ https://github.com/fmtlib/fmt/pull/1808,
+ https://github.com/fmtlib/fmt/issues/1810,
+ https://github.com/fmtlib/fmt/issues/1811,
+ https://github.com/fmtlib/fmt/pull/1812,
+ https://github.com/fmtlib/fmt/pull/1814,
+ https://github.com/fmtlib/fmt/pull/1816,
+ https://github.com/fmtlib/fmt/pull/1817,
+ https://github.com/fmtlib/fmt/pull/1818,
+ https://github.com/fmtlib/fmt/issues/1825,
+ https://github.com/fmtlib/fmt/pull/1836,
+ https://github.com/fmtlib/fmt/pull/1855,
+ https://github.com/fmtlib/fmt/pull/1856,
+ https://github.com/fmtlib/fmt/pull/1860,
+ https://github.com/fmtlib/fmt/pull/1877,
+ https://github.com/fmtlib/fmt/pull/1879,
+ https://github.com/fmtlib/fmt/pull/1880,
+ https://github.com/fmtlib/fmt/issues/1896,
+ https://github.com/fmtlib/fmt/pull/1897,
+ https://github.com/fmtlib/fmt/pull/1898,
+ https://github.com/fmtlib/fmt/issues/1904,
+ https://github.com/fmtlib/fmt/pull/1908,
+ https://github.com/fmtlib/fmt/issues/1911,
+ https://github.com/fmtlib/fmt/issues/1912,
+ https://github.com/fmtlib/fmt/issues/1928,
+ https://github.com/fmtlib/fmt/pull/1929,
+ https://github.com/fmtlib/fmt/issues/1935,
+ https://github.com/fmtlib/fmt/pull/1937,
+ https://github.com/fmtlib/fmt/pull/1942,
+ https://github.com/fmtlib/fmt/issues/1949).
+ Thanks @TheQwertiest, @medithe, @martinwuehrer, @n16h7hunt3r, @Othereum,
+ @gsjaardema, @AlexanderLanin, @gcerretani, @chronoxor, @noizefloor,
+ @akohlmey, @jk-jeon, @rimathia, @rglarix, @moiwi, @heckad, @MarcDirven.
+ @BartSiwek and @darklukee.
+
+# 7.0.3 - 2020-08-06
+
+- Worked around broken `numeric_limits` for 128-bit integers
+ (https://github.com/fmtlib/fmt/issues/1787).
+- Added error reporting on missing named arguments
+ (https://github.com/fmtlib/fmt/issues/1796).
+- Stopped using 128-bit integers with clang-cl
+ (https://github.com/fmtlib/fmt/pull/1800). Thanks @Kingcom.
+- Fixed issues in locale-specific integer formatting
+ (https://github.com/fmtlib/fmt/issues/1782,
+ https://github.com/fmtlib/fmt/issues/1801).
+
+# 7.0.2 - 2020-07-29
+
+- Worked around broken `numeric_limits` for 128-bit integers
+ (https://github.com/fmtlib/fmt/issues/1725).
+- Fixed compatibility with CMake 3.4
+ (https://github.com/fmtlib/fmt/issues/1779).
+- Fixed handling of digit separators in locale-specific formatting
+ (https://github.com/fmtlib/fmt/issues/1782).
+
+# 7.0.1 - 2020-07-07
+
+- Updated the inline version namespace name.
+- Worked around a gcc bug in mangling of alias templates
+ (https://github.com/fmtlib/fmt/issues/1753).
+- Fixed a linkage error on Windows
+ (https://github.com/fmtlib/fmt/issues/1757). Thanks @Kurkin.
+- Fixed minor issues with the documentation.
+
+# 7.0.0 - 2020-07-05
+
+- Reduced the library size. For example, on macOS a stripped test
+ binary statically linked with {fmt} [shrank from \~368k to less than
+ 100k](http://www.zverovich.net/2020/05/21/reducing-library-size.html).
+
+- Added a simpler and more efficient [format string compilation
+ API](https://fmt.dev/7.0.0/api.html#compile-api):
+
+ ```c++
+ #include <fmt/compile.h>
+
+ // Converts 42 into std::string using the most efficient method and no
+ // runtime format string processing.
+ std::string s = fmt::format(FMT_COMPILE("{}"), 42);
+ ```
+
+ The old `fmt::compile` API is now deprecated.
+
+- Optimized integer formatting: `format_to` with format string
+ compilation and a stack-allocated buffer is now [faster than
+ to_chars on both libc++ and
+ libstdc++](http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html).
+
+- Optimized handling of small format strings. For example,
+
+ ```c++
+ fmt::format("Result: {}: ({},{},{},{})", str1, str2, str3, str4, str5)
+ ```
+
+ is now \~40% faster
+ (https://github.com/fmtlib/fmt/issues/1685).
+
+- Applied extern templates to improve compile times when using the
+ core API and `fmt/format.h`
+ (https://github.com/fmtlib/fmt/issues/1452). For example,
+ on macOS with clang the compile time of a test translation unit
+ dropped from 2.3s to 0.3s with `-O2` and from 0.6s to 0.3s with the
+ default settings (`-O0`).
+
+ Before (`-O2`):
+
+ % time c++ -c test.cc -I include -std=c++17 -O2
+ c++ -c test.cc -I include -std=c++17 -O2 2.22s user 0.08s system 99% cpu 2.311 total
+
+ After (`-O2`):
+
+ % time c++ -c test.cc -I include -std=c++17 -O2
+ c++ -c test.cc -I include -std=c++17 -O2 0.26s user 0.04s system 98% cpu 0.303 total
+
+ Before (default):
+
+ % time c++ -c test.cc -I include -std=c++17
+ c++ -c test.cc -I include -std=c++17 0.53s user 0.06s system 98% cpu 0.601 total
+
+ After (default):
+
+ % time c++ -c test.cc -I include -std=c++17
+ c++ -c test.cc -I include -std=c++17 0.24s user 0.06s system 98% cpu 0.301 total
+
+ It is still recommended to use `fmt/core.h` instead of
+ `fmt/format.h` but the compile time difference is now smaller.
+ Thanks @alex3d for the suggestion.
+
+- Named arguments are now stored on stack (no dynamic memory
+ allocations) and the compiled code is more compact and efficient.
+ For example
+
+ ```c++
+ #include <fmt/core.h>
+
+ int main() {
+ fmt::print("The answer is {answer}\n", fmt::arg("answer", 42));
+ }
+ ```
+
+ compiles to just ([godbolt](https://godbolt.org/z/NcfEp_))
+
+ ```asm
+ .LC0:
+ .string "answer"
+ .LC1:
+ .string "The answer is {answer}\n"
+ main:
+ sub rsp, 56
+ mov edi, OFFSET FLAT:.LC1
+ mov esi, 23
+ movabs rdx, 4611686018427387905
+ lea rax, [rsp+32]
+ lea rcx, [rsp+16]
+ mov QWORD PTR [rsp+8], 1
+ mov QWORD PTR [rsp], rax
+ mov DWORD PTR [rsp+16], 42
+ mov QWORD PTR [rsp+32], OFFSET FLAT:.LC0
+ mov DWORD PTR [rsp+40], 0
+ call fmt::v6::vprint(fmt::v6::basic_string_view<char>,
+ fmt::v6::format_args)
+ xor eax, eax
+ add rsp, 56
+ ret
+
+ .L.str.1:
+ .asciz "answer"
+ ```
+
+- Implemented compile-time checks for dynamic width and precision
+ (https://github.com/fmtlib/fmt/issues/1614):
+
+ ```c++
+ #include <fmt/format.h>
+
+ int main() {
+ fmt::print(FMT_STRING("{0:{1}}"), 42);
+ }
+ ```
+
+ now gives a compilation error because argument 1 doesn\'t exist:
+
+ In file included from test.cc:1:
+ include/fmt/format.h:2726:27: error: constexpr variable 'invalid_format' must be
+ initialized by a constant expression
+ FMT_CONSTEXPR_DECL bool invalid_format =
+ ^
+ ...
+ include/fmt/core.h:569:26: note: in call to
+ '&checker(s, {}).context_->on_error(&"argument not found"[0])'
+ if (id >= num_args_) on_error("argument not found");
+ ^
+
+- Added sentinel support to `fmt::join`
+ (https://github.com/fmtlib/fmt/pull/1689)
+
+ ```c++
+ struct zstring_sentinel {};
+ bool operator==(const char* p, zstring_sentinel) { return *p == '\0'; }
+ bool operator!=(const char* p, zstring_sentinel) { return *p != '\0'; }
+
+ struct zstring {
+ const char* p;
+ const char* begin() const { return p; }
+ zstring_sentinel end() const { return {}; }
+ };
+
+ auto s = fmt::format("{}", fmt::join(zstring{"hello"}, "_"));
+ // s == "h_e_l_l_o"
+ ```
+
+ Thanks @BRevzin.
+
+- Added support for named arguments, `clear` and `reserve` to
+ `dynamic_format_arg_store`
+ (https://github.com/fmtlib/fmt/issues/1655,
+ https://github.com/fmtlib/fmt/pull/1663,
+ https://github.com/fmtlib/fmt/pull/1674,
+ https://github.com/fmtlib/fmt/pull/1677). Thanks @vsolontsov-ll.
+
+- Added support for the `'c'` format specifier to integral types for
+ compatibility with `std::format`
+ (https://github.com/fmtlib/fmt/issues/1652).
+
+- Replaced the `'n'` format specifier with `'L'` for compatibility
+ with `std::format`
+ (https://github.com/fmtlib/fmt/issues/1624). The `'n'`
+ specifier can be enabled via the `FMT_DEPRECATED_N_SPECIFIER` macro.
+
+- The `'='` format specifier is now disabled by default for
+ compatibility with `std::format`. It can be enabled via the
+ `FMT_DEPRECATED_NUMERIC_ALIGN` macro.
+
+- Removed the following deprecated APIs:
+
+ - `FMT_STRING_ALIAS` and `fmt` macros - replaced by `FMT_STRING`
+ - `fmt::basic_string_view::char_type` - replaced by
+ `fmt::basic_string_view::value_type`
+ - `convert_to_int`
+ - `format_arg_store::types`
+ - `*parse_context` - replaced by `*format_parse_context`
+ - `FMT_DEPRECATED_INCLUDE_OS`
+ - `FMT_DEPRECATED_PERCENT` - incompatible with `std::format`
+ - `*writer` - replaced by compiled format API
+
+- Renamed the `internal` namespace to `detail`
+ (https://github.com/fmtlib/fmt/issues/1538). The former is
+ still provided as an alias if the `FMT_USE_INTERNAL` macro is
+ defined.
+
+- Improved compatibility between `fmt::printf` with the standard specs
+ (https://github.com/fmtlib/fmt/issues/1595,
+ https://github.com/fmtlib/fmt/pull/1682,
+ https://github.com/fmtlib/fmt/pull/1683,
+ https://github.com/fmtlib/fmt/pull/1687,
+ https://github.com/fmtlib/fmt/pull/1699). Thanks @rimathia.
+
+- Fixed handling of `operator<<` overloads that use `copyfmt`
+ (https://github.com/fmtlib/fmt/issues/1666).
+
+- Added the `FMT_OS` CMake option to control inclusion of OS-specific
+ APIs in the fmt target. This can be useful for embedded platforms
+ (https://github.com/fmtlib/fmt/issues/1654,
+ https://github.com/fmtlib/fmt/pull/1656). Thanks @kwesolowski.
+
+- Replaced `FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION` with the
+ `FMT_FUZZ` macro to prevent interfering with fuzzing of projects
+ using {fmt} (https://github.com/fmtlib/fmt/pull/1650).
+ Thanks @asraa.
+
+- Fixed compatibility with emscripten
+ (https://github.com/fmtlib/fmt/issues/1636,
+ https://github.com/fmtlib/fmt/pull/1637). Thanks @ArthurSonzogni.
+
+- Improved documentation
+ (https://github.com/fmtlib/fmt/issues/704,
+ https://github.com/fmtlib/fmt/pull/1643,
+ https://github.com/fmtlib/fmt/pull/1660,
+ https://github.com/fmtlib/fmt/pull/1681,
+ https://github.com/fmtlib/fmt/pull/1691,
+ https://github.com/fmtlib/fmt/pull/1706,
+ https://github.com/fmtlib/fmt/pull/1714,
+ https://github.com/fmtlib/fmt/pull/1721,
+ https://github.com/fmtlib/fmt/pull/1739,
+ https://github.com/fmtlib/fmt/pull/1740,
+ https://github.com/fmtlib/fmt/pull/1741,
+ https://github.com/fmtlib/fmt/pull/1751).
+ Thanks @senior7515, @lsr0, @puetzk, @fpelliccioni, Alexey Kuzmenko, @jelly,
+ @claremacrae, @jiapengwen, @gsjaardema and @alexey-milovidov.
+
+- Implemented various build configuration fixes and improvements
+ (https://github.com/fmtlib/fmt/pull/1603,
+ https://github.com/fmtlib/fmt/pull/1657,
+ https://github.com/fmtlib/fmt/pull/1702,
+ https://github.com/fmtlib/fmt/pull/1728).
+ Thanks @scramsby, @jtojnar, @orivej and @flagarde.
+
+- Fixed various warnings and compilation issues
+ (https://github.com/fmtlib/fmt/pull/1616,
+ https://github.com/fmtlib/fmt/issues/1620,
+ https://github.com/fmtlib/fmt/issues/1622,
+ https://github.com/fmtlib/fmt/issues/1625,
+ https://github.com/fmtlib/fmt/pull/1627,
+ https://github.com/fmtlib/fmt/issues/1628,
+ https://github.com/fmtlib/fmt/pull/1629,
+ https://github.com/fmtlib/fmt/issues/1631,
+ https://github.com/fmtlib/fmt/pull/1633,
+ https://github.com/fmtlib/fmt/pull/1649,
+ https://github.com/fmtlib/fmt/issues/1658,
+ https://github.com/fmtlib/fmt/pull/1661,
+ https://github.com/fmtlib/fmt/pull/1667,
+ https://github.com/fmtlib/fmt/issues/1668,
+ https://github.com/fmtlib/fmt/pull/1669,
+ https://github.com/fmtlib/fmt/issues/1692,
+ https://github.com/fmtlib/fmt/pull/1696,
+ https://github.com/fmtlib/fmt/pull/1697,
+ https://github.com/fmtlib/fmt/issues/1707,
+ https://github.com/fmtlib/fmt/pull/1712,
+ https://github.com/fmtlib/fmt/pull/1716,
+ https://github.com/fmtlib/fmt/pull/1722,
+ https://github.com/fmtlib/fmt/issues/1724,
+ https://github.com/fmtlib/fmt/pull/1729,
+ https://github.com/fmtlib/fmt/pull/1738,
+ https://github.com/fmtlib/fmt/issues/1742,
+ https://github.com/fmtlib/fmt/issues/1743,
+ https://github.com/fmtlib/fmt/pull/1744,
+ https://github.com/fmtlib/fmt/issues/1747,
+ https://github.com/fmtlib/fmt/pull/1750).
+ Thanks @gsjaardema, @gabime, @johnor, @Kurkin, @invexed, @peterbell10,
+ @daixtrose, @petrutlucian94, @Neargye, @ambitslix, @gabime,
+ @tohammer and @0x8000-0000.
+
+# 6.2.1 - 2020-05-09
+
+- Fixed ostream support in `sprintf`
+ (https://github.com/fmtlib/fmt/issues/1631).
+- Fixed type detection when using implicit conversion to `string_view`
+ and ostream `operator<<` inconsistently
+ (https://github.com/fmtlib/fmt/issues/1662).
+
+# 6.2.0 - 2020-04-05
+
+- Improved error reporting when trying to format an object of a
+ non-formattable type:
+
+ ```c++
+ fmt::format("{}", S());
+ ```
+
+ now gives:
+
+ include/fmt/core.h:1015:5: error: static_assert failed due to requirement
+ 'formattable' "Cannot format argument. To make type T formattable provide a
+ formatter<T> specialization:
+ https://fmt.dev/latest/api.html#formatting-user-defined-types"
+ static_assert(
+ ^
+ ...
+ note: in instantiation of function template specialization
+ 'fmt::v6::format<char [3], S, char>' requested here
+ fmt::format("{}", S());
+ ^
+
+ if `S` is not formattable.
+
+- Reduced the library size by \~10%.
+
+- Always print decimal point if `#` is specified
+ (https://github.com/fmtlib/fmt/issues/1476,
+ https://github.com/fmtlib/fmt/issues/1498):
+
+ ```c++
+ fmt::print("{:#.0f}", 42.0);
+ ```
+
+ now prints `42.`
+
+- Implemented the `'L'` specifier for locale-specific numeric
+ formatting to improve compatibility with `std::format`. The `'n'`
+ specifier is now deprecated and will be removed in the next major
+ release.
+
+- Moved OS-specific APIs such as `windows_error` from `fmt/format.h`
+ to `fmt/os.h`. You can define `FMT_DEPRECATED_INCLUDE_OS` to
+ automatically include `fmt/os.h` from `fmt/format.h` for
+ compatibility but this will be disabled in the next major release.
+
+- Added precision overflow detection in floating-point formatting.
+
+- Implemented detection of invalid use of `fmt::arg`.
+
+- Used `type_identity` to block unnecessary template argument
+ deduction. Thanks Tim Song.
+
+- Improved UTF-8 handling
+ (https://github.com/fmtlib/fmt/issues/1109):
+
+ ```c++
+ fmt::print("┌{0:─^{2}}┐\n"
+ "│{1: ^{2}}│\n"
+ "└{0:─^{2}}┘\n", "", "Прывітанне, свет!", 21);
+ ```
+
+ now prints:
+
+ ┌─────────────────────┐
+ │ Прывітанне, свет! │
+ └─────────────────────┘
+
+ on systems that support Unicode.
+
+- Added experimental dynamic argument storage
+ (https://github.com/fmtlib/fmt/issues/1170,
+ https://github.com/fmtlib/fmt/pull/1584):
+
+ ```c++
+ fmt::dynamic_format_arg_store<fmt::format_context> store;
+ store.push_back("answer");
+ store.push_back(42);
+ fmt::vprint("The {} is {}.\n", store);
+ ```
+
+ prints:
+
+ The answer is 42.
+
+ Thanks @vsolontsov-ll.
+
+- Made `fmt::join` accept `initializer_list`
+ (https://github.com/fmtlib/fmt/pull/1591). Thanks @Rapotkinnik.
+
+- Fixed handling of empty tuples
+ (https://github.com/fmtlib/fmt/issues/1588).
+
+- Fixed handling of output iterators in `format_to_n`
+ (https://github.com/fmtlib/fmt/issues/1506).
+
+- Fixed formatting of `std::chrono::duration` types to wide output
+ (https://github.com/fmtlib/fmt/pull/1533). Thanks @zeffy.
+
+- Added const `begin` and `end` overload to buffers
+ (https://github.com/fmtlib/fmt/pull/1553). Thanks @dominicpoeschko.
+
+- Added the ability to disable floating-point formatting via
+ `FMT_USE_FLOAT`, `FMT_USE_DOUBLE` and `FMT_USE_LONG_DOUBLE` macros
+ for extremely memory-constrained embedded system
+ (https://github.com/fmtlib/fmt/pull/1590). Thanks @albaguirre.
+
+- Made `FMT_STRING` work with `constexpr` `string_view`
+ (https://github.com/fmtlib/fmt/pull/1589). Thanks @scramsby.
+
+- Implemented a minor optimization in the format string parser
+ (https://github.com/fmtlib/fmt/pull/1560). Thanks @IkarusDeveloper.
+
+- Improved attribute detection
+ (https://github.com/fmtlib/fmt/pull/1469,
+ https://github.com/fmtlib/fmt/pull/1475,
+ https://github.com/fmtlib/fmt/pull/1576).
+ Thanks @federico-busato, @chronoxor and @refnum.
+
+- Improved documentation
+ (https://github.com/fmtlib/fmt/pull/1481,
+ https://github.com/fmtlib/fmt/pull/1523).
+ Thanks @JackBoosY and @imba-tjd.
+
+- Fixed symbol visibility on Linux when compiling with
+ `-fvisibility=hidden`
+ (https://github.com/fmtlib/fmt/pull/1535). Thanks @milianw.
+
+- Implemented various build configuration fixes and improvements
+ (https://github.com/fmtlib/fmt/issues/1264,
+ https://github.com/fmtlib/fmt/issues/1460,
+ https://github.com/fmtlib/fmt/pull/1534,
+ https://github.com/fmtlib/fmt/issues/1536,
+ https://github.com/fmtlib/fmt/issues/1545,
+ https://github.com/fmtlib/fmt/pull/1546,
+ https://github.com/fmtlib/fmt/issues/1566,
+ https://github.com/fmtlib/fmt/pull/1582,
+ https://github.com/fmtlib/fmt/issues/1597,
+ https://github.com/fmtlib/fmt/pull/1598).
+ Thanks @ambitslix, @jwillikers and @stac47.
+
+- Fixed various warnings and compilation issues
+ (https://github.com/fmtlib/fmt/pull/1433,
+ https://github.com/fmtlib/fmt/issues/1461,
+ https://github.com/fmtlib/fmt/pull/1470,
+ https://github.com/fmtlib/fmt/pull/1480,
+ https://github.com/fmtlib/fmt/pull/1485,
+ https://github.com/fmtlib/fmt/pull/1492,
+ https://github.com/fmtlib/fmt/issues/1493,
+ https://github.com/fmtlib/fmt/issues/1504,
+ https://github.com/fmtlib/fmt/pull/1505,
+ https://github.com/fmtlib/fmt/pull/1512,
+ https://github.com/fmtlib/fmt/issues/1515,
+ https://github.com/fmtlib/fmt/pull/1516,
+ https://github.com/fmtlib/fmt/pull/1518,
+ https://github.com/fmtlib/fmt/pull/1519,
+ https://github.com/fmtlib/fmt/pull/1520,
+ https://github.com/fmtlib/fmt/pull/1521,
+ https://github.com/fmtlib/fmt/pull/1522,
+ https://github.com/fmtlib/fmt/issues/1524,
+ https://github.com/fmtlib/fmt/pull/1530,
+ https://github.com/fmtlib/fmt/issues/1531,
+ https://github.com/fmtlib/fmt/pull/1532,
+ https://github.com/fmtlib/fmt/issues/1539,
+ https://github.com/fmtlib/fmt/issues/1547,
+ https://github.com/fmtlib/fmt/issues/1548,
+ https://github.com/fmtlib/fmt/pull/1554,
+ https://github.com/fmtlib/fmt/issues/1567,
+ https://github.com/fmtlib/fmt/pull/1568,
+ https://github.com/fmtlib/fmt/pull/1569,
+ https://github.com/fmtlib/fmt/pull/1571,
+ https://github.com/fmtlib/fmt/pull/1573,
+ https://github.com/fmtlib/fmt/pull/1575,
+ https://github.com/fmtlib/fmt/pull/1581,
+ https://github.com/fmtlib/fmt/issues/1583,
+ https://github.com/fmtlib/fmt/issues/1586,
+ https://github.com/fmtlib/fmt/issues/1587,
+ https://github.com/fmtlib/fmt/issues/1594,
+ https://github.com/fmtlib/fmt/pull/1596,
+ https://github.com/fmtlib/fmt/issues/1604,
+ https://github.com/fmtlib/fmt/pull/1606,
+ https://github.com/fmtlib/fmt/issues/1607,
+ https://github.com/fmtlib/fmt/issues/1609).
+ Thanks @marti4d, @iPherian, @parkertomatoes, @gsjaardema, @chronoxor,
+ @DanielaE, @torsten48, @tohammer, @lefticus, @ryusakki, @adnsv, @fghzxm,
+ @refnum, @pramodk, @Spirrwell and @scramsby.
+
+# 6.1.2 - 2019-12-11
+
+- Fixed ABI compatibility with `libfmt.so.6.0.0`
+ (https://github.com/fmtlib/fmt/issues/1471).
+- Fixed handling types convertible to `std::string_view`
+ (https://github.com/fmtlib/fmt/pull/1451). Thanks @denizevrenci.
+- Made CUDA test an opt-in enabled via the `FMT_CUDA_TEST` CMake
+ option.
+- Fixed sign conversion warnings
+ (https://github.com/fmtlib/fmt/pull/1440). Thanks @0x8000-0000.
+
+# 6.1.1 - 2019-12-04
+
+- Fixed shared library build on Windows
+ (https://github.com/fmtlib/fmt/pull/1443,
+ https://github.com/fmtlib/fmt/issues/1445,
+ https://github.com/fmtlib/fmt/pull/1446,
+ https://github.com/fmtlib/fmt/issues/1450).
+ Thanks @egorpugin and @bbolli.
+- Added a missing decimal point in exponent notation with trailing
+ zeros.
+- Removed deprecated `format_arg_store::TYPES`.
+
+# 6.1.0 - 2019-12-01
+
+- {fmt} now formats IEEE 754 `float` and `double` using the shortest
+ decimal representation with correct rounding by default:
+
+ ```c++
+ #include <cmath>
+ #include <fmt/core.h>
+
+ int main() {
+ fmt::print("{}", M_PI);
+ }
+ ```
+
+ prints `3.141592653589793`.
+
+- Made the fast binary to decimal floating-point formatter the
+ default, simplified it and improved performance. {fmt} is now 15
+ times faster than libc++\'s `std::ostringstream`, 11 times faster
+ than `printf` and 10% faster than double-conversion on
+ [dtoa-benchmark](https://github.com/fmtlib/dtoa-benchmark):
+
+ | Function | Time (ns) | Speedup |
+ | ------------- | --------: | ------: |
+ | ostringstream | 1,346.30 | 1.00x |
+ | ostrstream | 1,195.74 | 1.13x |
+ | sprintf | 995.08 | 1.35x |
+ | doubleconv | 99.10 | 13.59x |
+ | fmt | 88.34 | 15.24x |
+
+ ![](https://user-images.githubusercontent.com/576385/69767160-cdaca400-112f-11ea-9fc5-347c9f83caad.png)
+
+- {fmt} no longer converts `float` arguments to `double`. In
+ particular this improves the default (shortest) representation of
+ floats and makes `fmt::format` consistent with `std::format` specs
+ (https://github.com/fmtlib/fmt/issues/1336,
+ https://github.com/fmtlib/fmt/issues/1353,
+ https://github.com/fmtlib/fmt/pull/1360,
+ https://github.com/fmtlib/fmt/pull/1361):
+
+ ```c++
+ fmt::print("{}", 0.1f);
+ ```
+
+ prints `0.1` instead of `0.10000000149011612`.
+
+ Thanks @orivej.
+
+- Made floating-point formatting output consistent with
+ `printf`/iostreams
+ (https://github.com/fmtlib/fmt/issues/1376,
+ https://github.com/fmtlib/fmt/issues/1417).
+
+- Added support for 128-bit integers
+ (https://github.com/fmtlib/fmt/pull/1287):
+
+ ```c++
+ fmt::print("{}", std::numeric_limits<__int128_t>::max());
+ ```
+
+ prints `170141183460469231731687303715884105727`.
+
+ Thanks @denizevrenci.
+
+- The overload of `print` that takes `text_style` is now atomic, i.e.
+ the output from different threads doesn\'t interleave
+ (https://github.com/fmtlib/fmt/pull/1351). Thanks @tankiJong.
+
+- Made compile time in the header-only mode \~20% faster by reducing
+ the number of template instantiations. `wchar_t` overload of
+ `vprint` was moved from `fmt/core.h` to `fmt/format.h`.
+
+- Added an overload of `fmt::join` that works with tuples
+ (https://github.com/fmtlib/fmt/issues/1322,
+ https://github.com/fmtlib/fmt/pull/1330):
+
+ ```c++
+ #include <tuple>
+ #include <fmt/ranges.h>
+
+ int main() {
+ std::tuple<char, int, float> t{'a', 1, 2.0f};
+ fmt::print("{}", t);
+ }
+ ```
+
+ prints `('a', 1, 2.0)`.
+
+ Thanks @jeremyong.
+
+- Changed formatting of octal zero with prefix from \"00\" to \"0\":
+
+ ```c++
+ fmt::print("{:#o}", 0);
+ ```
+
+ prints `0`.
+
+- The locale is now passed to ostream insertion (`<<`) operators
+ (https://github.com/fmtlib/fmt/pull/1406):
+
+ ```c++
+ #include <fmt/locale.h>
+ #include <fmt/ostream.h>
+
+ struct S {
+ double value;
+ };
+
+ std::ostream& operator<<(std::ostream& os, S s) {
+ return os << s.value;
+ }
+
+ int main() {
+ auto s = fmt::format(std::locale("fr_FR.UTF-8"), "{}", S{0.42});
+ // s == "0,42"
+ }
+ ```
+
+ Thanks @dlaugt.
+
+- Locale-specific number formatting now uses grouping
+ (https://github.com/fmtlib/fmt/issues/1393,
+ https://github.com/fmtlib/fmt/pull/1394). Thanks @skrdaniel.
+
+- Fixed handling of types with deleted implicit rvalue conversion to
+ `const char**` (https://github.com/fmtlib/fmt/issues/1421):
+
+ ```c++
+ struct mystring {
+ operator const char*() const&;
+ operator const char*() &;
+ operator const char*() const&& = delete;
+ operator const char*() && = delete;
+ };
+ mystring str;
+ fmt::print("{}", str); // now compiles
+ ```
+
+- Enums are now mapped to correct underlying types instead of `int`
+ (https://github.com/fmtlib/fmt/pull/1286). Thanks @agmt.
+
+- Enum classes are no longer implicitly converted to `int`
+ (https://github.com/fmtlib/fmt/issues/1424).
+
+- Added `basic_format_parse_context` for consistency with C++20
+ `std::format` and deprecated `basic_parse_context`.
+
+- Fixed handling of UTF-8 in precision
+ (https://github.com/fmtlib/fmt/issues/1389,
+ https://github.com/fmtlib/fmt/pull/1390). Thanks @tajtiattila.
+
+- {fmt} can now be installed on Linux, macOS and Windows with
+ [Conda](https://docs.conda.io/en/latest/) using its
+ [conda-forge](https://conda-forge.org)
+ [package](https://github.com/conda-forge/fmt-feedstock)
+ (https://github.com/fmtlib/fmt/pull/1410):
+
+ conda install -c conda-forge fmt
+
+ Thanks @tdegeus.
+
+- Added a CUDA test (https://github.com/fmtlib/fmt/pull/1285,
+ https://github.com/fmtlib/fmt/pull/1317).
+ Thanks @luncliff and @risa2000.
+
+- Improved documentation
+ (https://github.com/fmtlib/fmt/pull/1276,
+ https://github.com/fmtlib/fmt/issues/1291,
+ https://github.com/fmtlib/fmt/issues/1296,
+ https://github.com/fmtlib/fmt/pull/1315,
+ https://github.com/fmtlib/fmt/pull/1332,
+ https://github.com/fmtlib/fmt/pull/1337,
+ https://github.com/fmtlib/fmt/issues/1395
+ https://github.com/fmtlib/fmt/pull/1418).
+ Thanks @waywardmonkeys, @pauldreik and @jackoalan.
+
+- Various code improvements
+ (https://github.com/fmtlib/fmt/pull/1358,
+ https://github.com/fmtlib/fmt/pull/1407).
+ Thanks @orivej and @dpacbach.
+
+- Fixed compile-time format string checks for user-defined types
+ (https://github.com/fmtlib/fmt/issues/1292).
+
+- Worked around a false positive in `unsigned-integer-overflow` sanitizer
+ (https://github.com/fmtlib/fmt/issues/1377).
+
+- Fixed various warnings and compilation issues
+ (https://github.com/fmtlib/fmt/issues/1273,
+ https://github.com/fmtlib/fmt/pull/1278,
+ https://github.com/fmtlib/fmt/pull/1280,
+ https://github.com/fmtlib/fmt/issues/1281,
+ https://github.com/fmtlib/fmt/issues/1288,
+ https://github.com/fmtlib/fmt/pull/1290,
+ https://github.com/fmtlib/fmt/pull/1301,
+ https://github.com/fmtlib/fmt/issues/1305,
+ https://github.com/fmtlib/fmt/issues/1306,
+ https://github.com/fmtlib/fmt/issues/1309,
+ https://github.com/fmtlib/fmt/pull/1312,
+ https://github.com/fmtlib/fmt/issues/1313,
+ https://github.com/fmtlib/fmt/issues/1316,
+ https://github.com/fmtlib/fmt/issues/1319,
+ https://github.com/fmtlib/fmt/pull/1320,
+ https://github.com/fmtlib/fmt/pull/1326,
+ https://github.com/fmtlib/fmt/pull/1328,
+ https://github.com/fmtlib/fmt/issues/1344,
+ https://github.com/fmtlib/fmt/pull/1345,
+ https://github.com/fmtlib/fmt/pull/1347,
+ https://github.com/fmtlib/fmt/pull/1349,
+ https://github.com/fmtlib/fmt/issues/1354,
+ https://github.com/fmtlib/fmt/issues/1362,
+ https://github.com/fmtlib/fmt/issues/1366,
+ https://github.com/fmtlib/fmt/pull/1364,
+ https://github.com/fmtlib/fmt/pull/1370,
+ https://github.com/fmtlib/fmt/pull/1371,
+ https://github.com/fmtlib/fmt/issues/1385,
+ https://github.com/fmtlib/fmt/issues/1388,
+ https://github.com/fmtlib/fmt/pull/1397,
+ https://github.com/fmtlib/fmt/pull/1414,
+ https://github.com/fmtlib/fmt/pull/1416,
+ https://github.com/fmtlib/fmt/issues/1422
+ https://github.com/fmtlib/fmt/pull/1427,
+ https://github.com/fmtlib/fmt/issues/1431,
+ https://github.com/fmtlib/fmt/pull/1433).
+ Thanks @hhb, @gsjaardema, @gabime, @neheb, @vedranmiletic, @dkavolis,
+ @mwinterb, @orivej, @denizevrenci, @leonklingele, @chronoxor, @kent-tri,
+ @0x8000-0000 and @marti4d.
+
+# 6.0.0 - 2019-08-26
+
+- Switched to the [MIT license](
+ https://github.com/fmtlib/fmt/blob/5a4b24613ba16cc689977c3b5bd8274a3ba1dd1f/LICENSE.rst)
+ with an optional exception that allows distributing binary code
+ without attribution.
+
+- Floating-point formatting is now locale-independent by default:
+
+ ```c++
+ #include <locale>
+ #include <fmt/core.h>
+
+ int main() {
+ std::locale::global(std::locale("ru_RU.UTF-8"));
+ fmt::print("value = {}", 4.2);
+ }
+ ```
+
+ prints \"value = 4.2\" regardless of the locale.
+
+ For locale-specific formatting use the `n` specifier:
+
+ ```c++
+ std::locale::global(std::locale("ru_RU.UTF-8"));
+ fmt::print("value = {:n}", 4.2);
+ ```
+
+ prints \"value = 4,2\".
+
+- Added an experimental Grisu floating-point formatting algorithm
+ implementation (disabled by default). To enable it compile with the
+ `FMT_USE_GRISU` macro defined to 1:
+
+ ```c++
+ #define FMT_USE_GRISU 1
+ #include <fmt/format.h>
+
+ auto s = fmt::format("{}", 4.2); // formats 4.2 using Grisu
+ ```
+
+ With Grisu enabled, {fmt} is 13x faster than `std::ostringstream`
+ (libc++) and 10x faster than `sprintf` on
+ [dtoa-benchmark](https://github.com/fmtlib/dtoa-benchmark) ([full
+ results](https://fmt.dev/unknown_mac64_clang10.0.html)):
+
+ ![](https://user-images.githubusercontent.com/576385/54883977-9fe8c000-4e28-11e9-8bde-272d122e7c52.jpg)
+
+- Separated formatting and parsing contexts for consistency with
+ [C++20 std::format](http://eel.is/c++draft/format), removing the
+ undocumented `basic_format_context::parse_context()` function.
+
+- Added [oss-fuzz](https://github.com/google/oss-fuzz) support
+ (https://github.com/fmtlib/fmt/pull/1199). Thanks @pauldreik.
+
+- `formatter` specializations now always take precedence over
+ `operator<<` (https://github.com/fmtlib/fmt/issues/952):
+
+ ```c++
+ #include <iostream>
+ #include <fmt/ostream.h>
+
+ struct S {};
+
+ std::ostream& operator<<(std::ostream& os, S) {
+ return os << 1;
+ }
+
+ template <>
+ struct fmt::formatter<S> : fmt::formatter<int> {
+ auto format(S, format_context& ctx) {
+ return formatter<int>::format(2, ctx);
+ }
+ };
+
+ int main() {
+ std::cout << S() << "\n"; // prints 1 using operator<<
+ fmt::print("{}\n", S()); // prints 2 using formatter
+ }
+ ```
+
+- Introduced the experimental `fmt::compile` function that does format
+ string compilation
+ (https://github.com/fmtlib/fmt/issues/618,
+ https://github.com/fmtlib/fmt/issues/1169,
+ https://github.com/fmtlib/fmt/pull/1171):
+
+ ```c++
+ #include <fmt/compile.h>
+
+ auto f = fmt::compile<int>("{}");
+ std::string s = fmt::format(f, 42); // can be called multiple times to
+ // format different values
+ // s == "42"
+ ```
+
+ It moves the cost of parsing a format string outside of the format
+ function which can be beneficial when identically formatting many
+ objects of the same types. Thanks @stryku.
+
+- Added experimental `%` format specifier that formats floating-point
+ values as percentages
+ (https://github.com/fmtlib/fmt/pull/1060,
+ https://github.com/fmtlib/fmt/pull/1069,
+ https://github.com/fmtlib/fmt/pull/1071):
+
+ ```c++
+ auto s = fmt::format("{:.1%}", 0.42); // s == "42.0%"
+ ```
+
+ Thanks @gawain-bolton.
+
+- Implemented precision for floating-point durations
+ (https://github.com/fmtlib/fmt/issues/1004,
+ https://github.com/fmtlib/fmt/pull/1012):
+
+ ```c++
+ auto s = fmt::format("{:.1}", std::chrono::duration<double>(1.234));
+ // s == 1.2s
+ ```
+
+ Thanks @DanielaE.
+
+- Implemented `chrono` format specifiers `%Q` and `%q` that give the
+ value and the unit respectively
+ (https://github.com/fmtlib/fmt/pull/1019):
+
+ ```c++
+ auto value = fmt::format("{:%Q}", 42s); // value == "42"
+ auto unit = fmt::format("{:%q}", 42s); // unit == "s"
+ ```
+
+ Thanks @DanielaE.
+
+- Fixed handling of dynamic width in chrono formatter:
+
+ ```c++
+ auto s = fmt::format("{0:{1}%H:%M:%S}", std::chrono::seconds(12345), 12);
+ // ^ width argument index ^ width
+ // s == "03:25:45 "
+ ```
+
+ Thanks Howard Hinnant.
+
+- Removed deprecated `fmt/time.h`. Use `fmt/chrono.h` instead.
+
+- Added `fmt::format` and `fmt::vformat` overloads that take
+ `text_style` (https://github.com/fmtlib/fmt/issues/993,
+ https://github.com/fmtlib/fmt/pull/994):
+
+ ```c++
+ #include <fmt/color.h>
+
+ std::string message = fmt::format(fmt::emphasis::bold | fg(fmt::color::red),
+ "The answer is {}.", 42);
+ ```
+
+ Thanks @Naios.
+
+- Removed the deprecated color API (`print_colored`). Use the new API,
+ namely `print` overloads that take `text_style` instead.
+
+- Made `std::unique_ptr` and `std::shared_ptr` formattable as pointers
+ via `fmt::ptr` (https://github.com/fmtlib/fmt/pull/1121):
+
+ ```c++
+ std::unique_ptr<int> p = ...;
+ fmt::print("{}", fmt::ptr(p)); // prints p as a pointer
+ ```
+
+ Thanks @sighingnow.
+
+- Made `print` and `vprint` report I/O errors
+ (https://github.com/fmtlib/fmt/issues/1098,
+ https://github.com/fmtlib/fmt/pull/1099). Thanks @BillyDonahue.
+
+- Marked deprecated APIs with the `[[deprecated]]` attribute and
+ removed internal uses of deprecated APIs
+ (https://github.com/fmtlib/fmt/pull/1022). Thanks @eliaskosunen.
+
+- Modernized the codebase using more C++11 features and removing
+ workarounds. Most importantly, `buffer_context` is now an alias
+ template, so use `buffer_context<T>` instead of
+ `buffer_context<T>::type`. These features require GCC 4.8 or later.
+
+- `formatter` specializations now always take precedence over implicit
+ conversions to `int` and the undocumented `convert_to_int` trait is
+ now deprecated.
+
+- Moved the undocumented `basic_writer`, `writer`, and `wwriter` types
+ to the `internal` namespace.
+
+- Removed deprecated `basic_format_context::begin()`. Use `out()`
+ instead.
+
+- Disallowed passing the result of `join` as an lvalue to prevent
+ misuse.
+
+- Refactored the undocumented structs that represent parsed format
+ specifiers to simplify the API and allow multibyte fill.
+
+- Moved SFINAE to template parameters to reduce symbol sizes.
+
+- Switched to `fputws` for writing wide strings so that it\'s no
+ longer required to call `_setmode` on Windows
+ (https://github.com/fmtlib/fmt/issues/1229,
+ https://github.com/fmtlib/fmt/pull/1243). Thanks @jackoalan.
+
+- Improved literal-based API
+ (https://github.com/fmtlib/fmt/pull/1254). Thanks @sylveon.
+
+- Added support for exotic platforms without `uintptr_t` such as IBM i
+ (AS/400) which has 128-bit pointers and only 64-bit integers
+ (https://github.com/fmtlib/fmt/issues/1059).
+
+- Added [Sublime Text syntax highlighting config](
+ https://github.com/fmtlib/fmt/blob/master/support/C%2B%2B.sublime-syntax)
+ (https://github.com/fmtlib/fmt/issues/1037). Thanks @Kronuz.
+
+- Added the `FMT_ENFORCE_COMPILE_STRING` macro to enforce the use of
+ compile-time format strings
+ (https://github.com/fmtlib/fmt/pull/1231). Thanks @jackoalan.
+
+- Stopped setting `CMAKE_BUILD_TYPE` if {fmt} is a subproject
+ (https://github.com/fmtlib/fmt/issues/1081).
+
+- Various build improvements
+ (https://github.com/fmtlib/fmt/pull/1039,
+ https://github.com/fmtlib/fmt/pull/1078,
+ https://github.com/fmtlib/fmt/pull/1091,
+ https://github.com/fmtlib/fmt/pull/1103,
+ https://github.com/fmtlib/fmt/pull/1177).
+ Thanks @luncliff, @jasonszang, @olafhering, @Lecetem and @pauldreik.
+
+- Improved documentation
+ (https://github.com/fmtlib/fmt/issues/1049,
+ https://github.com/fmtlib/fmt/pull/1051,
+ https://github.com/fmtlib/fmt/pull/1083,
+ https://github.com/fmtlib/fmt/pull/1113,
+ https://github.com/fmtlib/fmt/pull/1114,
+ https://github.com/fmtlib/fmt/issues/1146,
+ https://github.com/fmtlib/fmt/issues/1180,
+ https://github.com/fmtlib/fmt/pull/1250,
+ https://github.com/fmtlib/fmt/pull/1252,
+ https://github.com/fmtlib/fmt/pull/1265).
+ Thanks @mikelui, @foonathan, @BillyDonahue, @jwakely, @kaisbe and
+ @sdebionne.
+
+- Fixed ambiguous formatter specialization in `fmt/ranges.h`
+ (https://github.com/fmtlib/fmt/issues/1123).
+
+- Fixed formatting of a non-empty `std::filesystem::path` which is an
+ infinitely deep range of its components
+ (https://github.com/fmtlib/fmt/issues/1268).
+
+- Fixed handling of general output iterators when formatting
+ characters (https://github.com/fmtlib/fmt/issues/1056,
+ https://github.com/fmtlib/fmt/pull/1058). Thanks @abolz.
+
+- Fixed handling of output iterators in `formatter` specialization for
+ ranges (https://github.com/fmtlib/fmt/issues/1064).
+
+- Fixed handling of exotic character types
+ (https://github.com/fmtlib/fmt/issues/1188).
+
+- Made chrono formatting work with exceptions disabled
+ (https://github.com/fmtlib/fmt/issues/1062).
+
+- Fixed DLL visibility issues
+ (https://github.com/fmtlib/fmt/pull/1134,
+ https://github.com/fmtlib/fmt/pull/1147). Thanks @denchat.
+
+- Disabled the use of UDL template extension on GCC 9
+ (https://github.com/fmtlib/fmt/issues/1148).
+
+- Removed misplaced `format` compile-time checks from `printf`
+ (https://github.com/fmtlib/fmt/issues/1173).
+
+- Fixed issues in the experimental floating-point formatter
+ (https://github.com/fmtlib/fmt/issues/1072,
+ https://github.com/fmtlib/fmt/issues/1129,
+ https://github.com/fmtlib/fmt/issues/1153,
+ https://github.com/fmtlib/fmt/pull/1155,
+ https://github.com/fmtlib/fmt/issues/1210,
+ https://github.com/fmtlib/fmt/issues/1222). Thanks @alabuzhev.
+
+- Fixed bugs discovered by fuzzing or during fuzzing integration
+ (https://github.com/fmtlib/fmt/issues/1124,
+ https://github.com/fmtlib/fmt/issues/1127,
+ https://github.com/fmtlib/fmt/issues/1132,
+ https://github.com/fmtlib/fmt/pull/1135,
+ https://github.com/fmtlib/fmt/issues/1136,
+ https://github.com/fmtlib/fmt/issues/1141,
+ https://github.com/fmtlib/fmt/issues/1142,
+ https://github.com/fmtlib/fmt/issues/1178,
+ https://github.com/fmtlib/fmt/issues/1179,
+ https://github.com/fmtlib/fmt/issues/1194). Thanks @pauldreik.
+
+- Fixed building tests on FreeBSD and Hurd
+ (https://github.com/fmtlib/fmt/issues/1043). Thanks @jackyf.
+
+- Fixed various warnings and compilation issues
+ (https://github.com/fmtlib/fmt/pull/998,
+ https://github.com/fmtlib/fmt/pull/1006,
+ https://github.com/fmtlib/fmt/issues/1008,
+ https://github.com/fmtlib/fmt/issues/1011,
+ https://github.com/fmtlib/fmt/issues/1025,
+ https://github.com/fmtlib/fmt/pull/1027,
+ https://github.com/fmtlib/fmt/pull/1028,
+ https://github.com/fmtlib/fmt/pull/1029,
+ https://github.com/fmtlib/fmt/pull/1030,
+ https://github.com/fmtlib/fmt/pull/1031,
+ https://github.com/fmtlib/fmt/pull/1054,
+ https://github.com/fmtlib/fmt/issues/1063,
+ https://github.com/fmtlib/fmt/pull/1068,
+ https://github.com/fmtlib/fmt/pull/1074,
+ https://github.com/fmtlib/fmt/pull/1075,
+ https://github.com/fmtlib/fmt/pull/1079,
+ https://github.com/fmtlib/fmt/pull/1086,
+ https://github.com/fmtlib/fmt/issues/1088,
+ https://github.com/fmtlib/fmt/pull/1089,
+ https://github.com/fmtlib/fmt/pull/1094,
+ https://github.com/fmtlib/fmt/issues/1101,
+ https://github.com/fmtlib/fmt/pull/1102,
+ https://github.com/fmtlib/fmt/issues/1105,
+ https://github.com/fmtlib/fmt/pull/1107,
+ https://github.com/fmtlib/fmt/issues/1115,
+ https://github.com/fmtlib/fmt/issues/1117,
+ https://github.com/fmtlib/fmt/issues/1118,
+ https://github.com/fmtlib/fmt/issues/1120,
+ https://github.com/fmtlib/fmt/issues/1123,
+ https://github.com/fmtlib/fmt/pull/1139,
+ https://github.com/fmtlib/fmt/issues/1140,
+ https://github.com/fmtlib/fmt/issues/1143,
+ https://github.com/fmtlib/fmt/pull/1144,
+ https://github.com/fmtlib/fmt/pull/1150,
+ https://github.com/fmtlib/fmt/pull/1151,
+ https://github.com/fmtlib/fmt/issues/1152,
+ https://github.com/fmtlib/fmt/issues/1154,
+ https://github.com/fmtlib/fmt/issues/1156,
+ https://github.com/fmtlib/fmt/pull/1159,
+ https://github.com/fmtlib/fmt/issues/1175,
+ https://github.com/fmtlib/fmt/issues/1181,
+ https://github.com/fmtlib/fmt/issues/1186,
+ https://github.com/fmtlib/fmt/pull/1187,
+ https://github.com/fmtlib/fmt/pull/1191,
+ https://github.com/fmtlib/fmt/issues/1197,
+ https://github.com/fmtlib/fmt/issues/1200,
+ https://github.com/fmtlib/fmt/issues/1203,
+ https://github.com/fmtlib/fmt/issues/1205,
+ https://github.com/fmtlib/fmt/pull/1206,
+ https://github.com/fmtlib/fmt/issues/1213,
+ https://github.com/fmtlib/fmt/issues/1214,
+ https://github.com/fmtlib/fmt/pull/1217,
+ https://github.com/fmtlib/fmt/issues/1228,
+ https://github.com/fmtlib/fmt/pull/1230,
+ https://github.com/fmtlib/fmt/issues/1232,
+ https://github.com/fmtlib/fmt/pull/1235,
+ https://github.com/fmtlib/fmt/pull/1236,
+ https://github.com/fmtlib/fmt/issues/1240).
+ Thanks @DanielaE, @mwinterb, @eliaskosunen, @morinmorin, @ricco19,
+ @waywardmonkeys, @chronoxor, @remyabel, @pauldreik, @gsjaardema, @rcane,
+ @mocabe, @denchat, @cjdb, @HazardyKnusperkeks, @vedranmiletic, @jackoalan,
+ @DaanDeMeyer and @starkmapper.
+
+# 5.3.0 - 2018-12-28
+
+- Introduced experimental chrono formatting support:
+
+ ```c++
+ #include <fmt/chrono.h>
+
+ int main() {
+ using namespace std::literals::chrono_literals;
+ fmt::print("Default format: {} {}\n", 42s, 100ms);
+ fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s);
+ }
+ ```
+
+ prints:
+
+ Default format: 42s 100ms
+ strftime-like format: 03:15:30
+
+- Added experimental support for emphasis (bold, italic, underline,
+ strikethrough), colored output to a file stream, and improved
+ colored formatting API
+ (https://github.com/fmtlib/fmt/pull/961,
+ https://github.com/fmtlib/fmt/pull/967,
+ https://github.com/fmtlib/fmt/pull/973):
+
+ ```c++
+ #include <fmt/color.h>
+
+ int main() {
+ fmt::print(fg(fmt::color::crimson) | fmt::emphasis::bold,
+ "Hello, {}!\n", "world");
+ fmt::print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) |
+ fmt::emphasis::underline, "Olá, {}!\n", "Mundo");
+ fmt::print(fg(fmt::color::steel_blue) | fmt::emphasis::italic,
+ "你好{}!\n", "世界");
+ }
+ ```
+
+ prints the following on modern terminals with RGB color support:
+
+ ![](https://github.com/fmtlib/fmt/assets/%0A576385/2a93c904-d6fa-4aa6-b453-2618e1c327d7)
+
+ Thanks @Rakete1111.
+
+- Added support for 4-bit terminal colors
+ (https://github.com/fmtlib/fmt/issues/968,
+ https://github.com/fmtlib/fmt/pull/974)
+
+ ```c++
+ #include <fmt/color.h>
+
+ int main() {
+ print(fg(fmt::terminal_color::red), "stop\n");
+ }
+ ```
+
+ Note that these colors vary by terminal:
+
+ ![](https://user-images.githubusercontent.com/576385/50405925-dbfc7e00-0770-11e9-9b85-333fab0af9ac.png)
+
+ Thanks @Rakete1111.
+
+- Parameterized formatting functions on the type of the format string
+ (https://github.com/fmtlib/fmt/issues/880,
+ https://github.com/fmtlib/fmt/pull/881,
+ https://github.com/fmtlib/fmt/pull/883,
+ https://github.com/fmtlib/fmt/pull/885,
+ https://github.com/fmtlib/fmt/pull/897,
+ https://github.com/fmtlib/fmt/issues/920). Any object of
+ type `S` that has an overloaded `to_string_view(const S&)` returning
+ `fmt::string_view` can be used as a format string:
+
+ ```c++
+ namespace my_ns {
+ inline string_view to_string_view(const my_string& s) {
+ return {s.data(), s.length()};
+ }
+ }
+
+ std::string message = fmt::format(my_string("The answer is {}."), 42);
+ ```
+
+ Thanks @DanielaE.
+
+- Made `std::string_view` work as a format string
+ (https://github.com/fmtlib/fmt/pull/898):
+
+ ```c++
+ auto message = fmt::format(std::string_view("The answer is {}."), 42);
+ ```
+
+ Thanks @DanielaE.
+
+- Added wide string support to compile-time format string checks
+ (https://github.com/fmtlib/fmt/pull/924):
+
+ ```c++
+ print(fmt(L"{:f}"), 42); // compile-time error: invalid type specifier
+ ```
+
+ Thanks @XZiar.
+
+- Made colored print functions work with wide strings
+ (https://github.com/fmtlib/fmt/pull/867):
+
+ ```c++
+ #include <fmt/color.h>
+
+ int main() {
+ print(fg(fmt::color::red), L"{}\n", 42);
+ }
+ ```
+
+ Thanks @DanielaE.
+
+- Introduced experimental Unicode support
+ (https://github.com/fmtlib/fmt/issues/628,
+ https://github.com/fmtlib/fmt/pull/891):
+
+ ```c++
+ using namespace fmt::literals;
+ auto s = fmt::format("{:*^5}"_u, "🤡"_u); // s == "**🤡**"_u
+ ```
+
+- Improved locale support:
+
+ ```c++
+ #include <fmt/locale.h>
+
+ struct numpunct : std::numpunct<char> {
+ protected:
+ char do_thousands_sep() const override { return '~'; }
+ };
+
+ std::locale loc;
+ auto s = fmt::format(std::locale(loc, new numpunct()), "{:n}", 1234567);
+ // s == "1~234~567"
+ ```
+
+- Constrained formatting functions on proper iterator types
+ (https://github.com/fmtlib/fmt/pull/921). Thanks @DanielaE.
+
+- Added `make_printf_args` and `make_wprintf_args` functions
+ (https://github.com/fmtlib/fmt/pull/934). Thanks @tnovotny.
+
+- Deprecated `fmt::visit`, `parse_context`, and `wparse_context`. Use
+ `fmt::visit_format_arg`, `format_parse_context`, and
+ `wformat_parse_context` instead.
+
+- Removed undocumented `basic_fixed_buffer` which has been superseded
+ by the iterator-based API
+ (https://github.com/fmtlib/fmt/issues/873,
+ https://github.com/fmtlib/fmt/pull/902). Thanks @superfunc.
+
+- Disallowed repeated leading zeros in an argument ID:
+
+ ```c++
+ fmt::print("{000}", 42); // error
+ ```
+
+- Reintroduced support for gcc 4.4.
+
+- Fixed compilation on platforms with exotic `double`
+ (https://github.com/fmtlib/fmt/issues/878).
+
+- Improved documentation
+ (https://github.com/fmtlib/fmt/issues/164,
+ https://github.com/fmtlib/fmt/issues/877,
+ https://github.com/fmtlib/fmt/pull/901,
+ https://github.com/fmtlib/fmt/pull/906,
+ https://github.com/fmtlib/fmt/pull/979).
+ Thanks @kookjr, @DarkDimius and @HecticSerenity.
+
+- Added pkgconfig support which makes it easier to consume the library
+ from meson and other build systems
+ (https://github.com/fmtlib/fmt/pull/916). Thanks @colemickens.
+
+- Various build improvements
+ (https://github.com/fmtlib/fmt/pull/909,
+ https://github.com/fmtlib/fmt/pull/926,
+ https://github.com/fmtlib/fmt/pull/937,
+ https://github.com/fmtlib/fmt/pull/953,
+ https://github.com/fmtlib/fmt/pull/959).
+ Thanks @tchaikov, @luncliff, @AndreasSchoenle, @hotwatermorning and @Zefz.
+
+- Improved `string_view` construction performance
+ (https://github.com/fmtlib/fmt/pull/914). Thanks @gabime.
+
+- Fixed non-matching char types
+ (https://github.com/fmtlib/fmt/pull/895). Thanks @DanielaE.
+
+- Fixed `format_to_n` with `std::back_insert_iterator`
+ (https://github.com/fmtlib/fmt/pull/913). Thanks @DanielaE.
+
+- Fixed locale-dependent formatting
+ (https://github.com/fmtlib/fmt/issues/905).
+
+- Fixed various compiler warnings and errors
+ (https://github.com/fmtlib/fmt/pull/882,
+ https://github.com/fmtlib/fmt/pull/886,
+ https://github.com/fmtlib/fmt/pull/933,
+ https://github.com/fmtlib/fmt/pull/941,
+ https://github.com/fmtlib/fmt/issues/931,
+ https://github.com/fmtlib/fmt/pull/943,
+ https://github.com/fmtlib/fmt/pull/954,
+ https://github.com/fmtlib/fmt/pull/956,
+ https://github.com/fmtlib/fmt/pull/962,
+ https://github.com/fmtlib/fmt/issues/965,
+ https://github.com/fmtlib/fmt/issues/977,
+ https://github.com/fmtlib/fmt/pull/983,
+ https://github.com/fmtlib/fmt/pull/989).
+ Thanks @Luthaf, @stevenhoving, @christinaa, @lgritz, @DanielaE,
+ @0x8000-0000 and @liuping1997.
+
+# 5.2.1 - 2018-09-21
+
+- Fixed `visit` lookup issues on gcc 7 & 8
+ (https://github.com/fmtlib/fmt/pull/870). Thanks @medithe.
+- Fixed linkage errors on older gcc.
+- Prevented `fmt/range.h` from specializing `fmt::basic_string_view`
+ (https://github.com/fmtlib/fmt/issues/865,
+ https://github.com/fmtlib/fmt/pull/868). Thanks @hhggit.
+- Improved error message when formatting unknown types
+ (https://github.com/fmtlib/fmt/pull/872). Thanks @foonathan.
+- Disabled templated user-defined literals when compiled under nvcc
+ (https://github.com/fmtlib/fmt/pull/875). Thanks @CandyGumdrop.
+- Fixed `format_to` formatting to `wmemory_buffer`
+ (https://github.com/fmtlib/fmt/issues/874).
+
+# 5.2.0 - 2018-09-13
+
+- Optimized format string parsing and argument processing which
+ resulted in up to 5x speed up on long format strings and significant
+ performance boost on various benchmarks. For example, version 5.2 is
+ 2.22x faster than 5.1 on decimal integer formatting with `format_to`
+ (macOS, clang-902.0.39.2):
+
+ | Method | Time, s | Speedup |
+ | -------------------------- | --------------: | ------: |
+ | fmt::format 5.1 | 0.58 | |
+ | fmt::format 5.2 | 0.35 | 1.66x |
+ | fmt::format_to 5.1 | 0.51 | |
+ | fmt::format_to 5.2 | 0.23 | 2.22x |
+ | sprintf | 0.71 | |
+ | std::to_string | 1.01 | |
+ | std::stringstream | 1.73 | |
+
+- Changed the `fmt` macro from opt-out to opt-in to prevent name
+ collisions. To enable it define the `FMT_STRING_ALIAS` macro to 1
+ before including `fmt/format.h`:
+
+ ```c++
+ #define FMT_STRING_ALIAS 1
+ #include <fmt/format.h>
+ std::string answer = format(fmt("{}"), 42);
+ ```
+
+- Added compile-time format string checks to `format_to` overload that
+ takes `fmt::memory_buffer`
+ (https://github.com/fmtlib/fmt/issues/783):
+
+ ```c++
+ fmt::memory_buffer buf;
+ // Compile-time error: invalid type specifier.
+ fmt::format_to(buf, fmt("{:d}"), "foo");
+ ```
+
+- Moved experimental color support to `fmt/color.h` and enabled the
+ new API by default. The old API can be enabled by defining the
+ `FMT_DEPRECATED_COLORS` macro.
+
+- Added formatting support for types explicitly convertible to
+ `fmt::string_view`:
+
+ ```c++
+ struct foo {
+ explicit operator fmt::string_view() const { return "foo"; }
+ };
+ auto s = format("{}", foo());
+ ```
+
+ In particular, this makes formatting function work with
+ `folly::StringPiece`.
+
+- Implemented preliminary support for `char*_t` by replacing the
+ `format` function overloads with a single function template
+ parameterized on the string type.
+
+- Added support for dynamic argument lists
+ (https://github.com/fmtlib/fmt/issues/814,
+ https://github.com/fmtlib/fmt/pull/819). Thanks @MikePopoloski.
+
+- Reduced executable size overhead for embedded targets using newlib
+ nano by making locale dependency optional
+ (https://github.com/fmtlib/fmt/pull/839). Thanks @teajay-fr.
+
+- Keep `noexcept` specifier when exceptions are disabled
+ (https://github.com/fmtlib/fmt/issues/801,
+ https://github.com/fmtlib/fmt/pull/810). Thanks @qis.
+
+- Fixed formatting of user-defined types providing `operator<<` with
+ `format_to_n` (https://github.com/fmtlib/fmt/pull/806).
+ Thanks @mkurdej.
+
+- Fixed dynamic linkage of new symbols
+ (https://github.com/fmtlib/fmt/issues/808).
+
+- Fixed global initialization issue
+ (https://github.com/fmtlib/fmt/issues/807):
+
+ ```c++
+ // This works on compilers with constexpr support.
+ static const std::string answer = fmt::format("{}", 42);
+ ```
+
+- Fixed various compiler warnings and errors
+ (https://github.com/fmtlib/fmt/pull/804,
+ https://github.com/fmtlib/fmt/issues/809,
+ https://github.com/fmtlib/fmt/pull/811,
+ https://github.com/fmtlib/fmt/issues/822,
+ https://github.com/fmtlib/fmt/pull/827,
+ https://github.com/fmtlib/fmt/issues/830,
+ https://github.com/fmtlib/fmt/pull/838,
+ https://github.com/fmtlib/fmt/issues/843,
+ https://github.com/fmtlib/fmt/pull/844,
+ https://github.com/fmtlib/fmt/issues/851,
+ https://github.com/fmtlib/fmt/pull/852,
+ https://github.com/fmtlib/fmt/pull/854).
+ Thanks @henryiii, @medithe, and @eliasdaler.
+
+# 5.1.0 - 2018-07-05
+
+- Added experimental support for RGB color output enabled with the
+ `FMT_EXTENDED_COLORS` macro:
+
+ ```c++
+ #define FMT_EXTENDED_COLORS
+ #define FMT_HEADER_ONLY // or compile fmt with FMT_EXTENDED_COLORS defined
+ #include <fmt/format.h>
+
+ fmt::print(fmt::color::steel_blue, "Some beautiful text");
+ ```
+
+ The old API (the `print_colored` and `vprint_colored` functions and
+ the `color` enum) is now deprecated.
+ (https://github.com/fmtlib/fmt/issues/762
+ https://github.com/fmtlib/fmt/pull/767). thanks @Remotion.
+
+- Added quotes to strings in ranges and tuples
+ (https://github.com/fmtlib/fmt/pull/766). Thanks @Remotion.
+
+- Made `format_to` work with `basic_memory_buffer`
+ (https://github.com/fmtlib/fmt/issues/776).
+
+- Added `vformat_to_n` and `wchar_t` overload of `format_to_n`
+ (https://github.com/fmtlib/fmt/issues/764,
+ https://github.com/fmtlib/fmt/issues/769).
+
+- Made `is_range` and `is_tuple_like` part of public (experimental)
+ API to allow specialization for user-defined types
+ (https://github.com/fmtlib/fmt/issues/751,
+ https://github.com/fmtlib/fmt/pull/759). Thanks @drrlvn.
+
+- Added more compilers to continuous integration and increased
+ `FMT_PEDANTIC` warning levels
+ (https://github.com/fmtlib/fmt/pull/736). Thanks @eliaskosunen.
+
+- Fixed compilation with MSVC 2013.
+
+- Fixed handling of user-defined types in `format_to`
+ (https://github.com/fmtlib/fmt/issues/793).
+
+- Forced linking of inline `vformat` functions into the library
+ (https://github.com/fmtlib/fmt/issues/795).
+
+- Fixed incorrect call to on_align in `'{:}='`
+ (https://github.com/fmtlib/fmt/issues/750).
+
+- Fixed floating-point formatting to a non-back_insert_iterator with
+ sign & numeric alignment specified
+ (https://github.com/fmtlib/fmt/issues/756).
+
+- Fixed formatting to an array with `format_to_n`
+ (https://github.com/fmtlib/fmt/issues/778).
+
+- Fixed formatting of more than 15 named arguments
+ (https://github.com/fmtlib/fmt/issues/754).
+
+- Fixed handling of compile-time strings when including
+ `fmt/ostream.h`. (https://github.com/fmtlib/fmt/issues/768).
+
+- Fixed various compiler warnings and errors
+ (https://github.com/fmtlib/fmt/issues/742,
+ https://github.com/fmtlib/fmt/issues/748,
+ https://github.com/fmtlib/fmt/issues/752,
+ https://github.com/fmtlib/fmt/issues/770,
+ https://github.com/fmtlib/fmt/pull/775,
+ https://github.com/fmtlib/fmt/issues/779,
+ https://github.com/fmtlib/fmt/pull/780,
+ https://github.com/fmtlib/fmt/pull/790,
+ https://github.com/fmtlib/fmt/pull/792,
+ https://github.com/fmtlib/fmt/pull/800).
+ Thanks @Remotion, @gabime, @foonathan, @Dark-Passenger and @0x8000-0000.
+
+# 5.0.0 - 2018-05-21
+
+- Added a requirement for partial C++11 support, most importantly
+ variadic templates and type traits, and dropped `FMT_VARIADIC_*`
+ emulation macros. Variadic templates are available since GCC 4.4,
+ Clang 2.9 and MSVC 18.0 (2013). For older compilers use {fmt}
+ [version 4.x](https://github.com/fmtlib/fmt/releases/tag/4.1.0)
+ which continues to be maintained and works with C++98 compilers.
+
+- Renamed symbols to follow standard C++ naming conventions and
+ proposed a subset of the library for standardization in [P0645R2
+ Text Formatting](https://wg21.link/P0645).
+
+- Implemented `constexpr` parsing of format strings and [compile-time
+ format string
+ checks](https://fmt.dev/latest/api.html#compile-time-format-string-checks).
+ For example
+
+ ```c++
+ #include <fmt/format.h>
+
+ std::string s = format(fmt("{:d}"), "foo");
+ ```
+
+ gives a compile-time error because `d` is an invalid specifier for
+ strings ([godbolt](https://godbolt.org/g/rnCy9Q)):
+
+ ...
+ <source>:4:19: note: in instantiation of function template specialization 'fmt::v5::format<S, char [4]>' requested here
+ std::string s = format(fmt("{:d}"), "foo");
+ ^
+ format.h:1337:13: note: non-constexpr function 'on_error' cannot be used in a constant expression
+ handler.on_error("invalid type specifier");
+
+ Compile-time checks require relaxed `constexpr` (C++14 feature)
+ support. If the latter is not available, checks will be performed at
+ runtime.
+
+- Separated format string parsing and formatting in the extension API
+ to enable compile-time format string processing. For example
+
+ ```c++
+ struct Answer {};
+
+ namespace fmt {
+ template <>
+ struct formatter<Answer> {
+ constexpr auto parse(parse_context& ctx) {
+ auto it = ctx.begin();
+ spec = *it;
+ if (spec != 'd' && spec != 's')
+ throw format_error("invalid specifier");
+ return ++it;
+ }
+
+ template <typename FormatContext>
+ auto format(Answer, FormatContext& ctx) {
+ return spec == 's' ?
+ format_to(ctx.begin(), "{}", "fourty-two") :
+ format_to(ctx.begin(), "{}", 42);
+ }
+
+ char spec = 0;
+ };
+ }
+
+ std::string s = format(fmt("{:x}"), Answer());
+ ```
+
+ gives a compile-time error due to invalid format specifier
+ ([godbolt](https://godbolt.org/g/2jQ1Dv)):
+
+ ...
+ <source>:12:45: error: expression '<throw-expression>' is not a constant expression
+ throw format_error("invalid specifier");
+
+- Added [iterator
+ support](https://fmt.dev/latest/api.html#output-iterator-support):
+
+ ```c++
+ #include <vector>
+ #include <fmt/format.h>
+
+ std::vector<char> out;
+ fmt::format_to(std::back_inserter(out), "{}", 42);
+ ```
+
+- Added the
+ [format_to_n](https://fmt.dev/latest/api.html#_CPPv2N3fmt11format_to_nE8OutputItNSt6size_tE11string_viewDpRK4Args)
+ function that restricts the output to the specified number of
+ characters (https://github.com/fmtlib/fmt/issues/298):
+
+ ```c++
+ char out[4];
+ fmt::format_to_n(out, sizeof(out), "{}", 12345);
+ // out == "1234" (without terminating '\0')
+ ```
+
+- Added the [formatted_size](
+ https://fmt.dev/latest/api.html#_CPPv2N3fmt14formatted_sizeE11string_viewDpRK4Args)
+ function for computing the output size:
+
+ ```c++
+ #include <fmt/format.h>
+
+ auto size = fmt::formatted_size("{}", 12345); // size == 5
+ ```
+
+- Improved compile times by reducing dependencies on standard headers
+ and providing a lightweight [core
+ API](https://fmt.dev/latest/api.html#core-api):
+
+ ```c++
+ #include <fmt/core.h>
+
+ fmt::print("The answer is {}.", 42);
+ ```
+
+ See [Compile time and code
+ bloat](https://github.com/fmtlib/fmt#compile-time-and-code-bloat).
+
+- Added the [make_format_args](
+ https://fmt.dev/latest/api.html#_CPPv2N3fmt16make_format_argsEDpRK4Args)
+ function for capturing formatting arguments:
+
+ ```c++
+ // Prints formatted error message.
+ void vreport_error(const char *format, fmt::format_args args) {
+ fmt::print("Error: ");
+ fmt::vprint(format, args);
+ }
+ template <typename... Args>
+ void report_error(const char *format, const Args & ... args) {
+ vreport_error(format, fmt::make_format_args(args...));
+ }
+ ```
+
+- Added the `make_printf_args` function for capturing `printf`
+ arguments (https://github.com/fmtlib/fmt/issues/687,
+ https://github.com/fmtlib/fmt/pull/694). Thanks @Kronuz.
+
+- Added prefix `v` to non-variadic functions taking `format_args` to
+ distinguish them from variadic ones:
+
+ ```c++
+ std::string vformat(string_view format_str, format_args args);
+
+ template <typename... Args>
+ std::string format(string_view format_str, const Args & ... args);
+ ```
+
+- Added experimental support for formatting ranges, containers and
+ tuple-like types in `fmt/ranges.h`
+ (https://github.com/fmtlib/fmt/pull/735):
+
+ ```c++
+ #include <fmt/ranges.h>
+
+ std::vector<int> v = {1, 2, 3};
+ fmt::print("{}", v); // prints {1, 2, 3}
+ ```
+
+ Thanks @Remotion.
+
+- Implemented `wchar_t` date and time formatting
+ (https://github.com/fmtlib/fmt/pull/712):
+
+ ```c++
+ #include <fmt/time.h>
+
+ std::time_t t = std::time(nullptr);
+ auto s = fmt::format(L"The date is {:%Y-%m-%d}.", *std::localtime(&t));
+ ```
+
+ Thanks @DanielaE.
+
+- Provided more wide string overloads
+ (https://github.com/fmtlib/fmt/pull/724). Thanks @DanielaE.
+
+- Switched from a custom null-terminated string view class to
+ `string_view` in the format API and provided `fmt::string_view`
+ which implements a subset of `std::string_view` API for pre-C++17
+ systems.
+
+- Added support for `std::experimental::string_view`
+ (https://github.com/fmtlib/fmt/pull/607):
+
+ ```c++
+ #include <fmt/core.h>
+ #include <experimental/string_view>
+
+ fmt::print("{}", std::experimental::string_view("foo"));
+ ```
+
+ Thanks @virgiliofornazin.
+
+- Allowed mixing named and automatic arguments:
+
+ ```c++
+ fmt::format("{} {two}", 1, fmt::arg("two", 2));
+ ```
+
+- Removed the write API in favor of the [format
+ API](https://fmt.dev/latest/api.html#format-api) with compile-time
+ handling of format strings.
+
+- Disallowed formatting of multibyte strings into a wide character
+ target (https://github.com/fmtlib/fmt/pull/606).
+
+- Improved documentation
+ (https://github.com/fmtlib/fmt/pull/515,
+ https://github.com/fmtlib/fmt/issues/614,
+ https://github.com/fmtlib/fmt/pull/617,
+ https://github.com/fmtlib/fmt/pull/661,
+ https://github.com/fmtlib/fmt/pull/680).
+ Thanks @ibell, @mihaitodor and @johnthagen.
+
+- Implemented more efficient handling of large number of format
+ arguments.
+
+- Introduced an inline namespace for symbol versioning.
+
+- Added debug postfix `d` to the `fmt` library name
+ (https://github.com/fmtlib/fmt/issues/636).
+
+- Removed unnecessary `fmt/` prefix in includes
+ (https://github.com/fmtlib/fmt/pull/397). Thanks @chronoxor.
+
+- Moved `fmt/*.h` to `include/fmt/*.h` to prevent irrelevant files and
+ directories appearing on the include search paths when fmt is used
+ as a subproject and moved source files to the `src` directory.
+
+- Added qmake project file `support/fmt.pro`
+ (https://github.com/fmtlib/fmt/pull/641). Thanks @cowo78.
+
+- Added Gradle build file `support/build.gradle`
+ (https://github.com/fmtlib/fmt/pull/649). Thanks @luncliff.
+
+- Removed `FMT_CPPFORMAT` CMake option.
+
+- Fixed a name conflict with the macro `CHAR_WIDTH` in glibc
+ (https://github.com/fmtlib/fmt/pull/616). Thanks @aroig.
+
+- Fixed handling of nested braces in `fmt::join`
+ (https://github.com/fmtlib/fmt/issues/638).
+
+- Added `SOURCELINK_SUFFIX` for compatibility with Sphinx 1.5
+ (https://github.com/fmtlib/fmt/pull/497). Thanks @ginggs.
+
+- Added a missing `inline` in the header-only mode
+ (https://github.com/fmtlib/fmt/pull/626). Thanks @aroig.
+
+- Fixed various compiler warnings
+ (https://github.com/fmtlib/fmt/pull/640,
+ https://github.com/fmtlib/fmt/pull/656,
+ https://github.com/fmtlib/fmt/pull/679,
+ https://github.com/fmtlib/fmt/pull/681,
+ https://github.com/fmtlib/fmt/pull/705,
+ https://github.com/fmtlib/fmt/issues/715,
+ https://github.com/fmtlib/fmt/pull/717,
+ https://github.com/fmtlib/fmt/pull/720,
+ https://github.com/fmtlib/fmt/pull/723,
+ https://github.com/fmtlib/fmt/pull/726,
+ https://github.com/fmtlib/fmt/pull/730,
+ https://github.com/fmtlib/fmt/pull/739).
+ Thanks @peterbell10, @LarsGullik, @foonathan, @eliaskosunen,
+ @christianparpart, @DanielaE and @mwinterb.
+
+- Worked around an MSVC bug and fixed several warnings
+ (https://github.com/fmtlib/fmt/pull/653). Thanks @alabuzhev.
+
+- Worked around GCC bug 67371
+ (https://github.com/fmtlib/fmt/issues/682).
+
+- Fixed compilation with `-fno-exceptions`
+ (https://github.com/fmtlib/fmt/pull/655). Thanks @chenxiaolong.
+
+- Made `constexpr remove_prefix` gcc version check tighter
+ (https://github.com/fmtlib/fmt/issues/648).
+
+- Renamed internal type enum constants to prevent collision with
+ poorly written C libraries
+ (https://github.com/fmtlib/fmt/issues/644).
+
+- Added detection of `wostream operator<<`
+ (https://github.com/fmtlib/fmt/issues/650).
+
+- Fixed compilation on OpenBSD
+ (https://github.com/fmtlib/fmt/pull/660). Thanks @hubslave.
+
+- Fixed compilation on FreeBSD 12
+ (https://github.com/fmtlib/fmt/pull/732). Thanks @dankm.
+
+- Fixed compilation when there is a mismatch between `-std` options
+ between the library and user code
+ (https://github.com/fmtlib/fmt/issues/664).
+
+- Fixed compilation with GCC 7 and `-std=c++11`
+ (https://github.com/fmtlib/fmt/issues/734).
+
+- Improved generated binary code on GCC 7 and older
+ (https://github.com/fmtlib/fmt/issues/668).
+
+- Fixed handling of numeric alignment with no width
+ (https://github.com/fmtlib/fmt/issues/675).
+
+- Fixed handling of empty strings in UTF8/16 converters
+ (https://github.com/fmtlib/fmt/pull/676). Thanks @vgalka-sl.
+
+- Fixed formatting of an empty `string_view`
+ (https://github.com/fmtlib/fmt/issues/689).
+
+- Fixed detection of `string_view` on libc++
+ (https://github.com/fmtlib/fmt/issues/686).
+
+- Fixed DLL issues (https://github.com/fmtlib/fmt/pull/696).
+ Thanks @sebkoenig.
+
+- Fixed compile checks for mixing narrow and wide strings
+ (https://github.com/fmtlib/fmt/issues/690).
+
+- Disabled unsafe implicit conversion to `std::string`
+ (https://github.com/fmtlib/fmt/issues/729).
+
+- Fixed handling of reused format specs (as in `fmt::join`) for
+ pointers (https://github.com/fmtlib/fmt/pull/725). Thanks @mwinterb.
+
+- Fixed installation of `fmt/ranges.h`
+ (https://github.com/fmtlib/fmt/pull/738). Thanks @sv1990.
+
+# 4.1.0 - 2017-12-20
+
+- Added `fmt::to_wstring()` in addition to `fmt::to_string()`
+ (https://github.com/fmtlib/fmt/pull/559). Thanks @alabuzhev.
+- Added support for C++17 `std::string_view`
+ (https://github.com/fmtlib/fmt/pull/571 and
+ https://github.com/fmtlib/fmt/pull/578).
+ Thanks @thelostt and @mwinterb.
+- Enabled stream exceptions to catch errors
+ (https://github.com/fmtlib/fmt/issues/581). Thanks @crusader-mike.
+- Allowed formatting of class hierarchies with `fmt::format_arg()`
+ (https://github.com/fmtlib/fmt/pull/547). Thanks @rollbear.
+- Removed limitations on character types
+ (https://github.com/fmtlib/fmt/pull/563). Thanks @Yelnats321.
+- Conditionally enabled use of `std::allocator_traits`
+ (https://github.com/fmtlib/fmt/pull/583). Thanks @mwinterb.
+- Added support for `const` variadic member function emulation with
+ `FMT_VARIADIC_CONST`
+ (https://github.com/fmtlib/fmt/pull/591). Thanks @ludekvodicka.
+- Various bugfixes: bad overflow check, unsupported implicit type
+ conversion when determining formatting function, test segfaults
+ (https://github.com/fmtlib/fmt/issues/551), ill-formed
+ macros (https://github.com/fmtlib/fmt/pull/542) and
+ ambiguous overloads
+ (https://github.com/fmtlib/fmt/issues/580). Thanks @xylosper.
+- Prevented warnings on MSVC
+ (https://github.com/fmtlib/fmt/pull/605,
+ https://github.com/fmtlib/fmt/pull/602, and
+ https://github.com/fmtlib/fmt/pull/545), clang
+ (https://github.com/fmtlib/fmt/pull/582), GCC
+ (https://github.com/fmtlib/fmt/issues/573), various
+ conversion warnings (https://github.com/fmtlib/fmt/pull/609,
+ https://github.com/fmtlib/fmt/pull/567,
+ https://github.com/fmtlib/fmt/pull/553 and
+ https://github.com/fmtlib/fmt/pull/553), and added
+ `override` and `[[noreturn]]`
+ (https://github.com/fmtlib/fmt/pull/549 and
+ https://github.com/fmtlib/fmt/issues/555).
+ Thanks @alabuzhev, @virgiliofornazin, @alexanderbock, @yumetodo, @VaderY,
+ @jpcima, @thelostt and @Manu343726.
+- Improved CMake: Used `GNUInstallDirs` to set installation location
+ (https://github.com/fmtlib/fmt/pull/610) and fixed warnings
+ (https://github.com/fmtlib/fmt/pull/536 and
+ https://github.com/fmtlib/fmt/pull/556).
+ Thanks @mikecrowe, @evgen231 and @henryiii.
+
+# 4.0.0 - 2017-06-27
+
+- Removed old compatibility headers `cppformat/*.h` and CMake options
+ (https://github.com/fmtlib/fmt/pull/527). Thanks @maddinat0r.
+
+- Added `string.h` containing `fmt::to_string()` as alternative to
+ `std::to_string()` as well as other string writer functionality
+ (https://github.com/fmtlib/fmt/issues/326 and
+ https://github.com/fmtlib/fmt/pull/441):
+
+ ```c++
+ #include "fmt/string.h"
+
+ std::string answer = fmt::to_string(42);
+ ```
+
+ Thanks @glebov-andrey.
+
+- Moved `fmt::printf()` to new `printf.h` header and allowed `%s` as
+ generic specifier (https://github.com/fmtlib/fmt/pull/453),
+ made `%.f` more conformant to regular `printf()`
+ (https://github.com/fmtlib/fmt/pull/490), added custom
+ writer support (https://github.com/fmtlib/fmt/issues/476)
+ and implemented missing custom argument formatting
+ (https://github.com/fmtlib/fmt/pull/339 and
+ https://github.com/fmtlib/fmt/pull/340):
+
+ ```c++
+ #include "fmt/printf.h"
+
+ // %s format specifier can be used with any argument type.
+ fmt::printf("%s", 42);
+ ```
+
+ Thanks @mojoBrendan, @manylegged and @spacemoose.
+ See also https://github.com/fmtlib/fmt/issues/360,
+ https://github.com/fmtlib/fmt/issues/335 and
+ https://github.com/fmtlib/fmt/issues/331.
+
+- Added `container.h` containing a `BasicContainerWriter` to write to
+ containers like `std::vector`
+ (https://github.com/fmtlib/fmt/pull/450). Thanks @polyvertex.
+
+- Added `fmt::join()` function that takes a range and formats its
+ elements separated by a given string
+ (https://github.com/fmtlib/fmt/pull/466):
+
+ ```c++
+ #include "fmt/format.h"
+
+ std::vector<double> v = {1.2, 3.4, 5.6};
+ // Prints "(+01.20, +03.40, +05.60)".
+ fmt::print("({:+06.2f})", fmt::join(v.begin(), v.end(), ", "));
+ ```
+
+ Thanks @olivier80.
+
+- Added support for custom formatting specifications to simplify
+ customization of built-in formatting
+ (https://github.com/fmtlib/fmt/pull/444). Thanks @polyvertex.
+ See also https://github.com/fmtlib/fmt/issues/439.
+
+- Added `fmt::format_system_error()` for error code formatting
+ (https://github.com/fmtlib/fmt/issues/323 and
+ https://github.com/fmtlib/fmt/pull/526). Thanks @maddinat0r.
+
+- Added thread-safe `fmt::localtime()` and `fmt::gmtime()` as
+ replacement for the standard version to `time.h`
+ (https://github.com/fmtlib/fmt/pull/396). Thanks @codicodi.
+
+- Internal improvements to `NamedArg` and `ArgLists`
+ (https://github.com/fmtlib/fmt/pull/389 and
+ https://github.com/fmtlib/fmt/pull/390). Thanks @chronoxor.
+
+- Fixed crash due to bug in `FormatBuf`
+ (https://github.com/fmtlib/fmt/pull/493). Thanks @effzeh. See also
+ https://github.com/fmtlib/fmt/issues/480 and
+ https://github.com/fmtlib/fmt/issues/491.
+
+- Fixed handling of wide strings in `fmt::StringWriter`.
+
+- Improved compiler error messages
+ (https://github.com/fmtlib/fmt/issues/357).
+
+- Fixed various warnings and issues with various compilers
+ (https://github.com/fmtlib/fmt/pull/494,
+ https://github.com/fmtlib/fmt/pull/499,
+ https://github.com/fmtlib/fmt/pull/483,
+ https://github.com/fmtlib/fmt/pull/485,
+ https://github.com/fmtlib/fmt/pull/482,
+ https://github.com/fmtlib/fmt/pull/475,
+ https://github.com/fmtlib/fmt/pull/473 and
+ https://github.com/fmtlib/fmt/pull/414).
+ Thanks @chronoxor, @zhaohuaxishi, @pkestene, @dschmidt and @0x414c.
+
+- Improved CMake: targets are now namespaced
+ (https://github.com/fmtlib/fmt/pull/511 and
+ https://github.com/fmtlib/fmt/pull/513), supported
+ header-only `printf.h`
+ (https://github.com/fmtlib/fmt/pull/354), fixed issue with
+ minimal supported library subset
+ (https://github.com/fmtlib/fmt/issues/418,
+ https://github.com/fmtlib/fmt/pull/419 and
+ https://github.com/fmtlib/fmt/pull/420).
+ Thanks @bjoernthiel, @niosHD, @LogicalKnight and @alabuzhev.
+
+- Improved documentation (https://github.com/fmtlib/fmt/pull/393).
+ Thanks @pwm1234.
+
+# 3.0.2 - 2017-06-14
+
+- Added `FMT_VERSION` macro
+ (https://github.com/fmtlib/fmt/issues/411).
+- Used `FMT_NULL` instead of literal `0`
+ (https://github.com/fmtlib/fmt/pull/409). Thanks @alabuzhev.
+- Added extern templates for `format_float`
+ (https://github.com/fmtlib/fmt/issues/413).
+- Fixed implicit conversion issue
+ (https://github.com/fmtlib/fmt/issues/507).
+- Fixed signbit detection
+ (https://github.com/fmtlib/fmt/issues/423).
+- Fixed naming collision
+ (https://github.com/fmtlib/fmt/issues/425).
+- Fixed missing intrinsic for C++/CLI
+ (https://github.com/fmtlib/fmt/pull/457). Thanks @calumr.
+- Fixed Android detection
+ (https://github.com/fmtlib/fmt/pull/458). Thanks @Gachapen.
+- Use lean `windows.h` if not in header-only mode
+ (https://github.com/fmtlib/fmt/pull/503). Thanks @Quentin01.
+- Fixed issue with CMake exporting C++11 flag
+ (https://github.com/fmtlib/fmt/pull/455). Thanks @EricWF.
+- Fixed issue with nvcc and MSVC compiler bug and MinGW
+ (https://github.com/fmtlib/fmt/issues/505).
+- Fixed DLL issues (https://github.com/fmtlib/fmt/pull/469 and
+ https://github.com/fmtlib/fmt/pull/502).
+ Thanks @richardeakin and @AndreasSchoenle.
+- Fixed test compilation under FreeBSD
+ (https://github.com/fmtlib/fmt/issues/433).
+- Fixed various warnings
+ (https://github.com/fmtlib/fmt/pull/403,
+ https://github.com/fmtlib/fmt/pull/410 and
+ https://github.com/fmtlib/fmt/pull/510).
+ Thanks @Lecetem, @chenhayat and @trozen.
+- Worked around a broken `__builtin_clz` in clang with MS codegen
+ (https://github.com/fmtlib/fmt/issues/519).
+- Removed redundant include
+ (https://github.com/fmtlib/fmt/issues/479).
+- Fixed documentation issues.
+
+# 3.0.1 - 2016-11-01
+
+- Fixed handling of thousands separator
+ (https://github.com/fmtlib/fmt/issues/353).
+- Fixed handling of `unsigned char` strings
+ (https://github.com/fmtlib/fmt/issues/373).
+- Corrected buffer growth when formatting time
+ (https://github.com/fmtlib/fmt/issues/367).
+- Removed warnings under MSVC and clang
+ (https://github.com/fmtlib/fmt/issues/318,
+ https://github.com/fmtlib/fmt/issues/250, also merged
+ https://github.com/fmtlib/fmt/pull/385 and
+ https://github.com/fmtlib/fmt/pull/361).
+ Thanks @jcelerier and @nmoehrle.
+- Fixed compilation issues under Android
+ (https://github.com/fmtlib/fmt/pull/327,
+ https://github.com/fmtlib/fmt/issues/345 and
+ https://github.com/fmtlib/fmt/pull/381), FreeBSD
+ (https://github.com/fmtlib/fmt/pull/358), Cygwin
+ (https://github.com/fmtlib/fmt/issues/388), MinGW
+ (https://github.com/fmtlib/fmt/issues/355) as well as other
+ issues (https://github.com/fmtlib/fmt/issues/350,
+ https://github.com/fmtlib/fmt/issues/355,
+ https://github.com/fmtlib/fmt/pull/348,
+ https://github.com/fmtlib/fmt/pull/402,
+ https://github.com/fmtlib/fmt/pull/405).
+ Thanks @dpantele, @hghwng, @arvedarved, @LogicalKnight and @JanHellwig.
+- Fixed some documentation issues and extended specification
+ (https://github.com/fmtlib/fmt/issues/320,
+ https://github.com/fmtlib/fmt/pull/333,
+ https://github.com/fmtlib/fmt/issues/347,
+ https://github.com/fmtlib/fmt/pull/362). Thanks @smellman.
+
+# 3.0.0 - 2016-05-07
+
+- The project has been renamed from C++ Format (cppformat) to fmt for
+ consistency with the used namespace and macro prefix
+ (https://github.com/fmtlib/fmt/issues/307). Library headers
+ are now located in the `fmt` directory:
+
+ ```c++
+ #include "fmt/format.h"
+ ```
+
+ Including `format.h` from the `cppformat` directory is deprecated
+ but works via a proxy header which will be removed in the next major
+ version.
+
+ The documentation is now available at <https://fmt.dev>.
+
+- Added support for
+ [strftime](http://en.cppreference.com/w/cpp/chrono/c/strftime)-like
+ [date and time
+ formatting](https://fmt.dev/3.0.0/api.html#date-and-time-formatting)
+ (https://github.com/fmtlib/fmt/issues/283):
+
+ ```c++
+ #include "fmt/time.h"
+
+ std::time_t t = std::time(nullptr);
+ // Prints "The date is 2016-04-29." (with the current date)
+ fmt::print("The date is {:%Y-%m-%d}.", *std::localtime(&t));
+ ```
+
+- `std::ostream` support including formatting of user-defined types
+ that provide overloaded `operator<<` has been moved to
+ `fmt/ostream.h`:
+
+ ```c++
+ #include "fmt/ostream.h"
+
+ class Date {
+ int year_, month_, day_;
+ public:
+ Date(int year, int month, int day) : year_(year), month_(month), day_(day) {}
+
+ friend std::ostream &operator<<(std::ostream &os, const Date &d) {
+ return os << d.year_ << '-' << d.month_ << '-' << d.day_;
+ }
+ };
+
+ std::string s = fmt::format("The date is {}", Date(2012, 12, 9));
+ // s == "The date is 2012-12-9"
+ ```
+
+- Added support for [custom argument
+ formatters](https://fmt.dev/3.0.0/api.html#argument-formatters)
+ (https://github.com/fmtlib/fmt/issues/235).
+
+- Added support for locale-specific integer formatting with the `n`
+ specifier (https://github.com/fmtlib/fmt/issues/305):
+
+ ```c++
+ std::setlocale(LC_ALL, "en_US.utf8");
+ fmt::print("cppformat: {:n}\n", 1234567); // prints 1,234,567
+ ```
+
+- Sign is now preserved when formatting an integer with an incorrect
+ `printf` format specifier
+ (https://github.com/fmtlib/fmt/issues/265):
+
+ ```c++
+ fmt::printf("%lld", -42); // prints -42
+ ```
+
+ Note that it would be an undefined behavior in `std::printf`.
+
+- Length modifiers such as `ll` are now optional in printf formatting
+ functions and the correct type is determined automatically
+ (https://github.com/fmtlib/fmt/issues/255):
+
+ ```c++
+ fmt::printf("%d", std::numeric_limits<long long>::max());
+ ```
+
+ Note that it would be an undefined behavior in `std::printf`.
+
+- Added initial support for custom formatters
+ (https://github.com/fmtlib/fmt/issues/231).
+
+- Fixed detection of user-defined literal support on Intel C++
+ compiler (https://github.com/fmtlib/fmt/issues/311,
+ https://github.com/fmtlib/fmt/pull/312).
+ Thanks @dean0x7d and @speth.
+
+- Reduced compile time
+ (https://github.com/fmtlib/fmt/pull/243,
+ https://github.com/fmtlib/fmt/pull/249,
+ https://github.com/fmtlib/fmt/issues/317):
+
+ ![](https://cloud.githubusercontent.com/assets/4831417/11614060/b9e826d2-9c36-11e5-8666-d4131bf503ef.png)
+
+ ![](https://cloud.githubusercontent.com/assets/4831417/11614080/6ac903cc-9c37-11e5-8165-26df6efae364.png)
+
+ Thanks @dean0x7d.
+
+- Compile test fixes (https://github.com/fmtlib/fmt/pull/313).
+ Thanks @dean0x7d.
+
+- Documentation fixes (https://github.com/fmtlib/fmt/pull/239,
+ https://github.com/fmtlib/fmt/issues/248,
+ https://github.com/fmtlib/fmt/issues/252,
+ https://github.com/fmtlib/fmt/pull/258,
+ https://github.com/fmtlib/fmt/issues/260,
+ https://github.com/fmtlib/fmt/issues/301,
+ https://github.com/fmtlib/fmt/pull/309).
+ Thanks @ReadmeCritic @Gachapen and @jwilk.
+
+- Fixed compiler and sanitizer warnings
+ (https://github.com/fmtlib/fmt/issues/244,
+ https://github.com/fmtlib/fmt/pull/256,
+ https://github.com/fmtlib/fmt/pull/259,
+ https://github.com/fmtlib/fmt/issues/263,
+ https://github.com/fmtlib/fmt/issues/274,
+ https://github.com/fmtlib/fmt/pull/277,
+ https://github.com/fmtlib/fmt/pull/286,
+ https://github.com/fmtlib/fmt/issues/291,
+ https://github.com/fmtlib/fmt/issues/296,
+ https://github.com/fmtlib/fmt/issues/308).
+ Thanks @mwinterb, @pweiskircher and @Naios.
+
+- Improved compatibility with Windows Store apps
+ (https://github.com/fmtlib/fmt/issues/280,
+ https://github.com/fmtlib/fmt/pull/285) Thanks @mwinterb.
+
+- Added tests of compatibility with older C++ standards
+ (https://github.com/fmtlib/fmt/pull/273). Thanks @niosHD.
+
+- Fixed Android build
+ (https://github.com/fmtlib/fmt/pull/271). Thanks @newnon.
+
+- Changed `ArgMap` to be backed by a vector instead of a map.
+ (https://github.com/fmtlib/fmt/issues/261,
+ https://github.com/fmtlib/fmt/pull/262). Thanks @mwinterb.
+
+- Added `fprintf` overload that writes to a `std::ostream`
+ (https://github.com/fmtlib/fmt/pull/251).
+ Thanks @nickhutchinson.
+
+- Export symbols when building a Windows DLL
+ (https://github.com/fmtlib/fmt/pull/245).
+ Thanks @macdems.
+
+- Fixed compilation on Cygwin
+ (https://github.com/fmtlib/fmt/issues/304).
+
+- Implemented a workaround for a bug in Apple LLVM version 4.2 of
+ clang (https://github.com/fmtlib/fmt/issues/276).
+
+- Implemented a workaround for Google Test bug
+ https://github.com/google/googletest/issues/705 on gcc 6
+ (https://github.com/fmtlib/fmt/issues/268). Thanks @octoploid.
+
+- Removed Biicode support because the latter has been discontinued.
+
+# 2.1.1 - 2016-04-11
+
+- The install location for generated CMake files is now configurable
+ via the `FMT_CMAKE_DIR` CMake variable
+ (https://github.com/fmtlib/fmt/pull/299). Thanks @niosHD.
+- Documentation fixes
+ (https://github.com/fmtlib/fmt/issues/252).
+
+# 2.1.0 - 2016-03-21
+
+- Project layout and build system improvements
+ (https://github.com/fmtlib/fmt/pull/267):
+
+ - The code have been moved to the `cppformat` directory. Including
+ `format.h` from the top-level directory is deprecated but works
+ via a proxy header which will be removed in the next major
+ version.
+ - C++ Format CMake targets now have proper interface definitions.
+ - Installed version of the library now supports the header-only
+ configuration.
+ - Targets `doc`, `install`, and `test` are now disabled if C++
+ Format is included as a CMake subproject. They can be enabled by
+ setting `FMT_DOC`, `FMT_INSTALL`, and `FMT_TEST` in the parent
+ project.
+
+ Thanks @niosHD.
+
+# 2.0.1 - 2016-03-13
+
+- Improved CMake find and package support
+ (https://github.com/fmtlib/fmt/issues/264). Thanks @niosHD.
+- Fix compile error with Android NDK and mingw32
+ (https://github.com/fmtlib/fmt/issues/241). Thanks @Gachapen.
+- Documentation fixes
+ (https://github.com/fmtlib/fmt/issues/248,
+ https://github.com/fmtlib/fmt/issues/260).
+
+# 2.0.0 - 2015-12-01
+
+## General
+
+- \[Breaking\] Named arguments
+ (https://github.com/fmtlib/fmt/pull/169,
+ https://github.com/fmtlib/fmt/pull/173,
+ https://github.com/fmtlib/fmt/pull/174):
+
+ ```c++
+ fmt::print("The answer is {answer}.", fmt::arg("answer", 42));
+ ```
+
+ Thanks @jamboree.
+
+- \[Experimental\] User-defined literals for format and named
+ arguments (https://github.com/fmtlib/fmt/pull/204,
+ https://github.com/fmtlib/fmt/pull/206,
+ https://github.com/fmtlib/fmt/pull/207):
+
+ ```c++
+ using namespace fmt::literals;
+ fmt::print("The answer is {answer}.", "answer"_a=42);
+ ```
+
+ Thanks @dean0x7d.
+
+- \[Breaking\] Formatting of more than 16 arguments is now supported
+ when using variadic templates
+ (https://github.com/fmtlib/fmt/issues/141). Thanks @Shauren.
+
+- Runtime width specification
+ (https://github.com/fmtlib/fmt/pull/168):
+
+ ```c++
+ fmt::format("{0:{1}}", 42, 5); // gives " 42"
+ ```
+
+ Thanks @jamboree.
+
+- \[Breaking\] Enums are now formatted with an overloaded
+ `std::ostream` insertion operator (`operator<<`) if available
+ (https://github.com/fmtlib/fmt/issues/232).
+
+- \[Breaking\] Changed default `bool` format to textual, \"true\" or
+ \"false\" (https://github.com/fmtlib/fmt/issues/170):
+
+ ```c++
+ fmt::print("{}", true); // prints "true"
+ ```
+
+ To print `bool` as a number use numeric format specifier such as
+ `d`:
+
+ ```c++
+ fmt::print("{:d}", true); // prints "1"
+ ```
+
+- `fmt::printf` and `fmt::sprintf` now support formatting of `bool`
+ with the `%s` specifier giving textual output, \"true\" or \"false\"
+ (https://github.com/fmtlib/fmt/pull/223):
+
+ ```c++
+ fmt::printf("%s", true); // prints "true"
+ ```
+
+ Thanks @LarsGullik.
+
+- \[Breaking\] `signed char` and `unsigned char` are now formatted as
+ integers by default
+ (https://github.com/fmtlib/fmt/pull/217).
+
+- \[Breaking\] Pointers to C strings can now be formatted with the `p`
+ specifier (https://github.com/fmtlib/fmt/pull/223):
+
+ ```c++
+ fmt::print("{:p}", "test"); // prints pointer value
+ ```
+
+ Thanks @LarsGullik.
+
+- \[Breaking\] `fmt::printf` and `fmt::sprintf` now print null
+ pointers as `(nil)` and null strings as `(null)` for consistency
+ with glibc (https://github.com/fmtlib/fmt/pull/226).
+ Thanks @LarsGullik.
+
+- \[Breaking\] `fmt::(s)printf` now supports formatting of objects of
+ user-defined types that provide an overloaded `std::ostream`
+ insertion operator (`operator<<`)
+ (https://github.com/fmtlib/fmt/issues/201):
+
+ ```c++
+ fmt::printf("The date is %s", Date(2012, 12, 9));
+ ```
+
+- \[Breaking\] The `Buffer` template is now part of the public API and
+ can be used to implement custom memory buffers
+ (https://github.com/fmtlib/fmt/issues/140). Thanks @polyvertex.
+
+- \[Breaking\] Improved compatibility between `BasicStringRef` and
+ [std::experimental::basic_string_view](
+ http://en.cppreference.com/w/cpp/experimental/basic_string_view)
+ (https://github.com/fmtlib/fmt/issues/100,
+ https://github.com/fmtlib/fmt/issues/159,
+ https://github.com/fmtlib/fmt/issues/183):
+
+ - Comparison operators now compare string content, not pointers
+ - `BasicStringRef::c_str` replaced by `BasicStringRef::data`
+ - `BasicStringRef` is no longer assumed to be null-terminated
+
+ References to null-terminated strings are now represented by a new
+ class, `BasicCStringRef`.
+
+- Dependency on pthreads introduced by Google Test is now optional
+ (https://github.com/fmtlib/fmt/issues/185).
+
+- New CMake options `FMT_DOC`, `FMT_INSTALL` and `FMT_TEST` to control
+ generation of `doc`, `install` and `test` targets respectively, on
+ by default (https://github.com/fmtlib/fmt/issues/197,
+ https://github.com/fmtlib/fmt/issues/198,
+ https://github.com/fmtlib/fmt/issues/200). Thanks @maddinat0r.
+
+- `noexcept` is now used when compiling with MSVC2015
+ (https://github.com/fmtlib/fmt/pull/215). Thanks @dmkrepo.
+
+- Added an option to disable use of `windows.h` when
+ `FMT_USE_WINDOWS_H` is defined as 0 before including `format.h`
+ (https://github.com/fmtlib/fmt/issues/171). Thanks @alfps.
+
+- \[Breaking\] `windows.h` is now included with `NOMINMAX` unless
+ `FMT_WIN_MINMAX` is defined. This is done to prevent breaking code
+ using `std::min` and `std::max` and only affects the header-only
+ configuration (https://github.com/fmtlib/fmt/issues/152,
+ https://github.com/fmtlib/fmt/pull/153,
+ https://github.com/fmtlib/fmt/pull/154). Thanks @DevO2012.
+
+- Improved support for custom character types
+ (https://github.com/fmtlib/fmt/issues/171). Thanks @alfps.
+
+- Added an option to disable use of IOStreams when `FMT_USE_IOSTREAMS`
+ is defined as 0 before including `format.h`
+ (https://github.com/fmtlib/fmt/issues/205,
+ https://github.com/fmtlib/fmt/pull/208). Thanks @JodiTheTigger.
+
+- Improved detection of `isnan`, `isinf` and `signbit`.
+
+## Optimization
+
+- Made formatting of user-defined types more efficient with a custom
+ stream buffer (https://github.com/fmtlib/fmt/issues/92,
+ https://github.com/fmtlib/fmt/pull/230). Thanks @NotImplemented.
+- Further improved performance of `fmt::Writer` on integer formatting
+ and fixed a minor regression. Now it is \~7% faster than
+ `karma::generate` on Karma\'s benchmark
+ (https://github.com/fmtlib/fmt/issues/186).
+- \[Breaking\] Reduced [compiled code
+ size](https://github.com/fmtlib/fmt#compile-time-and-code-bloat)
+ (https://github.com/fmtlib/fmt/issues/143,
+ https://github.com/fmtlib/fmt/pull/149).
+
+## Distribution
+
+- \[Breaking\] Headers are now installed in
+ `${CMAKE_INSTALL_PREFIX}/include/cppformat`
+ (https://github.com/fmtlib/fmt/issues/178). Thanks @jackyf.
+
+- \[Breaking\] Changed the library name from `format` to `cppformat`
+ for consistency with the project name and to avoid potential
+ conflicts (https://github.com/fmtlib/fmt/issues/178).
+ Thanks @jackyf.
+
+- C++ Format is now available in [Debian](https://www.debian.org/)
+ GNU/Linux
+ ([stretch](https://packages.debian.org/source/stretch/cppformat),
+ [sid](https://packages.debian.org/source/sid/cppformat)) and derived
+ distributions such as
+ [Ubuntu](https://launchpad.net/ubuntu/+source/cppformat) 15.10 and
+ later (https://github.com/fmtlib/fmt/issues/155):
+
+ $ sudo apt-get install libcppformat1-dev
+
+ Thanks @jackyf.
+
+- [Packages for Fedora and
+ RHEL](https://admin.fedoraproject.org/pkgdb/package/cppformat/) are
+ now available. Thanks Dave Johansen.
+
+- C++ Format can now be installed via [Homebrew](http://brew.sh/) on
+ OS X (https://github.com/fmtlib/fmt/issues/157):
+
+ $ brew install cppformat
+
+ Thanks @ortho and Anatoliy Bulukin.
+
+## Documentation
+
+- Migrated from ReadTheDocs to GitHub Pages for better responsiveness
+ and reliability (https://github.com/fmtlib/fmt/issues/128).
+ New documentation address is <http://cppformat.github.io/>.
+- Added [Building thedocumentation](
+ https://fmt.dev/2.0.0/usage.html#building-the-documentation)
+ section to the documentation.
+- Documentation build script is now compatible with Python 3 and newer
+ pip versions. (https://github.com/fmtlib/fmt/pull/189,
+ https://github.com/fmtlib/fmt/issues/209).
+ Thanks @JodiTheTigger and @xentec.
+- Documentation fixes and improvements
+ (https://github.com/fmtlib/fmt/issues/36,
+ https://github.com/fmtlib/fmt/issues/75,
+ https://github.com/fmtlib/fmt/issues/125,
+ https://github.com/fmtlib/fmt/pull/160,
+ https://github.com/fmtlib/fmt/pull/161,
+ https://github.com/fmtlib/fmt/issues/162,
+ https://github.com/fmtlib/fmt/issues/165,
+ https://github.com/fmtlib/fmt/issues/210).
+ Thanks @syohex.
+- Fixed out-of-tree documentation build
+ (https://github.com/fmtlib/fmt/issues/177). Thanks @jackyf.
+
+## Fixes
+
+- Fixed `initializer_list` detection
+ (https://github.com/fmtlib/fmt/issues/136). Thanks @Gachapen.
+
+- \[Breaking\] Fixed formatting of enums with numeric format
+ specifiers in `fmt::(s)printf`
+ (https://github.com/fmtlib/fmt/issues/131,
+ https://github.com/fmtlib/fmt/issues/139):
+
+ ```c++
+ enum { ANSWER = 42 };
+ fmt::printf("%d", ANSWER);
+ ```
+
+ Thanks @Naios.
+
+- Improved compatibility with old versions of MinGW
+ (https://github.com/fmtlib/fmt/issues/129,
+ https://github.com/fmtlib/fmt/pull/130,
+ https://github.com/fmtlib/fmt/issues/132). Thanks @cstamford.
+
+- Fixed a compile error on MSVC with disabled exceptions
+ (https://github.com/fmtlib/fmt/issues/144).
+
+- Added a workaround for broken implementation of variadic templates
+ in MSVC2012 (https://github.com/fmtlib/fmt/issues/148).
+
+- Placed the anonymous namespace within `fmt` namespace for the
+ header-only configuration (https://github.com/fmtlib/fmt/issues/171).
+ Thanks @alfps.
+
+- Fixed issues reported by Coverity Scan
+ (https://github.com/fmtlib/fmt/issues/187,
+ https://github.com/fmtlib/fmt/issues/192).
+
+- Implemented a workaround for a name lookup bug in MSVC2010
+ (https://github.com/fmtlib/fmt/issues/188).
+
+- Fixed compiler warnings
+ (https://github.com/fmtlib/fmt/issues/95,
+ https://github.com/fmtlib/fmt/issues/96,
+ https://github.com/fmtlib/fmt/pull/114,
+ https://github.com/fmtlib/fmt/issues/135,
+ https://github.com/fmtlib/fmt/issues/142,
+ https://github.com/fmtlib/fmt/issues/145,
+ https://github.com/fmtlib/fmt/issues/146,
+ https://github.com/fmtlib/fmt/issues/158,
+ https://github.com/fmtlib/fmt/issues/163,
+ https://github.com/fmtlib/fmt/issues/175,
+ https://github.com/fmtlib/fmt/issues/190,
+ https://github.com/fmtlib/fmt/pull/191,
+ https://github.com/fmtlib/fmt/issues/194,
+ https://github.com/fmtlib/fmt/pull/196,
+ https://github.com/fmtlib/fmt/issues/216,
+ https://github.com/fmtlib/fmt/pull/218,
+ https://github.com/fmtlib/fmt/pull/220,
+ https://github.com/fmtlib/fmt/pull/229,
+ https://github.com/fmtlib/fmt/issues/233,
+ https://github.com/fmtlib/fmt/issues/234,
+ https://github.com/fmtlib/fmt/pull/236,
+ https://github.com/fmtlib/fmt/issues/281,
+ https://github.com/fmtlib/fmt/issues/289).
+ Thanks @seanmiddleditch, @dixlorenz, @CarterLi, @Naios, @fmatthew5876,
+ @LevskiWeng, @rpopescu, @gabime, @cubicool, @jkflying, @LogicalKnight,
+ @inguin and @Jopie64.
+
+- Fixed portability issues (mostly causing test failures) on ARM,
+ ppc64, ppc64le, s390x and SunOS 5.11 i386
+ (https://github.com/fmtlib/fmt/issues/138,
+ https://github.com/fmtlib/fmt/issues/179,
+ https://github.com/fmtlib/fmt/issues/180,
+ https://github.com/fmtlib/fmt/issues/202,
+ https://github.com/fmtlib/fmt/issues/225, [Red Hat Bugzilla
+ Bug 1260297](https://bugzilla.redhat.com/show_bug.cgi?id=1260297)).
+ Thanks @Naios, @jackyf and Dave Johansen.
+
+- Fixed a name conflict with macro `free` defined in `crtdbg.h` when
+ `_CRTDBG_MAP_ALLOC` is set (https://github.com/fmtlib/fmt/issues/211).
+
+- Fixed shared library build on OS X
+ (https://github.com/fmtlib/fmt/pull/212). Thanks @dean0x7d.
+
+- Fixed an overload conflict on MSVC when `/Zc:wchar_t-` option is
+ specified (https://github.com/fmtlib/fmt/pull/214).
+ Thanks @slavanap.
+
+- Improved compatibility with MSVC 2008
+ (https://github.com/fmtlib/fmt/pull/236). Thanks @Jopie64.
+
+- Improved compatibility with bcc32
+ (https://github.com/fmtlib/fmt/issues/227).
+
+- Fixed `static_assert` detection on Clang
+ (https://github.com/fmtlib/fmt/pull/228). Thanks @dean0x7d.
+
+# 1.1.0 - 2015-03-06
+
+- Added `BasicArrayWriter`, a class template that provides operations
+ for formatting and writing data into a fixed-size array
+ (https://github.com/fmtlib/fmt/issues/105 and
+ https://github.com/fmtlib/fmt/issues/122):
+
+ ```c++
+ char buffer[100];
+ fmt::ArrayWriter w(buffer);
+ w.write("The answer is {}", 42);
+ ```
+
+- Added [0 A.D.](http://play0ad.com/) and [PenUltima Online
+ (POL)](http://www.polserver.com/) to the list of notable projects
+ using C++ Format.
+
+- C++ Format now uses MSVC intrinsics for better formatting performance
+ (https://github.com/fmtlib/fmt/pull/115,
+ https://github.com/fmtlib/fmt/pull/116,
+ https://github.com/fmtlib/fmt/pull/118 and
+ https://github.com/fmtlib/fmt/pull/121). Previously these
+ optimizations where only used on GCC and Clang.
+ Thanks @CarterLi and @objectx.
+
+- CMake install target
+ (https://github.com/fmtlib/fmt/pull/119). Thanks @TrentHouliston.
+
+ You can now install C++ Format with `make install` command.
+
+- Improved [Biicode](http://www.biicode.com/) support
+ (https://github.com/fmtlib/fmt/pull/98 and
+ https://github.com/fmtlib/fmt/pull/104).
+ Thanks @MariadeAnton and @franramirez688.
+
+- Improved support for building with [Android NDK](
+ https://developer.android.com/tools/sdk/ndk/index.html)
+ (https://github.com/fmtlib/fmt/pull/107). Thanks @newnon.
+
+ The [android-ndk-example](https://github.com/fmtlib/android-ndk-example)
+ repository provides and example of using C++ Format with Android NDK:
+
+ ![](https://raw.githubusercontent.com/fmtlib/android-ndk-example/master/screenshot.png)
+
+- Improved documentation of `SystemError` and `WindowsError`
+ (https://github.com/fmtlib/fmt/issues/54).
+
+- Various code improvements
+ (https://github.com/fmtlib/fmt/pull/110,
+ https://github.com/fmtlib/fmt/pull/111
+ https://github.com/fmtlib/fmt/pull/112). Thanks @CarterLi.
+
+- Improved compile-time errors when formatting wide into narrow
+ strings (https://github.com/fmtlib/fmt/issues/117).
+
+- Fixed `BasicWriter::write` without formatting arguments when C++11
+ support is disabled
+ (https://github.com/fmtlib/fmt/issues/109).
+
+- Fixed header-only build on OS X with GCC 4.9
+ (https://github.com/fmtlib/fmt/issues/124).
+
+- Fixed packaging issues (https://github.com/fmtlib/fmt/issues/94).
+
+- Added [changelog](https://github.com/fmtlib/fmt/blob/master/ChangeLog.md)
+ (https://github.com/fmtlib/fmt/issues/103).
+
+# 1.0.0 - 2015-02-05
+
+- Add support for a header-only configuration when `FMT_HEADER_ONLY`
+ is defined before including `format.h`:
+
+ ```c++
+ #define FMT_HEADER_ONLY
+ #include "format.h"
+ ```
+
+- Compute string length in the constructor of `BasicStringRef` instead
+ of the `size` method
+ (https://github.com/fmtlib/fmt/issues/79). This eliminates
+ size computation for string literals on reasonable optimizing
+ compilers.
+
+- Fix formatting of types with overloaded `operator <<` for
+ `std::wostream` (https://github.com/fmtlib/fmt/issues/86):
+
+ ```c++
+ fmt::format(L"The date is {0}", Date(2012, 12, 9));
+ ```
+
+- Fix linkage of tests on Arch Linux
+ (https://github.com/fmtlib/fmt/issues/89).
+
+- Allow precision specifier for non-float arguments
+ (https://github.com/fmtlib/fmt/issues/90):
+
+ ```c++
+ fmt::print("{:.3}\n", "Carpet"); // prints "Car"
+ ```
+
+- Fix build on Android NDK (https://github.com/fmtlib/fmt/issues/93).
+
+- Improvements to documentation build procedure.
+
+- Remove `FMT_SHARED` CMake variable in favor of standard [BUILD_SHARED_LIBS](
+ http://www.cmake.org/cmake/help/v3.0/variable/BUILD_SHARED_LIBS.html).
+
+- Fix error handling in `fmt::fprintf`.
+
+- Fix a number of warnings.
+
+# 0.12.0 - 2014-10-25
+
+- \[Breaking\] Improved separation between formatting and buffer
+ management. `Writer` is now a base class that cannot be instantiated
+ directly. The new `MemoryWriter` class implements the default buffer
+ management with small allocations done on stack. So `fmt::Writer`
+ should be replaced with `fmt::MemoryWriter` in variable
+ declarations.
+
+ Old code:
+
+ ```c++
+ fmt::Writer w;
+ ```
+
+ New code:
+
+ ```c++
+ fmt::MemoryWriter w;
+ ```
+
+ If you pass `fmt::Writer` by reference, you can continue to do so:
+
+ ```c++
+ void f(fmt::Writer &w);
+ ```
+
+ This doesn\'t affect the formatting API.
+
+- Support for custom memory allocators
+ (https://github.com/fmtlib/fmt/issues/69)
+
+- Formatting functions now accept [signed char]{.title-ref} and
+ [unsigned char]{.title-ref} strings as arguments
+ (https://github.com/fmtlib/fmt/issues/73):
+
+ ```c++
+ auto s = format("GLSL version: {}", glGetString(GL_VERSION));
+ ```
+
+- Reduced code bloat. According to the new [benchmark
+ results](https://github.com/fmtlib/fmt#compile-time-and-code-bloat),
+ cppformat is close to `printf` and by the order of magnitude better
+ than Boost Format in terms of compiled code size.
+
+- Improved appearance of the documentation on mobile by using the
+ [Sphinx Bootstrap
+ theme](http://ryan-roemer.github.io/sphinx-bootstrap-theme/):
+
+ | Old | New |
+ | --- | --- |
+ | ![](https://cloud.githubusercontent.com/assets/576385/4792130/cd256436-5de3-11e4-9a62-c077d0c2b003.png) | ![](https://cloud.githubusercontent.com/assets/576385/4792131/cd29896c-5de3-11e4-8f59-cac952942bf0.png) |
+
+# 0.11.0 - 2014-08-21
+
+- Safe printf implementation with a POSIX extension for positional
+ arguments:
+
+ ```c++
+ fmt::printf("Elapsed time: %.2f seconds", 1.23);
+ fmt::printf("%1$s, %3$d %2$s", weekday, month, day);
+ ```
+
+- Arguments of `char` type can now be formatted as integers (Issue
+ https://github.com/fmtlib/fmt/issues/55):
+
+ ```c++
+ fmt::format("0x{0:02X}", 'a');
+ ```
+
+- Deprecated parts of the API removed.
+
+- The library is now built and tested on MinGW with Appveyor in
+ addition to existing test platforms Linux/GCC, OS X/Clang,
+ Windows/MSVC.
+
+# 0.10.0 - 2014-07-01
+
+**Improved API**
+
+- All formatting methods are now implemented as variadic functions
+ instead of using `operator<<` for feeding arbitrary arguments into a
+ temporary formatter object. This works both with C++11 where
+ variadic templates are used and with older standards where variadic
+ functions are emulated by providing lightweight wrapper functions
+ defined with the `FMT_VARIADIC` macro. You can use this macro for
+ defining your own portable variadic functions:
+
+ ```c++
+ void report_error(const char *format, const fmt::ArgList &args) {
+ fmt::print("Error: {}");
+ fmt::print(format, args);
+ }
+ FMT_VARIADIC(void, report_error, const char *)
+
+ report_error("file not found: {}", path);
+ ```
+
+ Apart from a more natural syntax, this also improves performance as
+ there is no need to construct temporary formatter objects and
+ control arguments\' lifetimes. Because the wrapper functions are
+ very lightweight, this doesn\'t cause code bloat even in pre-C++11
+ mode.
+
+- Simplified common case of formatting an `std::string`. Now it
+ requires a single function call:
+
+ ```c++
+ std::string s = format("The answer is {}.", 42);
+ ```
+
+ Previously it required 2 function calls:
+
+ ```c++
+ std::string s = str(Format("The answer is {}.") << 42);
+ ```
+
+ Instead of unsafe `c_str` function, `fmt::Writer` should be used
+ directly to bypass creation of `std::string`:
+
+ ```c++
+ fmt::Writer w;
+ w.write("The answer is {}.", 42);
+ w.c_str(); // returns a C string
+ ```
+
+ This doesn\'t do dynamic memory allocation for small strings and is
+ less error prone as the lifetime of the string is the same as for
+ `std::string::c_str` which is well understood (hopefully).
+
+- Improved consistency in naming functions that are a part of the
+ public API. Now all public functions are lowercase following the
+ standard library conventions. Previously it was a combination of
+ lowercase and CapitalizedWords. Issue
+ https://github.com/fmtlib/fmt/issues/50.
+
+- Old functions are marked as deprecated and will be removed in the
+ next release.
+
+**Other Changes**
+
+- Experimental support for printf format specifications (work in
+ progress):
+
+ ```c++
+ fmt::printf("The answer is %d.", 42);
+ std::string s = fmt::sprintf("Look, a %s!", "string");
+ ```
+
+- Support for hexadecimal floating point format specifiers `a` and
+ `A`:
+
+ ```c++
+ print("{:a}", -42.0); // Prints -0x1.5p+5
+ print("{:A}", -42.0); // Prints -0X1.5P+5
+ ```
+
+- CMake option `FMT_SHARED` that specifies whether to build format as
+ a shared library (off by default).
+
+# 0.9.0 - 2014-05-13
+
+- More efficient implementation of variadic formatting functions.
+
+- `Writer::Format` now has a variadic overload:
+
+ ```c++
+ Writer out;
+ out.Format("Look, I'm {}!", "variadic");
+ ```
+
+- For efficiency and consistency with other overloads, variadic
+ overload of the `Format` function now returns `Writer` instead of
+ `std::string`. Use the `str` function to convert it to
+ `std::string`:
+
+ ```c++
+ std::string s = str(Format("Look, I'm {}!", "variadic"));
+ ```
+
+- Replaced formatter actions with output sinks: `NoAction` -\>
+ `NullSink`, `Write` -\> `FileSink`, `ColorWriter` -\>
+ `ANSITerminalSink`. This improves naming consistency and shouldn\'t
+ affect client code unless these classes are used directly which
+ should be rarely needed.
+
+- Added `ThrowSystemError` function that formats a message and throws
+ `SystemError` containing the formatted message and system-specific
+ error description. For example, the following code
+
+ ```c++
+ FILE *f = fopen(filename, "r");
+ if (!f)
+ ThrowSystemError(errno, "Failed to open file '{}'") << filename;
+ ```
+
+ will throw `SystemError` exception with description \"Failed to open
+ file \'\<filename\>\': No such file or directory\" if file doesn\'t
+ exist.
+
+- Support for AppVeyor continuous integration platform.
+
+- `Format` now throws `SystemError` in case of I/O errors.
+
+- Improve test infrastructure. Print functions are now tested by
+ redirecting the output to a pipe.
+
+# 0.8.0 - 2014-04-14
+
+- Initial release
diff --git a/thirdparty/fmt/doc/api.md b/thirdparty/fmt/doc/api.md
new file mode 100644
index 000000000..2c584abc0
--- /dev/null
+++ b/thirdparty/fmt/doc/api.md
@@ -0,0 +1,710 @@
+# API Reference
+
+The {fmt} library API consists of the following components:
+
+- [`fmt/base.h`](#base-api): the base API providing main formatting functions
+ for `char`/UTF-8 with C++20 compile-time checks and minimal dependencies
+- [`fmt/format.h`](#format-api): `fmt::format` and other formatting functions
+ as well as locale support
+- [`fmt/ranges.h`](#ranges-api): formatting of ranges and tuples
+- [`fmt/chrono.h`](#chrono-api): date and time formatting
+- [`fmt/std.h`](#std-api): formatters for standard library types
+- [`fmt/compile.h`](#compile-api): format string compilation
+- [`fmt/color.h`](#color-api): terminal colors and text styles
+- [`fmt/os.h`](#os-api): system APIs
+- [`fmt/ostream.h`](#ostream-api): `std::ostream` support
+- [`fmt/args.h`](#args-api): dynamic argument lists
+- [`fmt/printf.h`](#printf-api): safe `printf`
+- [`fmt/xchar.h`](#xchar-api): optional `wchar_t` support
+
+All functions and types provided by the library reside in namespace `fmt`
+and macros have prefix `FMT_`.
+
+## Base API
+
+`fmt/base.h` defines the base API which provides main formatting functions
+for `char`/UTF-8 with C++20 compile-time checks. It has minimal include
+dependencies for better compile times. This header is only beneficial when
+using {fmt} as a library (the default) and not in the header-only mode.
+It also provides `formatter` specializations for the following types:
+
+- `int`, `long long`,
+- `unsigned`, `unsigned long long`
+- `float`, `double`, `long double`
+- `bool`
+- `char`
+- `const char*`, [`fmt::string_view`](#basic_string_view)
+- `const void*`
+
+The following functions use [format string syntax](syntax.md) similar to that
+of [str.format](https://docs.python.org/3/library/stdtypes.html#str.format)
+in Python. They take *fmt* and *args* as arguments.
+
+*fmt* is a format string that contains literal text and replacement fields
+surrounded by braces `{}`. The fields are replaced with formatted arguments
+in the resulting string. [`fmt::format_string`](#format_string) is a format
+string which can be implicitly constructed from a string literal or a
+`constexpr` string and is checked at compile time in C++20. To pass a runtime
+format string wrap it in [`fmt::runtime`](#runtime).
+
+*args* is an argument list representing objects to be formatted.
+
+I/O errors are reported as [`std::system_error`](
+https://en.cppreference.com/w/cpp/error/system_error) exceptions unless
+specified otherwise.
+
+::: print(format_string<T...>, T&&...)
+
+::: print(FILE*, format_string<T...>, T&&...)
+
+::: println(format_string<T...>, T&&...)
+
+::: println(FILE*, format_string<T...>, T&&...)
+
+::: format_to(OutputIt&&, format_string<T...>, T&&...)
+
+::: format_to_n(OutputIt, size_t, format_string<T...>, T&&...)
+
+::: format_to_n_result
+
+::: formatted_size(format_string<T...>, T&&...)
+
+<a id="udt"></a>
+### Formatting User-Defined Types
+
+The {fmt} library provides formatters for many standard C++ types.
+See [`fmt/ranges.h`](#ranges-api) for ranges and tuples including standard
+containers such as `std::vector`, [`fmt/chrono.h`](#chrono-api) for date and
+time formatting and [`fmt/std.h`](#std-api) for other standard library types.
+
+There are two ways to make a user-defined type formattable: providing a
+`format_as` function or specializing the `formatter` struct template.
+Formatting of non-void pointer types is intentionally disallowed and they
+cannot be made formattable via either extension API.
+
+Use `format_as` if you want to make your type formattable as some other
+type with the same format specifiers. The `format_as` function should
+take an object of your type and return an object of a formattable type.
+It should be defined in the same namespace as your type.
+
+Example ([run](https://godbolt.org/z/nvME4arz8)):
+
+ #include <fmt/format.h>
+
+ namespace kevin_namespacy {
+
+ enum class film {
+ house_of_cards, american_beauty, se7en = 7
+ };
+
+ auto format_as(film f) { return fmt::underlying(f); }
+
+ }
+
+ int main() {
+ fmt::print("{}\n", kevin_namespacy::film::se7en); // Output: 7
+ }
+
+Using specialization is more complex but gives you full control over
+parsing and formatting. To use this method specialize the `formatter`
+struct template for your type and implement `parse` and `format`
+methods.
+
+The recommended way of defining a formatter is by reusing an existing
+one via inheritance or composition. This way you can support standard
+format specifiers without implementing them yourself. For example:
+
+```c++
+// color.h:
+#include <fmt/base.h>
+
+enum class color {red, green, blue};
+
+template <> struct fmt::formatter<color>: formatter<string_view> {
+ // parse is inherited from formatter<string_view>.
+
+ auto format(color c, format_context& ctx) const
+ -> format_context::iterator;
+};
+```
+
+```c++
+// color.cc:
+#include "color.h"
+#include <fmt/format.h>
+
+auto fmt::formatter<color>::format(color c, format_context& ctx) const
+ -> format_context::iterator {
+ string_view name = "unknown";
+ switch (c) {
+ case color::red: name = "red"; break;
+ case color::green: name = "green"; break;
+ case color::blue: name = "blue"; break;
+ }
+ return formatter<string_view>::format(name, ctx);
+}
+```
+
+Note that `formatter<string_view>::format` is defined in `fmt/format.h`
+so it has to be included in the source file. Since `parse` is inherited
+from `formatter<string_view>` it will recognize all string format
+specifications, for example
+
+```c++
+fmt::format("{:>10}", color::blue)
+```
+
+will return `" blue"`.
+
+<!-- The experimental `nested_formatter` provides an easy way of applying a
+formatter to one or more subobjects.
+
+For example:
+
+ #include <fmt/format.h>
+
+ struct point {
+ double x, y;
+ };
+
+ template <>
+ struct fmt::formatter<point> : nested_formatter<double> {
+ auto format(point p, format_context& ctx) const {
+ return write_padded(ctx, [=](auto out) {
+ return format_to(out, "({}, {})", this->nested(p.x),
+ this->nested(p.y));
+ });
+ }
+ };
+
+ int main() {
+ fmt::print("[{:>20.2f}]", point{1, 2});
+ }
+
+prints:
+
+ [ (1.00, 2.00)]
+
+Notice that fill, align and width are applied to the whole object which
+is the recommended behavior while the remaining specifiers apply to
+elements. -->
+
+In general the formatter has the following form:
+
+ template <> struct fmt::formatter<T> {
+ // Parses format specifiers and stores them in the formatter.
+ //
+ // [ctx.begin(), ctx.end()) is a, possibly empty, character range that
+ // contains a part of the format string starting from the format
+ // specifications to be parsed, e.g. in
+ //
+ // fmt::format("{:f} continued", ...);
+ //
+ // the range will contain "f} continued". The formatter should parse
+ // specifiers until '}' or the end of the range. In this example the
+ // formatter should parse the 'f' specifier and return an iterator
+ // pointing to '}'.
+ constexpr auto parse(format_parse_context& ctx)
+ -> format_parse_context::iterator;
+
+ // Formats value using the parsed format specification stored in this
+ // formatter and writes the output to ctx.out().
+ auto format(const T& value, format_context& ctx) const
+ -> format_context::iterator;
+ };
+
+It is recommended to at least support fill, align and width that apply
+to the whole object and have the same semantics as in standard
+formatters.
+
+You can also write a formatter for a hierarchy of classes:
+
+```c++
+// demo.h:
+#include <type_traits>
+#include <fmt/format.h>
+
+struct A {
+ virtual ~A() {}
+ virtual std::string name() const { return "A"; }
+};
+
+struct B : A {
+ virtual std::string name() const { return "B"; }
+};
+
+template <typename T>
+struct fmt::formatter<T, std::enable_if_t<std::is_base_of_v<A, T>, char>> :
+ fmt::formatter<std::string> {
+ auto format(const A& a, format_context& ctx) const {
+ return formatter<std::string>::format(a.name(), ctx);
+ }
+};
+```
+
+```c++
+// demo.cc:
+#include "demo.h"
+#include <fmt/format.h>
+
+int main() {
+ B b;
+ A& a = b;
+ fmt::print("{}", a); // Output: B
+}
+```
+
+Providing both a `formatter` specialization and a `format_as` overload is
+disallowed.
+
+::: basic_format_parse_context
+
+::: context
+
+::: format_context
+
+### Compile-Time Checks
+
+Compile-time format string checks are enabled by default on compilers
+that support C++20 `consteval`. On older compilers you can use the
+[FMT_STRING](#legacy-checks) macro defined in `fmt/format.h` instead.
+
+Unused arguments are allowed as in Python's `str.format` and ordinary functions.
+
+See [Type Erasure](#type-erasure) for an example of how to enable compile-time
+checks in your own functions with `fmt::format_string` while avoiding template
+bloat.
+
+::: fstring
+
+::: format_string
+
+::: runtime(string_view)
+
+### Type Erasure
+
+You can create your own formatting function with compile-time checks and
+small binary footprint, for example ([run](https://godbolt.org/z/b9Pbasvzc)):
+
+```c++
+#include <fmt/format.h>
+
+void vlog(const char* file, int line,
+ fmt::string_view fmt, fmt::format_args args) {
+ fmt::print("{}: {}: {}", file, line, fmt::vformat(fmt, args));
+}
+
+template <typename... T>
+void log(const char* file, int line,
+ fmt::format_string<T...> fmt, T&&... args) {
+ vlog(file, line, fmt, fmt::make_format_args(args...));
+}
+
+#define MY_LOG(fmt, ...) log(__FILE__, __LINE__, fmt, __VA_ARGS__)
+
+MY_LOG("invalid squishiness: {}", 42);
+```
+
+Note that `vlog` is not parameterized on argument types which improves
+compile times and reduces binary code size compared to a fully
+parameterized version.
+
+::: make_format_args(T&...)
+
+::: basic_format_args
+
+::: format_args
+
+::: basic_format_arg
+
+### Named Arguments
+
+::: arg(const Char*, const T&)
+
+Named arguments are not supported in compile-time checks at the moment.
+
+### Compatibility
+
+::: basic_string_view
+
+::: string_view
+
+## Format API
+
+`fmt/format.h` defines the full format API providing additional
+formatting functions and locale support.
+
+<a id="format"></a>
+::: format(format_string<T...>, T&&...)
+
+::: vformat(string_view, format_args)
+
+::: operator""_a()
+
+### Utilities
+
+::: ptr(T)
+
+::: underlying(Enum)
+
+::: to_string(const T&)
+
+::: group_digits(T)
+
+::: detail::buffer
+
+::: basic_memory_buffer
+
+### System Errors
+
+{fmt} does not use `errno` to communicate errors to the user, but it may
+call system functions which set `errno`. Users should not make any
+assumptions about the value of `errno` being preserved by library
+functions.
+
+::: system_error
+
+::: format_system_error
+
+### Custom Allocators
+
+The {fmt} library supports custom dynamic memory allocators. A custom
+allocator class can be specified as a template argument to
+[`fmt::basic_memory_buffer`](#basic_memory_buffer):
+
+ using custom_memory_buffer =
+ fmt::basic_memory_buffer<char, fmt::inline_buffer_size, custom_allocator>;
+
+It is also possible to write a formatting function that uses a custom
+allocator:
+
+ using custom_string =
+ std::basic_string<char, std::char_traits<char>, custom_allocator>;
+
+ auto vformat(custom_allocator alloc, fmt::string_view fmt,
+ fmt::format_args args) -> custom_string {
+ auto buf = custom_memory_buffer(alloc);
+ fmt::vformat_to(std::back_inserter(buf), fmt, args);
+ return custom_string(buf.data(), buf.size(), alloc);
+ }
+
+ template <typename ...Args>
+ auto format(custom_allocator alloc, fmt::string_view fmt,
+ const Args& ... args) -> custom_string {
+ return vformat(alloc, fmt, fmt::make_format_args(args...));
+ }
+
+The allocator will be used for the output container only. Formatting
+functions normally don't do any allocations for built-in and string
+types except for non-default floating-point formatting that occasionally
+falls back on `sprintf`.
+
+### Locale
+
+All formatting is locale-independent by default. Use the `'L'` format
+specifier to insert the appropriate number separator characters from the
+locale:
+
+ #include <fmt/format.h>
+ #include <locale>
+
+ std::locale::global(std::locale("en_US.UTF-8"));
+ auto s = fmt::format("{:L}", 1000000); // s == "1,000,000"
+
+`fmt/format.h` provides the following overloads of formatting functions
+that take `std::locale` as a parameter. The locale type is a template
+parameter to avoid the expensive `<locale>` include.
+
+::: format(locale_ref, format_string<T...>, T&&...)
+
+::: format_to(OutputIt, locale_ref, format_string<T...>, T&&...)
+
+::: formatted_size(locale_ref, format_string<T...>, T&&...)
+
+<a id="legacy-checks"></a>
+### Legacy Compile-Time Checks
+
+`FMT_STRING` enables compile-time checks on older compilers. It requires
+C++14 or later and is a no-op in C++11.
+
+::: FMT_STRING
+
+To force the use of legacy compile-time checks, define the preprocessor
+variable `FMT_ENFORCE_COMPILE_STRING`. When set, functions accepting
+`FMT_STRING` will fail to compile with regular strings.
+
+<a id="ranges-api"></a>
+## Range and Tuple Formatting
+
+`fmt/ranges.h` provides formatting support for ranges and tuples:
+
+ #include <fmt/ranges.h>
+
+ fmt::print("{}", std::tuple<char, int>{'a', 42});
+ // Output: ('a', 42)
+
+Using `fmt::join`, you can separate tuple elements with a custom separator:
+
+ #include <fmt/ranges.h>
+
+ auto t = std::tuple<int, char>{1, 'a'};
+ fmt::print("{}", fmt::join(t, ", "));
+ // Output: 1, a
+
+::: join(Range&&, string_view)
+
+::: join(It, Sentinel, string_view)
+
+::: join(std::initializer_list<T>, string_view)
+
+<a id="chrono-api"></a>
+## Date and Time Formatting
+
+`fmt/chrono.h` provides formatters for
+
+- [`std::chrono::duration`](https://en.cppreference.com/w/cpp/chrono/duration)
+- [`std::chrono::time_point`](
+ https://en.cppreference.com/w/cpp/chrono/time_point)
+- [`std::tm`](https://en.cppreference.com/w/cpp/chrono/c/tm)
+
+The format syntax is described in [Chrono Format Specifications](syntax.md#
+chrono-format-specifications).
+
+**Example**:
+
+ #include <fmt/chrono.h>
+
+ int main() {
+ auto now = std::chrono::system_clock::now();
+
+ fmt::print("The date is {:%Y-%m-%d}.\n", now);
+ // Output: The date is 2020-11-07.
+ // (with 2020-11-07 replaced by the current date)
+
+ using namespace std::literals::chrono_literals;
+
+ fmt::print("Default format: {} {}\n", 42s, 100ms);
+ // Output: Default format: 42s 100ms
+
+ fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s);
+ // Output: strftime-like format: 03:15:30
+ }
+
+::: gmtime(std::time_t)
+
+<a id="std-api"></a>
+## Standard Library Types Formatting
+
+`fmt/std.h` provides formatters for:
+
+- [`std::atomic`](https://en.cppreference.com/w/cpp/atomic/atomic)
+- [`std::atomic_flag`](https://en.cppreference.com/w/cpp/atomic/atomic_flag)
+- [`std::bitset`](https://en.cppreference.com/w/cpp/utility/bitset)
+- [`std::error_code`](https://en.cppreference.com/w/cpp/error/error_code)
+- [`std::exception`](https://en.cppreference.com/w/cpp/error/exception)
+- [`std::filesystem::path`](https://en.cppreference.com/w/cpp/filesystem/path)
+- [`std::monostate`](
+ https://en.cppreference.com/w/cpp/utility/variant/monostate)
+- [`std::optional`](https://en.cppreference.com/w/cpp/utility/optional)
+- [`std::source_location`](
+ https://en.cppreference.com/w/cpp/utility/source_location)
+- [`std::thread::id`](https://en.cppreference.com/w/cpp/thread/thread/id)
+- [`std::variant`](https://en.cppreference.com/w/cpp/utility/variant/variant)
+
+::: ptr(const std::unique_ptr<T, Deleter>&)
+
+::: ptr(const std::shared_ptr<T>&)
+
+### Variants
+
+A `std::variant` is only formattable if every variant alternative is
+formattable, and requires the `__cpp_lib_variant` [library
+feature](https://en.cppreference.com/w/cpp/feature_test).
+
+**Example**:
+
+ #include <fmt/std.h>
+
+ fmt::print("{}", std::variant<char, float>('x'));
+ // Output: variant('x')
+
+ fmt::print("{}", std::variant<std::monostate, char>());
+ // Output: variant(monostate)
+
+## Bit-Fields and Packed Structs
+
+To format a bit-field or a field of a struct with `__attribute__((packed))`
+applied to it, you need to convert it to the underlying or compatible type via
+a cast or a unary `+` ([godbolt](https://www.godbolt.org/z/3qKKs6T5Y)):
+
+```c++
+struct smol {
+ int bit : 1;
+};
+
+auto s = smol();
+fmt::print("{}", +s.bit);
+```
+
+This is a known limitation of "perfect" forwarding in C++.
+
+<a id="compile-api"></a>
+## Compile-Time Support
+
+`fmt/compile.h` provides format string compilation and compile-time
+(`constexpr`) formatting enabled via the `FMT_COMPILE` macro or the `_cf`
+user-defined literal defined in namespace `fmt::literals`. Format strings
+marked with `FMT_COMPILE` or `_cf` are parsed, checked and converted into
+efficient formatting code at compile-time. This supports arguments of built-in
+and string types as well as user-defined types with `format` methods taking
+the format context type as a template parameter in their `formatter`
+specializations. For example ([run](https://www.godbolt.org/z/3c13erEoq)):
+
+ struct point {
+ double x;
+ double y;
+ };
+
+ template <> struct fmt::formatter<point> {
+ constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); }
+
+ template <typename FormatContext>
+ auto format(const point& p, FormatContext& ctx) const {
+ return format_to(ctx.out(), "({}, {})"_cf, p.x, p.y);
+ }
+ };
+
+ using namespace fmt::literals;
+ std::string s = fmt::format("{}"_cf, point(4, 2));
+
+Format string compilation can generate more binary code compared to the
+default API and is only recommended in places where formatting is a
+performance bottleneck.
+
+The same APIs support formatting at compile time e.g. in `constexpr`
+and `consteval` functions. Additionally there is an experimental
+`FMT_STATIC_FORMAT` that allows formatting into a string of the exact
+required size at compile time. Compile-time formatting works with built-in
+and user-defined formatters that have `constexpr` `format` methods.
+Example:
+
+ template <> struct fmt::formatter<point> {
+ constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); }
+
+ template <typename FormatContext>
+ constexpr auto format(const point& p, FormatContext& ctx) const {
+ return format_to(ctx.out(), "({}, {})"_cf, p.x, p.y);
+ }
+ };
+
+ constexpr auto s = FMT_STATIC_FORMAT("{}", point(4, 2));
+ const char* cstr = s.c_str(); // Points the static string "(4, 2)".
+
+::: operator""_cf
+
+::: FMT_COMPILE
+
+::: FMT_STATIC_FORMAT
+
+<a id="color-api"></a>
+## Terminal Colors and Text Styles
+
+`fmt/color.h` provides support for terminal color and text style output.
+
+::: print(text_style, format_string<T...>, T&&...)
+
+::: fg(detail::color_type)
+
+::: bg(detail::color_type)
+
+::: styled(const T&, text_style)
+
+<a id="os-api"></a>
+## System APIs
+
+::: ostream
+
+::: windows_error
+
+<a id="ostream-api"></a>
+## `std::ostream` Support
+
+`fmt/ostream.h` provides `std::ostream` support including formatting of
+user-defined types that have an overloaded insertion operator
+(`operator<<`). In order to make a type formattable via `std::ostream`
+you should provide a `formatter` specialization inherited from
+`ostream_formatter`:
+
+ #include <fmt/ostream.h>
+
+ struct date {
+ int year, month, day;
+
+ friend std::ostream& operator<<(std::ostream& os, const date& d) {
+ return os << d.year << '-' << d.month << '-' << d.day;
+ }
+ };
+
+ template <> struct fmt::formatter<date> : ostream_formatter {};
+
+ std::string s = fmt::format("The date is {}", date{2012, 12, 9});
+ // s == "The date is 2012-12-9"
+
+::: streamed(const T&)
+
+::: print(std::ostream&, format_string<T...>, T&&...)
+
+<a id="args-api"></a>
+## Dynamic Argument Lists
+
+The header `fmt/args.h` provides `dynamic_format_arg_store`, a builder-like API
+that can be used to construct format argument lists dynamically.
+
+::: dynamic_format_arg_store
+
+<a id="printf-api"></a>
+## Safe `printf`
+
+The header `fmt/printf.h` provides `printf`-like formatting
+functionality. The following functions use [printf format string
+syntax](https://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html)
+with the POSIX extension for positional arguments. Unlike their standard
+counterparts, the `fmt` functions are type-safe and throw an exception
+if an argument type doesn't match its format specification.
+
+::: printf(string_view, const T&...)
+
+::: fprintf(std::FILE*, string_view, const T&...)
+
+::: sprintf(string_view, const T&...)
+
+<a id="xchar-api"></a>
+## Wide Strings
+
+The optional header `fmt/xchar.h` provides support for `wchar_t` and
+exotic character types.
+
+::: wstring_view
+
+::: wformat_context
+
+::: to_wstring(const T&)
+
+## Compatibility with C++20 `std::format`
+
+{fmt} implements nearly all of the [C++20 formatting
+library](https://en.cppreference.com/w/cpp/utility/format) with the
+following differences:
+
+- Names are defined in the `fmt` namespace instead of `std` to avoid
+ collisions with standard library implementations.
+
+- Width calculation doesn't use grapheme clusterization. The latter has
+ been implemented in a separate branch but hasn't been integrated yet.
+
+- The default floating-point representation in {fmt} uses the smallest
+ precision that provides round-trip guarantees similarly to other languages
+ like Java and Python. `std::format` is currently specified in terms of
+ `std::to_chars` which tries to generate the smallest number of characters
+ (ignoring redundant digits and sign in exponent) and may procude more
+ decimal digits than necessary.
diff --git a/thirdparty/fmt/doc/fmt.css b/thirdparty/fmt/doc/fmt.css
new file mode 100644
index 000000000..994d6e2e9
--- /dev/null
+++ b/thirdparty/fmt/doc/fmt.css
@@ -0,0 +1,61 @@
+:root {
+ --md-primary-fg-color: #0050D0;
+}
+
+.md-grid {
+ max-width: 960px;
+}
+
+@media (min-width: 400px) {
+ .md-tabs {
+ display: block;
+ }
+}
+
+.docblock {
+ border-left: .05rem solid var(--md-primary-fg-color);
+}
+
+.docblock-desc {
+ margin-left: 1em;
+}
+
+pre > code.decl {
+ white-space: pre-wrap;
+}
+
+
+code.decl > div {
+ text-indent: -2ch; /* Negative indent to counteract the indent on the first line */
+ padding-left: 2ch; /* Add padding to the left to create an indent */
+}
+
+.features-container {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 20px;
+ justify-content: center; /* Center the items horizontally */
+}
+
+.feature {
+ flex: 1 1 calc(50% - 20px); /* Two columns with space between */
+ max-width: 600px; /* Set the maximum width for the feature boxes */
+ box-sizing: border-box;
+ padding: 10px;
+ overflow: hidden; /* Hide overflow content */
+ text-overflow: ellipsis; /* Handle text overflow */
+ white-space: normal; /* Allow text wrapping */
+}
+
+.feature h2 {
+ margin-top: 0px;
+ font-weight: bold;
+}
+
+@media (max-width: 768px) {
+ .feature {
+ flex: 1 1 100%; /* Stack columns on smaller screens */
+ max-width: 100%; /* Allow full width on smaller screens */
+ white-space: normal; /* Allow text wrapping on smaller screens */
+ }
+}
diff --git a/thirdparty/fmt/doc/fmt.js b/thirdparty/fmt/doc/fmt.js
new file mode 100644
index 000000000..da7e95b77
--- /dev/null
+++ b/thirdparty/fmt/doc/fmt.js
@@ -0,0 +1,4 @@
+document$.subscribe(() => {
+ hljs.highlightAll(),
+ { language: 'c++' }
+})
diff --git a/thirdparty/fmt/doc/get-started.md b/thirdparty/fmt/doc/get-started.md
new file mode 100644
index 000000000..6bcefe7d0
--- /dev/null
+++ b/thirdparty/fmt/doc/get-started.md
@@ -0,0 +1,233 @@
+# Get Started
+
+Compile and run {fmt} examples online with [Compiler Explorer](
+https://godbolt.org/z/P7h6cd6o3).
+
+{fmt} is compatible with any build system. The next section describes its usage
+with CMake, while the [Build Systems](#build-systems) section covers the rest.
+
+## CMake
+
+{fmt} provides two CMake targets: `fmt::fmt` for the compiled library and
+`fmt::fmt-header-only` for the header-only library. It is recommended to use
+the compiled library for improved build times.
+
+There are three primary ways to use {fmt} with CMake:
+
+* **FetchContent**: Starting from CMake 3.11, you can use [`FetchContent`](
+ https://cmake.org/cmake/help/v3.30/module/FetchContent.html) to automatically
+ download {fmt} as a dependency at configure time:
+
+ include(FetchContent)
+
+ FetchContent_Declare(
+ fmt
+ GIT_REPOSITORY https://github.com/fmtlib/fmt
+ GIT_TAG e69e5f977d458f2650bb346dadf2ad30c5320281) # 10.2.1
+ FetchContent_MakeAvailable(fmt)
+
+ target_link_libraries(<your-target> fmt::fmt)
+
+* **Installed**: You can find and use an [installed](#installation) version of
+ {fmt} in your `CMakeLists.txt` file as follows:
+
+ find_package(fmt)
+ target_link_libraries(<your-target> fmt::fmt)
+
+* **Embedded**: You can add the {fmt} source tree to your project and include it
+ in your `CMakeLists.txt` file:
+
+ add_subdirectory(fmt)
+ target_link_libraries(<your-target> fmt::fmt)
+
+## Installation
+
+### Debian/Ubuntu
+
+To install {fmt} on Debian, Ubuntu, or any other Debian-based Linux
+distribution, use the following command:
+
+ apt install libfmt-dev
+
+### Homebrew
+
+Install {fmt} on macOS using [Homebrew](https://brew.sh/):
+
+ brew install fmt
+
+### Conda
+
+Install {fmt} on Linux, macOS, and Windows with [Conda](
+https://docs.conda.io/en/latest/), using its [conda-forge package](
+https://github.com/conda-forge/fmt-feedstock):
+
+ conda install -c conda-forge fmt
+
+### vcpkg
+
+Download and install {fmt} using the vcpkg package manager:
+
+ git clone https://github.com/Microsoft/vcpkg.git
+ cd vcpkg
+ ./bootstrap-vcpkg.sh
+ ./vcpkg integrate install
+ ./vcpkg install fmt
+
+<!-- The fmt package in vcpkg is kept up to date by Microsoft team members and
+community contributors. If the version is out of date, please [create an
+issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg
+repository. -->
+
+### Conan
+
+You can download and install {fmt} using the [Conan](https://conan.io/) package manager:
+
+ conan install -r conancenter --requires="fmt/[*]" --build=missing
+
+<!-- The {fmt} package in Conan Center is maintained by
+[ConanCenterIndex](https://github.com/conan-io/conan-center-index) community.
+If the version is out of date or the package does not work,
+please create an issue or pull request on the Conan Center Index repository. -->
+
+## Building from Source
+
+CMake works by generating native makefiles or project files that can be
+used in the compiler environment of your choice. The typical workflow
+starts with:
+
+ mkdir build # Create a directory to hold the build output.
+ cd build
+ cmake .. # Generate native build scripts.
+
+run in the `fmt` repository.
+
+If you are on a Unix-like system, you should now see a Makefile in the
+current directory. Now you can build the library by running `make`.
+
+Once the library has been built you can invoke `make test` to run the tests.
+
+You can control generation of the make `test` target with the `FMT_TEST`
+CMake option. This can be useful if you include fmt as a subdirectory in
+your project but don't want to add fmt's tests to your `test` target.
+
+To build a shared library set the `BUILD_SHARED_LIBS` CMake variable to `TRUE`:
+
+ cmake -DBUILD_SHARED_LIBS=TRUE ..
+
+To build a static library with position-independent code (e.g. for
+linking it into another shared library such as a Python extension), set the
+`CMAKE_POSITION_INDEPENDENT_CODE` CMake variable to `TRUE`:
+
+ cmake -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE ..
+
+After building the library you can install it on a Unix-like system by
+running `sudo make install`.
+
+### Building the Docs
+
+To build the documentation you need the following software installed on
+your system:
+
+- [Python](https://www.python.org/)
+- [Doxygen](http://www.stack.nl/~dimitri/doxygen/)
+- [MkDocs](https://www.mkdocs.org/) with `mkdocs-material`, `mkdocstrings`,
+ `pymdown-extensions` and `mike`
+
+First generate makefiles or project files using CMake as described in
+the previous section. Then compile the `doc` target/project, for example:
+
+ make doc
+
+This will generate the HTML documentation in `doc/html`.
+
+## Build Systems
+
+### build2
+
+You can use [build2](https://build2.org), a dependency manager and a build
+system, to use {fmt}.
+
+Currently this package is available in these package repositories:
+
+- <https://cppget.org/fmt/> for released and published versions.
+- <https://github.com/build2-packaging/fmt> for unreleased or custom versions.
+
+**Usage:**
+
+- `build2` package name: `fmt`
+- Library target name: `lib{fmt}`
+
+To make your `build2` project depend on `fmt`:
+
+- Add one of the repositories to your configurations, or in your
+ `repositories.manifest`, if not already there:
+
+ :
+ role: prerequisite
+ location: https://pkg.cppget.org/1/stable
+
+- Add this package as a dependency to your `manifest` file (example
+ for version 10):
+
+ depends: fmt ~10.0.0
+
+- Import the target and use it as a prerequisite to your own target
+ using `fmt` in the appropriate `buildfile`:
+
+ import fmt = fmt%lib{fmt}
+ lib{mylib} : cxx{**} ... $fmt
+
+Then build your project as usual with `b` or `bdep update`.
+
+### Meson
+
+[Meson WrapDB](https://mesonbuild.com/Wrapdb-projects.html) includes an `fmt`
+package.
+
+**Usage:**
+
+- Install the `fmt` subproject from the WrapDB by running:
+
+ meson wrap install fmt
+
+ from the root of your project.
+
+- In your project's `meson.build` file, add an entry for the new subproject:
+
+ fmt = subproject('fmt')
+ fmt_dep = fmt.get_variable('fmt_dep')
+
+- Include the new dependency object to link with fmt:
+
+ my_build_target = executable(
+ 'name', 'src/main.cc', dependencies: [fmt_dep])
+
+**Options:**
+
+If desired, {fmt} can be built as a static library, or as a header-only library.
+
+For a static build, use the following subproject definition:
+
+ fmt = subproject('fmt', default_options: 'default_library=static')
+ fmt_dep = fmt.get_variable('fmt_dep')
+
+For the header-only version, use:
+
+ fmt = subproject('fmt', default_options: ['header-only=true'])
+ fmt_dep = fmt.get_variable('fmt_header_only_dep')
+
+### Android NDK
+
+{fmt} provides [Android.mk file](
+https://github.com/fmtlib/fmt/blob/master/support/Android.mk) that can be used
+to build the library with [Android NDK](
+https://developer.android.com/tools/sdk/ndk/index.html).
+
+### Other
+
+To use the {fmt} library with any other build system, add
+`include/fmt/base.h`, `include/fmt/format.h`, `include/fmt/format-inl.h`,
+`src/format.cc` and optionally other headers from a [release archive](
+https://github.com/fmtlib/fmt/releases) or the [git repository](
+https://github.com/fmtlib/fmt) to your project, add `include` to include
+directories and make sure `src/format.cc` is compiled and linked with your code.
diff --git a/thirdparty/fmt/doc/index.md b/thirdparty/fmt/doc/index.md
new file mode 100644
index 000000000..a26947364
--- /dev/null
+++ b/thirdparty/fmt/doc/index.md
@@ -0,0 +1,151 @@
+---
+hide:
+ - navigation
+ - toc
+---
+
+# A modern formatting library
+
+<div class="features-container">
+
+<div class="feature">
+<h2>Safety</h2>
+<p>
+ Inspired by Python's formatting facility, {fmt} provides a safe replacement
+ for the <code>printf</code> family of functions. Errors in format strings,
+ which are a common source of vulnerabilities in C, are <b>reported at
+ compile time</b>. For example:
+
+ <pre><code class="language-cpp"
+ >fmt::format("{:d}", "I am not a number");</code></pre>
+
+ will give a compile-time error because <code>d</code> is not a valid
+ format specifier for strings. APIs like <a href="api/#format">
+ <code>fmt::format</code></a> <b>prevent buffer overflow errors</b> via
+ automatic memory management.
+</p>
+<a href="api#compile-time-checks">→ Learn more</a>
+</div>
+
+<div class="feature">
+<h2>Extensibility</h2>
+<p>
+ Formatting of most <b>standard types</b>, including all containers, dates,
+ and times is <b>supported out-of-the-box</b>. For example:
+
+ <pre><code class="language-cpp"
+ >fmt::print("{}", std::vector{1, 2, 3});</code></pre>
+
+ prints the vector in a JSON-like format:
+
+ <pre><code>[1, 2, 3]</code></pre>
+
+ You can <b>make your own types formattable</b> and even make compile-time
+ checks work for them.
+</p>
+<a href="api#udt">→ Learn more</a>
+</div>
+
+<div class="feature">
+<h2>Performance</h2>
+<p>
+ {fmt} can be anywhere from <b>tens of percent to 20-30 times faster</b> than
+ iostreams and <code>sprintf</code>, especially for numeric formatting.
+
+<a href="https://github.com/fmtlib/fmt?tab=readme-ov-file#benchmarks">
+<img src="perf.svg">
+</a>
+
+ The library <b>minimizes dynamic memory allocations</b> and can optionally
+ <a href="api#compile-api">compile format strings</a> to optimal code.
+</p>
+</div>
+
+<div class="feature">
+<h2>Unicode support</h2>
+<p>
+ {fmt} provides <b>portable Unicode support</b> on major operating systems
+ with UTF-8 and <code>char</code> strings. For example:
+
+ <pre><code class="language-cpp"
+ >fmt::print("Слава Україні!");</code></pre>
+
+ will be printed correctly on Linux, macOS, and even Windows console,
+ irrespective of the codepages.
+</p>
+<p>
+ The default is <b>locale-independent</b>, but you can opt into localized
+ formatting and {fmt} makes it work with Unicode, addressing issues in the
+ standard libary.
+</p>
+</div>
+
+<div class="feature">
+<h2>Fast compilation</h2>
+<p>
+ The library makes extensive use of <b>type erasure</b> to achieve fast
+ compilation. <code>fmt/base.h</code> provides a subset of the API with
+ <b>minimal include dependencies</b> and enough functionality to replace
+ all uses of <code>*printf</code>.
+</p>
+<p>
+ Code using {fmt} is usually several times faster to compile than the
+ equivalent iostreams code, and while <code>printf</code> compiles faster
+ still, the gap is narrowing.
+</p>
+<a href=
+"https://github.com/fmtlib/fmt?tab=readme-ov-file#compile-time-and-code-bloat">
+→ Learn more</a>
+</div>
+
+<div class="feature">
+<h2>Small binary footprint</h2>
+<p>
+ Type erasure is also used to prevent template bloat, resulting in <b>compact
+ per-call binary code</b>. For example, a call to <code>fmt::print</code> with
+ a single argument is just <a href="https://godbolt.org/g/TZU4KF">a few
+ instructions</a>, comparable to <code>printf</code> despite adding
+ runtime safety, and much smaller than the equivalent iostreams code.
+</p>
+<p>
+ The library itself has small binary footprint and some components such as
+ floating-point formatting can be disabled to make it even smaller for
+ resource-constrained devices.
+</p>
+</div>
+
+<div class="feature">
+<h2>Portability</h2>
+<p>
+ {fmt} has a <b>small self-contained codebase</b> with the core consisting of
+ just three headers and no external dependencies.
+</p>
+<p>
+ The library is highly portable and requires only a minimal <b>subset of
+ C++11</b> features which are available in GCC 4.9, Clang 3.6, MSVC 19.10
+ (2017) and later. Newer compiler and standard library features are used
+ if available, and enable additional functionality.
+</p>
+<p>
+ Where possible, the output of formatting functions is <b>consistent across
+ platforms</b>.
+</p>
+</p>
+</div>
+
+<div class="feature">
+<h2>Open source</h2>
+<p>
+ {fmt} is in the top hundred open-source C++ libraries on GitHub and has
+ <a href="https://github.com/fmtlib/fmt/graphs/contributors">hundreds of
+ all-time contributors</a>.
+</p>
+<p>
+ The library is distributed under a permissive MIT
+ <a href="https://github.com/fmtlib/fmt#license">license</a> and is
+ <b>relied upon by many open-source projects</b>, including Blender, PyTorch,
+ Apple's FoundationDB, Windows Terminal, MongoDB, and others.
+</p>
+</div>
+
+</div>
diff --git a/thirdparty/fmt/doc/perf.svg b/thirdparty/fmt/doc/perf.svg
new file mode 100644
index 000000000..7867a1544
--- /dev/null
+++ b/thirdparty/fmt/doc/perf.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="20 0 550 300" aria-label="A chart." style="overflow: hidden;"><defs id="_ABSTRACT_RENDERER_ID_0"><clipPath id="_ABSTRACT_RENDERER_ID_1"><rect x="120" y="45" width="560" height="210"></rect></clipPath></defs><rect x="0" y="0" width="800" height="300" stroke="none" stroke-width="0" fill="#ffffff"></rect><g><text text-anchor="start" x="120" y="27.05" font-family="Arial" font-size="13" font-weight="bold" stroke="none" stroke-width="0" fill="#000000">double to string</text><rect x="120" y="16" width="560" height="13" stroke="none" stroke-width="0" fill-opacity="0" fill="#ffffff"></rect></g><g><rect x="120" y="45" width="560" height="210" stroke="none" stroke-width="0" fill-opacity="0" fill="#ffffff"></rect><g clip-path="url(#_ABSTRACT_RENDERER_ID_1)"><g><rect x="120" y="45" width="1" height="210" stroke="none" stroke-width="0" fill="#cccccc"></rect><rect x="213" y="45" width="1" height="210" stroke="none" stroke-width="0" fill="#cccccc"></rect><rect x="306" y="45" width="1" height="210" stroke="none" stroke-width="0" fill="#cccccc"></rect><rect x="400" y="45" width="1" height="210" stroke="none" stroke-width="0" fill="#cccccc"></rect><rect x="493" y="45" width="1" height="210" stroke="none" stroke-width="0" fill="#cccccc"></rect><rect x="586" y="45" width="1" height="210" stroke="none" stroke-width="0" fill="#cccccc"></rect><rect x="679" y="45" width="1" height="210" stroke="none" stroke-width="0" fill="#cccccc"></rect></g><g><rect x="121" y="53" width="450" height="26" stroke="#ff9900" stroke-width="1" fill="#ff9900"></rect><rect x="121" y="95" width="421" height="26" stroke="#109618" stroke-width="1" fill="#109618"></rect><rect x="121" y="137" width="341" height="26" stroke="#990099" stroke-width="1" fill="#990099"></rect><rect x="121" y="179" width="31" height="26" stroke="#3366cc" stroke-width="1" fill="#3366cc"></rect><rect x="121" y="221" width="15" height="26" stroke="#dc3912" stroke-width="1" fill="#dc3912"></rect></g><g><rect x="120" y="45" width="1" height="210" stroke="none" stroke-width="0" fill="#333333"></rect></g></g><g></g><g><g><text text-anchor="middle" x="120.5" y="272.3833333333333" font-family="Arial" font-size="13" stroke="none" stroke-width="0" fill="#444444">0</text></g><g><text text-anchor="middle" x="213.6667" y="272.3833333333333" font-family="Arial" font-size="13" stroke="none" stroke-width="0" fill="#444444">250</text></g><g><text text-anchor="middle" x="306.8333" y="272.3833333333333" font-family="Arial" font-size="13" stroke="none" stroke-width="0" fill="#444444">500</text></g><g><text text-anchor="middle" x="400" y="272.3833333333333" font-family="Arial" font-size="13" stroke="none" stroke-width="0" fill="#444444">750</text></g><g><text text-anchor="middle" x="493.1667" y="272.3833333333333" font-family="Arial" font-size="13" stroke="none" stroke-width="0" fill="#444444">1,000</text></g><g><text text-anchor="middle" x="586.3333" y="272.3833333333333" font-family="Arial" font-size="13" stroke="none" stroke-width="0" fill="#444444">1,250</text></g><g><text text-anchor="middle" x="679.5" y="272.3833333333333" font-family="Arial" font-size="13" stroke="none" stroke-width="0" fill="#444444">1,500</text></g><g><text text-anchor="end" x="107" y="70.95" font-family="Arial" font-size="13" stroke="none" stroke-width="0" fill="#222222">ostringstream</text></g><g><text text-anchor="end" x="107" y="112.74999999999999" font-family="Arial" font-size="13" stroke="none" stroke-width="0" fill="#222222">ostrstream</text></g><g><text text-anchor="end" x="107" y="154.55" font-family="Arial" font-size="13" stroke="none" stroke-width="0" fill="#222222">sprintf</text></g><g><text text-anchor="end" x="107" y="196.35" font-family="Arial" font-size="13" stroke="none" stroke-width="0" fill="#222222">doubleconv</text></g><g><text text-anchor="end" x="107" y="238.15" font-family="Arial" font-size="13" stroke="none" stroke-width="0" fill="#222222">fmt</text></g></g></g><g><g><text text-anchor="middle" x="300" y="291.71666666666664" font-family="Arial" font-size="13" font-style="italic" stroke="none" stroke-width="0" fill="#222222">Time (ns), smaller is better</text><rect x="120" y="280.66666666666663" width="560" height="13" stroke="none" stroke-width="0" fill-opacity="0" fill="#ffffff"></rect></g></g><g></g></svg> \ No newline at end of file
diff --git a/thirdparty/fmt/doc/python-license.txt b/thirdparty/fmt/doc/python-license.txt
new file mode 100644
index 000000000..88eed1f9c
--- /dev/null
+++ b/thirdparty/fmt/doc/python-license.txt
@@ -0,0 +1,290 @@
+A. HISTORY OF THE SOFTWARE
+==========================
+
+Python was created in the early 1990s by Guido van Rossum at Stichting
+Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
+as a successor of a language called ABC. Guido remains Python's
+principal author, although it includes many contributions from others.
+
+In 1995, Guido continued his work on Python at the Corporation for
+National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
+in Reston, Virginia where he released several versions of the
+software.
+
+In May 2000, Guido and the Python core development team moved to
+BeOpen.com to form the BeOpen PythonLabs team. In October of the same
+year, the PythonLabs team moved to Digital Creations (now Zope
+Corporation, see http://www.zope.com). In 2001, the Python Software
+Foundation (PSF, see http://www.python.org/psf/) was formed, a
+non-profit organization created specifically to own Python-related
+Intellectual Property. Zope Corporation is a sponsoring member of
+the PSF.
+
+All Python releases are Open Source (see http://www.opensource.org for
+the Open Source Definition). Historically, most, but not all, Python
+releases have also been GPL-compatible; the table below summarizes
+the various releases.
+
+ Release Derived Year Owner GPL-
+ from compatible? (1)
+
+ 0.9.0 thru 1.2 1991-1995 CWI yes
+ 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes
+ 1.6 1.5.2 2000 CNRI no
+ 2.0 1.6 2000 BeOpen.com no
+ 1.6.1 1.6 2001 CNRI yes (2)
+ 2.1 2.0+1.6.1 2001 PSF no
+ 2.0.1 2.0+1.6.1 2001 PSF yes
+ 2.1.1 2.1+2.0.1 2001 PSF yes
+ 2.2 2.1.1 2001 PSF yes
+ 2.1.2 2.1.1 2002 PSF yes
+ 2.1.3 2.1.2 2002 PSF yes
+ 2.2.1 2.2 2002 PSF yes
+ 2.2.2 2.2.1 2002 PSF yes
+ 2.2.3 2.2.2 2003 PSF yes
+ 2.3 2.2.2 2002-2003 PSF yes
+ 2.3.1 2.3 2002-2003 PSF yes
+ 2.3.2 2.3.1 2002-2003 PSF yes
+ 2.3.3 2.3.2 2002-2003 PSF yes
+ 2.3.4 2.3.3 2004 PSF yes
+ 2.3.5 2.3.4 2005 PSF yes
+ 2.4 2.3 2004 PSF yes
+ 2.4.1 2.4 2005 PSF yes
+ 2.4.2 2.4.1 2005 PSF yes
+ 2.4.3 2.4.2 2006 PSF yes
+ 2.4.4 2.4.3 2006 PSF yes
+ 2.5 2.4 2006 PSF yes
+ 2.5.1 2.5 2007 PSF yes
+ 2.5.2 2.5.1 2008 PSF yes
+ 2.5.3 2.5.2 2008 PSF yes
+ 2.6 2.5 2008 PSF yes
+ 2.6.1 2.6 2008 PSF yes
+ 2.6.2 2.6.1 2009 PSF yes
+ 2.6.3 2.6.2 2009 PSF yes
+ 2.6.4 2.6.3 2009 PSF yes
+ 2.6.5 2.6.4 2010 PSF yes
+ 3.0 2.6 2008 PSF yes
+ 3.0.1 3.0 2009 PSF yes
+ 3.1 3.0.1 2009 PSF yes
+ 3.1.1 3.1 2009 PSF yes
+ 3.1.2 3.1.1 2010 PSF yes
+ 3.1.3 3.1.2 2010 PSF yes
+ 3.1.4 3.1.3 2011 PSF yes
+ 3.2 3.1 2011 PSF yes
+ 3.2.1 3.2 2011 PSF yes
+ 3.2.2 3.2.1 2011 PSF yes
+ 3.2.3 3.2.2 2012 PSF yes
+ 3.3.0 3.2 2012 PSF yes
+
+Footnotes:
+
+(1) GPL-compatible doesn't mean that we're distributing Python under
+ the GPL. All Python licenses, unlike the GPL, let you distribute
+ a modified version without making your changes open source. The
+ GPL-compatible licenses make it possible to combine Python with
+ other software that is released under the GPL; the others don't.
+
+(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
+ because its license has a choice of law clause. According to
+ CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
+ is "not incompatible" with the GPL.
+
+Thanks to the many outside volunteers who have worked under Guido's
+direction to make these releases possible.
+
+
+B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
+===============================================================
+
+PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
+--------------------------------------------
+
+1. This LICENSE AGREEMENT is between the Python Software Foundation
+("PSF"), and the Individual or Organization ("Licensee") accessing and
+otherwise using this software ("Python") in source or binary form and
+its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, PSF hereby
+grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
+analyze, test, perform and/or display publicly, prepare derivative works,
+distribute, and otherwise use Python alone or in any derivative version,
+provided, however, that PSF's License Agreement and PSF's notice of copyright,
+i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+2011, 2012 Python Software Foundation; All Rights Reserved" are retained in Python
+alone or in any derivative version prepared by Licensee.
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python.
+
+4. PSF is making Python available to Licensee on an "AS IS"
+basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. Nothing in this License Agreement shall be deemed to create any
+relationship of agency, partnership, or joint venture between PSF and
+Licensee. This License Agreement does not grant permission to use PSF
+trademarks or trade name in a trademark sense to endorse or promote
+products or services of Licensee, or any third party.
+
+8. By copying, installing or otherwise using Python, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
+-------------------------------------------
+
+BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
+
+1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
+office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
+Individual or Organization ("Licensee") accessing and otherwise using
+this software in source or binary form and its associated
+documentation ("the Software").
+
+2. Subject to the terms and conditions of this BeOpen Python License
+Agreement, BeOpen hereby grants Licensee a non-exclusive,
+royalty-free, world-wide license to reproduce, analyze, test, perform
+and/or display publicly, prepare derivative works, distribute, and
+otherwise use the Software alone or in any derivative version,
+provided, however, that the BeOpen Python License is retained in the
+Software, alone or in any derivative version prepared by Licensee.
+
+3. BeOpen is making the Software available to Licensee on an "AS IS"
+basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
+SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
+AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
+DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+5. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+6. This License Agreement shall be governed by and interpreted in all
+respects by the law of the State of California, excluding conflict of
+law provisions. Nothing in this License Agreement shall be deemed to
+create any relationship of agency, partnership, or joint venture
+between BeOpen and Licensee. This License Agreement does not grant
+permission to use BeOpen trademarks or trade names in a trademark
+sense to endorse or promote products or services of Licensee, or any
+third party. As an exception, the "BeOpen Python" logos available at
+http://www.pythonlabs.com/logos.html may be used according to the
+permissions granted on that web page.
+
+7. By copying, installing or otherwise using the software, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
+---------------------------------------
+
+1. This LICENSE AGREEMENT is between the Corporation for National
+Research Initiatives, having an office at 1895 Preston White Drive,
+Reston, VA 20191 ("CNRI"), and the Individual or Organization
+("Licensee") accessing and otherwise using Python 1.6.1 software in
+source or binary form and its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, CNRI
+hereby grants Licensee a nonexclusive, royalty-free, world-wide
+license to reproduce, analyze, test, perform and/or display publicly,
+prepare derivative works, distribute, and otherwise use Python 1.6.1
+alone or in any derivative version, provided, however, that CNRI's
+License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
+1995-2001 Corporation for National Research Initiatives; All Rights
+Reserved" are retained in Python 1.6.1 alone or in any derivative
+version prepared by Licensee. Alternately, in lieu of CNRI's License
+Agreement, Licensee may substitute the following text (omitting the
+quotes): "Python 1.6.1 is made available subject to the terms and
+conditions in CNRI's License Agreement. This Agreement together with
+Python 1.6.1 may be located on the Internet using the following
+unique, persistent identifier (known as a handle): 1895.22/1013. This
+Agreement may also be obtained from a proxy server on the Internet
+using the following URL: http://hdl.handle.net/1895.22/1013".
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python 1.6.1 or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python 1.6.1.
+
+4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
+basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. This License Agreement shall be governed by the federal
+intellectual property law of the United States, including without
+limitation the federal copyright law, and, to the extent such
+U.S. federal law does not apply, by the law of the Commonwealth of
+Virginia, excluding Virginia's conflict of law provisions.
+Notwithstanding the foregoing, with regard to derivative works based
+on Python 1.6.1 that incorporate non-separable material that was
+previously distributed under the GNU General Public License (GPL), the
+law of the Commonwealth of Virginia shall govern this License
+Agreement only as to issues arising under or with respect to
+Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this
+License Agreement shall be deemed to create any relationship of
+agency, partnership, or joint venture between CNRI and Licensee. This
+License Agreement does not grant permission to use CNRI trademarks or
+trade name in a trademark sense to endorse or promote products or
+services of Licensee, or any third party.
+
+8. By clicking on the "ACCEPT" button where indicated, or by copying,
+installing or otherwise using Python 1.6.1, Licensee agrees to be
+bound by the terms and conditions of this License Agreement.
+
+ ACCEPT
+
+
+CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
+--------------------------------------------------
+
+Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
+The Netherlands. All rights reserved.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/thirdparty/fmt/doc/syntax.md b/thirdparty/fmt/doc/syntax.md
new file mode 100644
index 000000000..46d7d2fd2
--- /dev/null
+++ b/thirdparty/fmt/doc/syntax.md
@@ -0,0 +1,886 @@
+# Format String Syntax
+
+Formatting functions such as [`fmt::format`](api.md#format) and [`fmt::print`](
+api.md#print) use the same format string syntax described in this section.
+
+Format strings contain "replacement fields" surrounded by curly braces `{}`.
+Anything that is not contained in braces is considered literal text, which is
+copied unchanged to the output. If you need to include a brace character in
+the literal text, it can be escaped by doubling: `{{` and `}}`.
+
+The grammar for a replacement field is as follows:
+
+<a id="replacement-field"></a>
+<pre><code class="language-json"
+>replacement_field ::= "{" [arg_id] [":" (<a href="#format-spec"
+ >format_spec</a> | <a href="#chrono-format-spec">chrono_format_spec</a>)] "}"
+arg_id ::= integer | identifier
+integer ::= digit+
+digit ::= "0"..."9"
+identifier ::= id_start id_continue*
+id_start ::= "a"..."z" | "A"..."Z" | "_"
+id_continue ::= id_start | digit</code>
+</pre>
+
+In less formal terms, the replacement field can start with an *arg_id* that
+specifies the argument whose value is to be formatted and inserted into the
+output instead of the replacement field. The *arg_id* is optionally followed
+by a *format_spec*, which is preceded by a colon `':'`. These specify a
+non-default format for the replacement value.
+
+See also the [Format Specification
+Mini-Language](#format-specification-mini-language) section.
+
+If the numerical arg_ids in a format string are 0, 1, 2, ... in sequence,
+they can all be omitted (not just some) and the numbers 0, 1, 2, ... will be
+automatically inserted in that order.
+
+Named arguments can be referred to by their names or indices.
+
+Some simple format string examples:
+
+```c++
+"First, thou shalt count to {0}" // References the first argument
+"Bring me a {}" // Implicitly references the first argument
+"From {} to {}" // Same as "From {0} to {1}"
+```
+
+The *format_spec* field contains a specification of how the value should
+be presented, including such details as field width, alignment, padding,
+decimal precision and so on. Each value type can define its own
+"formatting mini-language" or interpretation of the *format_spec*.
+
+Most built-in types support a common formatting mini-language, which is
+described in the next section.
+
+A *format_spec* field can also include nested replacement fields in
+certain positions within it. These nested replacement fields can contain
+only an argument id; format specifications are not allowed. This allows
+the formatting of a value to be dynamically specified.
+
+See the [Format Examples](#format-examples) section for some examples.
+
+## Format Specification Mini-Language
+
+"Format specifications" are used within replacement fields contained within a
+format string to define how individual values are presented. Each formattable
+type may define how the format specification is to be interpreted.
+
+Most built-in types implement the following options for format
+specifications, although some of the formatting options are only
+supported by the numeric types.
+
+The general form of a *standard format specifier* is:
+
+<a id="format-spec"></a>
+<pre><code class="language-json"
+>format_spec ::= [[fill]align][sign]["#"]["0"][width]["." precision]["L"][type]
+fill ::= &lt;a character other than '{' or '}'>
+align ::= "<" | ">" | "^"
+sign ::= "+" | "-" | " "
+width ::= <a href="#replacement-field">integer</a> | "{" [<a
+ href="#replacement-field">arg_id</a>] "}"
+precision ::= <a href="#replacement-field">integer</a> | "{" [<a
+ href="#replacement-field">arg_id</a>] "}"
+type ::= "a" | "A" | "b" | "B" | "c" | "d" | "e" | "E" | "f" | "F" |
+ "g" | "G" | "o" | "p" | "s" | "x" | "X" | "?"</code>
+</pre>
+
+The *fill* character can be any Unicode code point other than `'{'` or `'}'`.
+The presence of a fill character is signaled by the character following it,
+which must be one of the alignment options. If the second character of
+*format_spec* is not a valid alignment option, then it is assumed that both
+the fill character and the alignment option are absent.
+
+The meaning of the various alignment options is as follows:
+
+<table>
+<tr>
+ <th>Option</th>
+ <th>Meaning</th>
+</tr>
+<tr>
+ <td><code>'<'</code></td>
+ <td>
+ Forces the field to be left-aligned within the available space (this is the
+ default for most objects).
+ </td>
+</tr>
+<tr>
+ <td><code>'>'</code></td>
+ <td>
+ Forces the field to be right-aligned within the available space (this is
+ the default for numbers).
+ </td>
+</tr>
+<tr>
+ <td><code>'^'</code></td>
+ <td>Forces the field to be centered within the available space.</td>
+</tr>
+</table>
+
+Note that unless a minimum field width is defined, the field width will
+always be the same size as the data to fill it, so that the alignment
+option has no meaning in this case.
+
+The *sign* option is only valid for floating point and signed integer types,
+and can be one of the following:
+
+<table>
+<tr>
+ <th>Option</th>
+ <th>Meaning</th>
+</tr>
+<tr>
+ <td><code>'+'</code></td>
+ <td>
+ Indicates that a sign should be used for both nonnegative as well as
+ negative numbers.
+ </td>
+</tr>
+<tr>
+ <td><code>'-'</code></td>
+ <td>
+ Indicates that a sign should be used only for negative numbers (this is the
+ default behavior).
+ </td>
+</tr>
+<tr>
+ <td>space</td>
+ <td>
+ Indicates that a leading space should be used on nonnegative numbers, and a
+ minus sign on negative numbers.
+ </td>
+</tr>
+</table>
+
+The `'#'` option causes the "alternate form" to be used for the
+conversion. The alternate form is defined differently for different
+types. This option is only valid for integer and floating-point types.
+For integers, when binary, octal, or hexadecimal output is used, this
+option adds the prefix respective `"0b"` (`"0B"`), `"0"`, or `"0x"`
+(`"0X"`) to the output value. Whether the prefix is lower-case or
+upper-case is determined by the case of the type specifier, for example,
+the prefix `"0x"` is used for the type `'x'` and `"0X"` is used for
+`'X'`. For floating-point numbers the alternate form causes the result
+of the conversion to always contain a decimal-point character, even if
+no digits follow it. Normally, a decimal-point character appears in the
+result of these conversions only if a digit follows it. In addition, for
+`'g'` and `'G'` conversions, trailing zeros are not removed from the
+result.
+
+*width* is a decimal integer defining the minimum field width. If not
+specified, then the field width will be determined by the content.
+
+Preceding the *width* field by a zero (`'0'`) character enables
+sign-aware zero-padding for numeric types. It forces the padding to be
+placed after the sign or base (if any) but before the digits. This is
+used for printing fields in the form "+000000120". This option is only
+valid for numeric types and it has no effect on formatting of infinity
+and NaN. This option is ignored when any alignment specifier is present.
+
+The *precision* is a decimal number indicating how many digits should be
+displayed after the decimal point for a floating-point value formatted
+with `'f'` and `'F'`, or before and after the decimal point for a
+floating-point value formatted with `'g'` or `'G'`. For non-number types
+the field indicates the maximum field size - in other words, how many
+characters will be used from the field content. The *precision* is not
+allowed for integer, character, Boolean, and pointer values. Note that a
+C string must be null-terminated even if precision is specified.
+
+The `'L'` option uses the current locale setting to insert the appropriate
+number separator characters. This option is only valid for numeric types.
+
+Finally, the *type* determines how the data should be presented.
+
+The available string presentation types are:
+
+<table>
+<tr>
+ <th>Type</th>
+ <th>Meaning</th>
+</tr>
+<tr>
+ <td><code>'s'</code></td>
+ <td>
+ String format. This is the default type for strings and may be omitted.
+ </td>
+</tr>
+<tr>
+ <td><code>'?'</code></td>
+ <td>Debug format. The string is quoted and special characters escaped.</td>
+</tr>
+<tr>
+ <td>none</td>
+ <td>The same as <code>'s'</code>.</td>
+</tr>
+</table>
+
+The available character presentation types are:
+
+<table>
+<tr>
+ <th>Type</th>
+ <th>Meaning</th>
+</tr>
+<tr>
+ <td><code>'c'</code></td>
+ <td>
+ Character format. This is the default type for characters and may be
+ omitted.
+ </td>
+</tr>
+<tr>
+ <td><code>'?'</code></td>
+ <td>Debug format. The character is quoted and special characters escaped.</td>
+</tr>
+<tr>
+ <td>none</td>
+ <td>The same as <code>'c'</code>.</td>
+</tr>
+</table>
+
+The available integer presentation types are:
+
+<table>
+<tr>
+ <th>Type</th>
+ <th>Meaning</th>
+</tr>
+<tr>
+ <td><code>'b'</code></td>
+ <td>
+ Binary format. Outputs the number in base 2. Using the <code>'#'</code>
+ option with this type adds the prefix <code>"0b"</code> to the output value.
+ </td>
+</tr>
+<tr>
+ <td><code>'B'</code></td>
+ <td>
+ Binary format. Outputs the number in base 2. Using the <code>'#'</code>
+ option with this type adds the prefix <code>"0B"</code> to the output value.
+ </td>
+</tr>
+<tr>
+ <td><code>'c'</code></td>
+ <td>Character format. Outputs the number as a character.</td>
+</tr>
+<tr>
+ <td><code>'d'</code></td>
+ <td>Decimal integer. Outputs the number in base 10.</td>
+</tr>
+<tr>
+ <td><code>'o'</code></td>
+ <td>Octal format. Outputs the number in base 8.</td>
+</tr>
+<tr>
+ <td><code>'x'</code></td>
+ <td>
+ Hex format. Outputs the number in base 16, using lower-case letters for the
+ digits above 9. Using the <code>'#'</code> option with this type adds the
+ prefix <code>"0x"</code> to the output value.
+ </td>
+</tr>
+<tr>
+ <td><code>'X'</code></td>
+ <td>
+ Hex format. Outputs the number in base 16, using upper-case letters for the
+ digits above 9. Using the <code>'#'</code> option with this type adds the
+ prefix <code>"0X"</code> to the output value.
+ </td>
+</tr>
+<tr>
+ <td>none</td>
+ <td>The same as <code>'d'</code>.</td>
+</tr>
+</table>
+
+Integer presentation types can also be used with character and Boolean values
+with the only exception that `'c'` cannot be used with `bool`. Boolean values
+are formatted using textual representation, either `true` or `false`, if the
+presentation type is not specified.
+
+The available presentation types for floating-point values are:
+
+<table>
+<tr>
+ <th>Type</th>
+ <th>Meaning</th>
+</tr>
+<tr>
+ <td><code>'a'</code></td>
+ <td>
+ Hexadecimal floating point format. Prints the number in base 16 with
+ prefix <code>"0x"</code> and lower-case letters for digits above 9.
+ Uses <code>'p'</code> to indicate the exponent.
+ </td>
+</tr>
+<tr>
+ <td><code>'A'</code></td>
+ <td>
+ Same as <code>'a'</code> except it uses upper-case letters for the
+ prefix, digits above 9 and to indicate the exponent.
+ </td>
+</tr>
+<tr>
+ <td><code>'e'</code></td>
+ <td>
+ Exponent notation. Prints the number in scientific notation using
+ the letter 'e' to indicate the exponent.
+ </td>
+</tr>
+<tr>
+ <td><code>'E'</code></td>
+ <td>
+ Exponent notation. Same as <code>'e'</code> except it uses an
+ upper-case <code>'E'</code> as the separator character.
+ </td>
+</tr>
+<tr>
+ <td><code>'f'</code></td>
+ <td>Fixed point. Displays the number as a fixed-point number.</td>
+</tr>
+<tr>
+ <td><code>'F'</code></td>
+ <td>
+ Fixed point. Same as <code>'f'</code>, but converts <code>nan</code>
+ to <code>NAN</code> and <code>inf</code> to <code>INF</code>.
+ </td>
+</tr>
+<tr>
+ <td><code>'g'</code></td>
+ <td>
+ <p>General format. For a given precision <code>p &gt;= 1</code>,
+ this rounds the number to <code>p</code> significant digits and then
+ formats the result in either fixed-point format or in scientific
+ notation, depending on its magnitude.</p>
+ <p>A precision of <code>0</code> is treated as equivalent to a precision
+ of <code>1</code>.</p>
+ </td>
+</tr>
+<tr>
+ <td><code>'G'</code></td>
+ <td>
+ General format. Same as <code>'g'</code> except switches to
+ <code>'E'</code> if the number gets too large. The representations of
+ infinity and NaN are uppercased, too.
+ </td>
+</tr>
+<tr>
+ <td>none</td>
+ <td>
+ Similar to <code>'g'</code>, except that the default precision is as
+ high as needed to represent the particular value.
+ </td>
+</tr>
+</table>
+
+The available presentation types for pointers are:
+
+<table>
+<tr>
+ <th>Type</th>
+ <th>Meaning</th>
+</tr>
+<tr>
+ <td><code>'p'</code></td>
+ <td>
+ Pointer format. This is the default type for pointers and may be omitted.
+ </td>
+</tr>
+<tr>
+ <td>none</td>
+ <td>The same as <code>'p'</code>.</td>
+</tr>
+</table>
+
+## Chrono Format Specifications
+
+Format specifications for chrono duration and time point types as well as
+`std::tm` have the following syntax:
+
+<a id="chrono-format-spec"></a>
+<pre><code class="language-json"
+>chrono_format_spec ::= [[<a href="#format-spec">fill</a>]<a href="#format-spec"
+ >align</a>][<a href="#format-spec">width</a>]["." <a href="#format-spec"
+ >precision</a>][chrono_specs]
+chrono_specs ::= conversion_spec |
+ chrono_specs (conversion_spec | literal_char)
+conversion_spec ::= "%" [padding_modifier] [locale_modifier] chrono_type
+literal_char ::= &lt;a character other than '{', '}' or '%'>
+padding_modifier ::= "-" | "_" | "0"
+locale_modifier ::= "E" | "O"
+chrono_type ::= "a" | "A" | "b" | "B" | "c" | "C" | "d" | "D" | "e" |
+ "F" | "g" | "G" | "h" | "H" | "I" | "j" | "m" | "M" |
+ "n" | "p" | "q" | "Q" | "r" | "R" | "S" | "t" | "T" |
+ "u" | "U" | "V" | "w" | "W" | "x" | "X" | "y" | "Y" |
+ "z" | "Z" | "%"</code>
+</pre>
+
+Literal chars are copied unchanged to the output. Precision is valid only
+for `std::chrono::duration` types with a floating-point representation type.
+
+The available presentation types (*chrono_type*) are:
+
+<table>
+<tr>
+ <th>Type</th>
+ <th>Meaning</th>
+</tr>
+<tr>
+ <td><code>'a'</code></td>
+ <td>
+ The abbreviated weekday name, e.g. "Sat". If the value does not contain a
+ valid weekday, an exception of type <code>format_error</code> is thrown.
+ </td>
+</tr>
+<tr>
+ <td><code>'A'</code></td>
+ <td>
+ The full weekday name, e.g. "Saturday". If the value does not contain a
+ valid weekday, an exception of type <code>format_error</code> is thrown.
+ </td>
+</tr>
+<tr>
+ <td><code>'b'</code></td>
+ <td>
+ The abbreviated month name, e.g. "Nov". If the value does not contain a
+ valid month, an exception of type <code>format_error</code> is thrown.
+ </td>
+</tr>
+<tr>
+ <td><code>'B'</code></td>
+ <td>
+ The full month name, e.g. "November". If the value does not contain a valid
+ month, an exception of type <code>format_error</code> is thrown.
+ </td>
+</tr>
+<tr>
+ <td><code>'c'</code></td>
+ <td>
+ The date and time representation, e.g. "Sat Nov 12 22:04:00 1955". The
+ modified command <code>%Ec</code> produces the locale's alternate date and
+ time representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'C'</code></td>
+ <td>
+ The year divided by 100 using floored division, e.g. "19". If the result
+ is a single decimal digit, it is prefixed with 0. The modified command
+ <code>%EC</code> produces the locale's alternative representation of the
+ century.
+ </td>
+</tr>
+<tr>
+ <td><code>'d'</code></td>
+ <td>
+ The day of month as a decimal number. If the result is a single decimal
+ digit, it is prefixed with 0. The modified command <code>%Od</code>
+ produces the locale's alternative representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'D'</code></td>
+ <td>Equivalent to <code>%m/%d/%y</code>, e.g. "11/12/55".</td>
+</tr>
+<tr>
+ <td><code>'e'</code></td>
+ <td>
+ The day of month as a decimal number. If the result is a single decimal
+ digit, it is prefixed with a space. The modified command <code>%Oe</code>
+ produces the locale's alternative representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'F'</code></td>
+ <td>Equivalent to <code>%Y-%m-%d</code>, e.g. "1955-11-12".</td>
+</tr>
+<tr>
+ <td><code>'g'</code></td>
+ <td>
+ The last two decimal digits of the ISO week-based year. If the result is a
+ single digit it is prefixed by 0.
+ </td>
+</tr>
+<tr>
+ <td><code>'G'</code></td>
+ <td>
+ The ISO week-based year as a decimal number. If the result is less than
+ four digits it is left-padded with 0 to four digits.
+ </td>
+</tr>
+<tr>
+ <td><code>'h'</code></td>
+ <td>Equivalent to <code>%b</code>, e.g. "Nov".</td>
+</tr>
+<tr>
+ <td><code>'H'</code></td>
+ <td>
+ The hour (24-hour clock) as a decimal number. If the result is a single
+ digit, it is prefixed with 0. The modified command <code>%OH</code>
+ produces the locale's alternative representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'I'</code></td>
+ <td>
+ The hour (12-hour clock) as a decimal number. If the result is a single
+ digit, it is prefixed with 0. The modified command <code>%OI</code>
+ produces the locale's alternative representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'j'</code></td>
+ <td>
+ If the type being formatted is a specialization of duration, the decimal
+ number of days without padding. Otherwise, the day of the year as a decimal
+ number. Jan 1 is 001. If the result is less than three digits, it is
+ left-padded with 0 to three digits.
+ </td>
+</tr>
+<tr>
+ <td><code>'m'</code></td>
+ <td>
+ The month as a decimal number. Jan is 01. If the result is a single digit,
+ it is prefixed with 0. The modified command <code>%Om</code> produces the
+ locale's alternative representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'M'</code></td>
+ <td>
+ The minute as a decimal number. If the result is a single digit, it
+ is prefixed with 0. The modified command <code>%OM</code> produces the
+ locale's alternative representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'n'</code></td>
+ <td>A new-line character.</td>
+</tr>
+<tr>
+ <td><code>'p'</code></td>
+ <td>The AM/PM designations associated with a 12-hour clock.</td>
+</tr>
+<tr>
+ <td><code>'q'</code></td>
+ <td>The duration's unit suffix.</td>
+</tr>
+<tr>
+ <td><code>'Q'</code></td>
+ <td>
+ The duration's numeric value (as if extracted via <code>.count()</code>).
+ </td>
+</tr>
+<tr>
+ <td><code>'r'</code></td>
+ <td>The 12-hour clock time, e.g. "10:04:00 PM".</td>
+</tr>
+<tr>
+ <td><code>'R'</code></td>
+ <td>Equivalent to <code>%H:%M</code>, e.g. "22:04".</td>
+</tr>
+<tr>
+ <td><code>'S'</code></td>
+ <td>
+ Seconds as a decimal number. If the number of seconds is less than 10, the
+ result is prefixed with 0. If the precision of the input cannot be exactly
+ represented with seconds, then the format is a decimal floating-point number
+ with a fixed format and a precision matching that of the precision of the
+ input (or to a microseconds precision if the conversion to floating-point
+ decimal seconds cannot be made within 18 fractional digits). The modified
+ command <code>%OS</code> produces the locale's alternative representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'t'</code></td>
+ <td>A horizontal-tab character.</td>
+</tr>
+<tr>
+ <td><code>'T'</code></td>
+ <td>Equivalent to <code>%H:%M:%S</code>.</td>
+</tr>
+<tr>
+ <td><code>'u'</code></td>
+ <td>
+ The ISO weekday as a decimal number (1-7), where Monday is 1. The modified
+ command <code>%Ou</code> produces the locale's alternative representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'U'</code></td>
+ <td>
+ The week number of the year as a decimal number. The first Sunday of the
+ year is the first day of week 01. Days of the same year prior to that are
+ in week 00. If the result is a single digit, it is prefixed with 0.
+ The modified command <code>%OU</code> produces the locale's alternative
+ representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'V'</code></td>
+ <td>
+ The ISO week-based week number as a decimal number. If the result is a
+ single digit, it is prefixed with 0. The modified command <code>%OV</code>
+ produces the locale's alternative representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'w'</code></td>
+ <td>
+ The weekday as a decimal number (0-6), where Sunday is 0. The modified
+ command <code>%Ow</code> produces the locale's alternative representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'W'</code></td>
+ <td>
+ The week number of the year as a decimal number. The first Monday of the
+ year is the first day of week 01. Days of the same year prior to that are
+ in week 00. If the result is a single digit, it is prefixed with 0.
+ The modified command <code>%OW</code> produces the locale's alternative
+ representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'x'</code></td>
+ <td>
+ The date representation, e.g. "11/12/55". The modified command
+ <code>%Ex</code> produces the locale's alternate date representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'X'</code></td>
+ <td>
+ The time representation, e.g. "10:04:00". The modified command
+ <code>%EX</code> produces the locale's alternate time representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'y'</code></td>
+ <td>
+ The last two decimal digits of the year. If the result is a single digit
+ it is prefixed by 0. The modified command <code>%Oy</code> produces the
+ locale's alternative representation. The modified command <code>%Ey</code>
+ produces the locale's alternative representation of offset from
+ <code>%EC</code> (year only).
+ </td>
+</tr>
+<tr>
+ <td><code>'Y'</code></td>
+ <td>
+ The year as a decimal number. If the result is less than four digits it is
+ left-padded with 0 to four digits. The modified command <code>%EY</code>
+ produces the locale's alternative full year representation.
+ </td>
+</tr>
+<tr>
+ <td><code>'z'</code></td>
+ <td>
+ The offset from UTC in the ISO 8601:2004 format. For example -0430 refers
+ to 4 hours 30 minutes behind UTC. If the offset is zero, +0000 is used.
+ The modified commands <code>%Ez</code> and <code>%Oz</code> insert a
+ <code>:</code> between the hours and minutes: -04:30. If the offset
+ information is not available, an exception of type
+ <code>format_error</code> is thrown.
+ </td>
+</tr>
+<tr>
+ <td><code>'Z'</code></td>
+ <td>
+ The time zone abbreviation. If the time zone abbreviation is not available,
+ an exception of type <code>format_error</code> is thrown.
+ </td>
+</tr>
+<tr>
+ <td><code>'%'</code></td>
+ <td>A % character.</td>
+</tr>
+</table>
+
+Specifiers that have a calendaric component such as `'d'` (the day of month)
+are valid only for `std::tm` and time points but not durations.
+
+The available padding modifiers (*padding_modifier*) are:
+
+| Type | Meaning |
+|-------|-----------------------------------------|
+| `'_'` | Pad a numeric result with spaces. |
+| `'-'` | Do not pad a numeric result string. |
+| `'0'` | Pad a numeric result string with zeros. |
+
+These modifiers are only supported for the `'H'`, `'I'`, `'M'`, `'S'`, `'U'`,
+`'V'`, `'W'`, `'Y'`, `'d'`, `'j'` and `'m'` presentation types.
+
+## Range Format Specifications
+
+Format specifications for range types have the following syntax:
+
+<pre><code class="language-json"
+>range_format_spec ::= ["n"][range_type][range_underlying_spec]</code>
+</pre>
+
+The `'n'` option formats the range without the opening and closing brackets.
+
+The available presentation types for `range_type` are:
+
+| Type | Meaning |
+|--------|------------------------------------------------------------|
+| none | Default format. |
+| `'s'` | String format. The range is formatted as a string. |
+| `'?⁠s'` | Debug format. The range is formatted as an escaped string. |
+
+If `range_type` is `'s'` or `'?s'`, the range element type must be a character
+type. The `'n'` option and `range_underlying_spec` are mutually exclusive with
+`'s'` and `'?s'`.
+
+The `range_underlying_spec` is parsed based on the formatter of the range's
+element type.
+
+By default, a range of characters or strings is printed escaped and quoted.
+But if any `range_underlying_spec` is provided (even if it is empty), then the
+characters or strings are printed according to the provided specification.
+
+Examples:
+
+```c++
+fmt::print("{}", std::vector{10, 20, 30});
+// Output: [10, 20, 30]
+fmt::print("{::#x}", std::vector{10, 20, 30});
+// Output: [0xa, 0x14, 0x1e]
+fmt::print("{}", std::vector{'h', 'e', 'l', 'l', 'o'});
+// Output: ['h', 'e', 'l', 'l', 'o']
+fmt::print("{:n}", std::vector{'h', 'e', 'l', 'l', 'o'});
+// Output: 'h', 'e', 'l', 'l', 'o'
+fmt::print("{:s}", std::vector{'h', 'e', 'l', 'l', 'o'});
+// Output: "hello"
+fmt::print("{:?s}", std::vector{'h', 'e', 'l', 'l', 'o', '\n'});
+// Output: "hello\n"
+fmt::print("{::}", std::vector{'h', 'e', 'l', 'l', 'o'});
+// Output: [h, e, l, l, o]
+fmt::print("{::d}", std::vector{'h', 'e', 'l', 'l', 'o'});
+// Output: [104, 101, 108, 108, 111]
+```
+
+## Format Examples
+
+This section contains examples of the format syntax and comparison with
+the printf formatting.
+
+In most of the cases the syntax is similar to the printf formatting,
+with the addition of the `{}` and with `:` used instead of `%`. For
+example, `"%03.2f"` can be translated to `"{:03.2f}"`.
+
+The new format syntax also supports new and different options, shown in
+the following examples.
+
+Accessing arguments by position:
+
+```c++
+fmt::format("{0}, {1}, {2}", 'a', 'b', 'c');
+// Result: "a, b, c"
+fmt::format("{}, {}, {}", 'a', 'b', 'c');
+// Result: "a, b, c"
+fmt::format("{2}, {1}, {0}", 'a', 'b', 'c');
+// Result: "c, b, a"
+fmt::format("{0}{1}{0}", "abra", "cad"); // arguments' indices can be repeated
+// Result: "abracadabra"
+```
+
+Aligning the text and specifying a width:
+
+```c++
+fmt::format("{:<30}", "left aligned");
+// Result: "left aligned "
+fmt::format("{:>30}", "right aligned");
+// Result: " right aligned"
+fmt::format("{:^30}", "centered");
+// Result: " centered "
+fmt::format("{:*^30}", "centered"); // use '*' as a fill char
+// Result: "***********centered***********"
+```
+
+Dynamic width:
+
+```c++
+fmt::format("{:<{}}", "left aligned", 30);
+// Result: "left aligned "
+```
+
+Dynamic precision:
+
+```c++
+fmt::format("{:.{}f}", 3.14, 1);
+// Result: "3.1"
+```
+
+Replacing `%+f`, `%-f`, and `% f` and specifying a sign:
+
+```c++
+fmt::format("{:+f}; {:+f}", 3.14, -3.14); // show it always
+// Result: "+3.140000; -3.140000"
+fmt::format("{: f}; {: f}", 3.14, -3.14); // show a space for positive numbers
+// Result: " 3.140000; -3.140000"
+fmt::format("{:-f}; {:-f}", 3.14, -3.14); // show only the minus -- same as '{:f}; {:f}'
+// Result: "3.140000; -3.140000"
+```
+
+Replacing `%x` and `%o` and converting the value to different bases:
+
+```c++
+fmt::format("int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42);
+// Result: "int: 42; hex: 2a; oct: 52; bin: 101010"
+// with 0x or 0 or 0b as prefix:
+fmt::format("int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}", 42);
+// Result: "int: 42; hex: 0x2a; oct: 052; bin: 0b101010"
+```
+
+Padded hex byte with prefix and always prints both hex characters:
+
+```c++
+fmt::format("{:#04x}", 0);
+// Result: "0x00"
+```
+
+Box drawing using Unicode fill:
+
+```c++
+fmt::print(
+ "┌{0:─^{2}}┐\n"
+ "│{1: ^{2}}│\n"
+ "└{0:─^{2}}┘\n", "", "Hello, world!", 20);
+```
+
+prints:
+
+```
+┌────────────────────┐
+│ Hello, world! │
+└────────────────────┘
+```
+
+Using type-specific formatting:
+
+```c++
+#include <fmt/chrono.h>
+
+auto t = tm();
+t.tm_year = 2010 - 1900;
+t.tm_mon = 7;
+t.tm_mday = 4;
+t.tm_hour = 12;
+t.tm_min = 15;
+t.tm_sec = 58;
+fmt::print("{:%Y-%m-%d %H:%M:%S}", t);
+// Prints: 2010-08-04 12:15:58
+```
+
+Using the comma as a thousands separator:
+
+```c++
+#include <fmt/format.h>
+
+auto s = fmt::format(std::locale("en_US.UTF-8"), "{:L}", 1234567890);
+// s == "1,234,567,890"
+```