3b70966df5b Add width and alignment support to error_code
05226c4bd9e Remove type_identity
c283b458a51 Cleanup format.h
fe79932c267 Fix conversion warning on chrono.h (#4170)
23fcf1942a6 Apply clang-format
3f296e3d4ad Workaround clang-format nonsense
a197a994c5a Add member format_as for std
6d43c755bc2 Fix a typo
1f87b1c58d2 Use fmt::formatter specialization for std::reference_wrapper to avoid undefined behavior (#4164)
ed8f8be70d8 More chrono padding (#4161)
55a0a9cd627 Cleanup pragma detection
5c926d9ff9a Remove FMT_UNCHECKED_ITERATOR
8b024662d4a Remove unnecessary inheritance
2f1424be90b Simplify handling of arrays
239aa6911bf Remove unwrap_named_arg
497df6db618 Remove formattable
a25e594f6ac Remove range_mapper
503dff93ecc Simplify has_formatter
3374a95b50b Simplify has_formatter
0e62e5dc7cd Simplify has_formatter
7ce013971bc Sync value ctors and type mapper
07e70151d57 format std::reference_wrapper
41977277125 Improve handling of unformattable args
527e98e3f87 Remove unformattable
8a19b2db779 arg_mapper -> type_mapper
e97df46ae1b Cleanup type mapping
39f1e0903ad Remove FMT_MAP_API
d832830f60b Cleanup type mapping
b329ff194ff Always detect encoding on Windows
2af403ce641 Simplify type mapping
b7513b1d002 Simplify type mapping
761d35f7632 Cleanup format_as handling
545dc4148a4 Add value ctor taking name_arg
3f5e45dd338 Simplify handling of _BitInt
2e3b6fbd9fe Remove redundant check
a0328e1f9fd Improve error reporting
de28ef5f867 Remove make_arg
2d5e561a6b2 Cleanup argument handling
6537fb439cb Update changelog
50aac2ac92c Add reference to iterator_traits
538d8777e56 Workaround a bug in libstdc++
0335312320e Demacrify UTF-8 check
463fe65f173 Cleanup FMT_COMPILE_STRING
1782a6eac0f Rename pragma macros
b52fb988463 Fix no locale build
b6a6ec7f1cb FMT_EXCEPTIONS -> FMT_USE_EXCEPTIONS
89999f16722 Simplify pragma
b90b4bc981e Remove FMT_STATIC_THOUSANDS_SEPARATOR in favor of FMT_USE_LOCALE
a1d6f9a9736 Minor cleanup
689ec7a087c Cleanup
28143dc99d3 Cleanup chrono
1bde49e545e Remove FMT_USE_USER_LITERALS
f924d16e478 fix: pass /utf-8 only if the compiler is MSVC at build time
ab8f9d5b080 Cleanup format API
6f62db098a3 Cleanup format API
ab44ee7521f Avoid shadowing
0d4e7e3feec Remove old workaround
8ee89546ffc Remove old workaround
a5deb96bf51 Update gcc version
61a241f03f7 Cleanup
ff82d8d2b58 Cleanup visit
0cc20f56398 Remove iterator_t
2ba6785d8fc Remove unused type
5644e7507ca Remove unnecessary forwarding
5345cfe6b32 Adjust clang-format
3e9fdb3a1fd Cleanup
3ada4aed203 Optionally exclude Unicode data
b37be85bf1e Optionally disable named arguments
70643b25111 Don't use format_error if exceptions disabled
967e2d177d6 Cleanup
02c5d637c5c Cleanup
047bf75c245 Cleanup
2d3ba32e795 Improve debug codegen
6c90b31fbd1 Improve debug codegen
9408c2ae8c2 Readd support for FMT_BUILTIN_TYPES
cc3ff1529d2 Cleanup
158893b384a Cleanup
f5a16a484bd Cleanup
cad876be4c8 Switch to vargs
debf6f82855 Switch to vargs
35f4fab4c42 Simplify value ctor
ff8f3247869 Minor cleanup
bd48715d812 Simplify make_format_args
57d6df62f7a Simplify make_format_args
8ed4a9dcc1c Improve debug codegen
f288f45e46a Prepare for arg_store unification
5bf577ca58f Backport from GoogleTest: "Work around a maybe-uninitialized warning under GCC 12" (0320f517fd)
b6de66819e1 Backport from GoogleTest: "Always initialize fields in MatcherBase constructors" (https://github.com/google/googletest/pull/3797)
6870e4b06bb Workaround for GCC regression: false positive null-dereference in vector.resize
5cdef760349 Switch to gcc-13 for C++23 tests
a2c290bc34d Suppress a bogus MSVC warning
f1e3016c13a Optimize debug codegen
106dc8fd642 Reduce usage of type_identity
c3344e21e27 Cleanup base API
5f438c967e0 Remove make_arg
2a257798d41 Reenable FMT_BUILTIN_TYPES
22d50c1a9c2 Add support formatting std::expected<void, E>
1cc10ab68f4 Make is_formattable work with const/volatile void
6aaf7f4b79e Suppress a gcc 13 warning
b4d1d7f8e67 Improve debug codegen
1e0771c70a5 Fix broken CI for shared library on macos and linux (#4151)
3df47a46771 Make is_formattable work with void
b4aea98b550 Small fixes for some issues with modules builds (#4152)
565461a0d3a Update MSVC workaround in compile-test
e2b72387078 Cleanup format string API
1e0c6cdc3ba Make symbol sizes shorter
a8bcf81f72f Minor cleanup
15694c9a84f Workaround an MSVC bug
4cae2da0d06 Workaround a clang 17 bug
79e5ae919c3 Fix locale tests on FreeBSD
894b71da853 Fix handling of _BitInt
7a6a2a79ed8 Improve debug codegen
387395fc7c6 Cleanup base API
6a88415499d Add FMT_APPLY_VARIADIC
9a2aae37d45 Cleanup base API
88037683630 Cleanup base API
4fa533c70e7 Cleanup base API
d980dd71713 Cleanup base API
4eed488c663 Cleanup base API
a6ecd25b808 Improve debug codegen
9f29345ea09 Simplify mapped_type_constant
4986b4c0efd Simplify arg_mapper
a5f4d9820ca Simplify arg_mapper
bc3af512720 Reduce the number of instantiations
60740b7c240 Cleanup base API
9ef160d3094 Cleanup base API
0b80978c271 Cleanup base API
4f39d886503 Cleanup base API
a86b1acf6af Add mapped_t
c9ef07bc4e0 Minor cleanup
8c4cfab57ad Detemplatize parse
7e3aa6d9821 Minor cleanup
7c66216008b Minor cleanup
1416edabbb0 Cleanup base API
d4aeca9922d Bump actions/upload-artifact from 4.3.3 to 4.4.0 (#4141)
eee93ddffa8 Bump github/codeql-action from 3.25.11 to 3.26.6 (#4142)
b310a0d48bc Simplify parse_format_string
985c3399d13 Make map static
4a55b0d5fdf Remove duplicate error in compile-time checks
64a6c845928 basic_format_parse_context -> parse_context
66920feeee6 Improve compile-time checks
f4dad85c3aa Improve handling of named arguments in compile-time checks
db4becabedb Reduce template instantiations
fec2cc7af10 Improve handling of named arguments
621e9c17c58 Clarify why we have TYPE in native_formatter
bca70405569 Simplify compile-time checks
8c4b17fe648 Simplify compile-time checks
516a2e20492 Cleanup FMT_STRING
6797f0c39a4 Cleanup compile-time checks
db496b47c1c Remove old gcc hack
8eda3c8e900 Cleanup compile-time check
53316903e64 Move string_literal to format.h
8a484ad5771 Minor cleanup
b446cc9e67c fwrite_fully -> fwrite_all
0204dd359d9 Fix _BitInt formatter
d8876b7787c Minor cleanup
c0fab5e2f7c Reject modernity, embrace tradition
64313e915c4 Move redundant initialization to compile time
8e3da9da2c7 Improve binary size
2a2f73f7c19 Improve binary size
6dd9194abd5 Simplify format_to_result
a017bba0624 Minor cleanup
5eb023cd568 Improve binary size
f213d83306a Disable locale more
b3ccc2d2100 Disable locale more
7477dda28dd Simplify is_utf8_enabled
e582d377c25 Simplify locale handling
cd8d01d8cd9 Minor cleanup
377cf203e34 Add opt out for built-in types
5a0a37340c0 Add support for _BitInt on clang (#4072)
bbf8b3bd017 insert else branch to avoid unreachable code warning (#4130)
a3f3f2ec9a2 Fix gcc 8.1 - 8.3 bug and compilation (#4131)
e3676ca309f Change std::copy to detail::copy in chrono to fix MSVC compile errors (#4132)
0379bf3a5d5 Workaround -Wstringop-overflow
c59ee969f3d Improve compile-time formatting (#4127)
1a79bbfa83b Cleanup chrono formatting
89af1ad77df Cleanup chrono formatting
0e741e0daa5 Minor cleanup
d1acc667c1b Minor cleanup
4fb7008c900 Cleanup duration cast
589898e28bb Fix %S doc
62382e3650b Test full exponent range
94b8bc8eae1 Add an experimental writer API
020af729ddf Simplify ostream
fb07b37c5b1 Prioritize using the header files of self (#4116)
3135421257e Minor cleanup
993f56cff6f Make sign a proper enum class
c6c830e2034 Make align a proper enum class
b906c321f06 Get rid of bit fields
f8c0c8ee783 Cleanup public API
c71d03fcb0d Make `support/python/mkdocstrings_handlers/cxx/__init__.py` PEP 8 compliant (2 of 2) (#4115)
50a8c3e9bfa Reduce format specs size
98314319ad7 Fix ambiguous overload
0ce49aeb4a5 Add a test case
bf870ae3d15 Fix back_inserter lookup for non-std containers
c98518351ef Make `support/python/mkdocstrings_handlers/cxx/__init__.py` PEP 8 compliant (1 of 2) (#4110)
9f0c0c468be Add 'n' specifier for tuple and pair (#4107)
9f269062a7b Simplify default formatter
15f939c3de4 Improve handling of dynamic specs
928a07bb045 Simplify handling of dynamic specs
7891699737d Simplify handling of dynamic specs
58aba5a3def Deprecate append instantiation
5ee14d35087 Reintroduce constexpr fmt::formatted_size for C++20 (#4103)
b9c0e4dd828 Improve spec parsing
8445327c84d Simplify spec handling
8a06cee8262 Optimize shortest float formatting
1db22749667 Use us if Unicode is disabled
34ead4b39e4 Bump msys2/setup-msys2 from 2.23.0 to 2.24.0 (#4098)
3bf26009e4d Bump ossf/scorecard-action from 2.3.3 to 2.4.0 (#4099)
d326c7298ac Fix conversion a surrogate pair (#4095)
6e462b89aa2 Get rid of std::copy
aff640c32f9 Make fmt::appender implement std::output_iterator concept (#4093)
e23fb6a8b48 Apply clang-format
16b3542f7ea Remove float_specs
29d7e580598 Remove float_format
919f7c5e7fc Reduce float_specs usage
a80d668a52a Diagnose invalid precision
707d7d923a1 Apply coding conventions
de6ed8df8b2 Test alignment
ffdc3fdbd90 Align digits table
0c028137917 Fix doc build
f8581bcecf3 Add redirect page
31b3c325f69 Mark namespace scope constexpr variable 'buffer_size' inline. (#4084)
52b32081f95 Wrap private module fragment content within conditional extern "C++", to match declarations. (#4083)
0b0b09f4017 Constrain format_uint
4173a6315a8 Improve format_decimal
4239dfe081e Simplify format_decimal
ba36a04811c Remove counting_iterator
f6b4a23b83b Unbloat chrono
42d3d703b58 Remove the commenting attempt
9fcd9c4c120 Remove all warning suppressions
7f157dca0a7 Workaround gcc stringop-overflow bug
524ca1c7154 Improve parsing
bdc45eef76c Simplify on_text
439b6d7212d Reenable print optimization
3cc32fdc8b0 Mark more formatters nonlocking
0c9fce2ffef Update version
b47d662e716 Update changelog
e84297f255d Bump version
0ad234ad131 Update changelog
de684ef776c Make appender compatible with fill
447c6cbf444 Update changelog
bc8d32e9643 Update changelog
0f87d6ffa69 Improve sign processing
808ea0191a6 Cleanup test
55e76e6c20e Update check-commits script
8757f1f8d62 Add a script to test multiple commits
9228f349a51 Inline visit
e10643add21 Add a perf-sanity test
f29a7e79703 Don't use memcpy in append
f97deb0d7de Minor cleanup
3541353512a Apply minor optimization
5ef93a9f805 Expand FMT_FORMAT_AS to include implicit conversions (#4055)
c9102619da7 Avoid extra reserve
58d792b6d33 Apply minor optimizations
25adca5666a Remove redundant overload
1408f1824d6 Simplify iterator detection
3fe4641d3a3 Add 2 more constexprs to fix compile error (#4065)
33e7ed1eb5b Improve handling of back_insert_iterator that writes into a buffer
6a192f8d34c Fix broken links in README.md (#4066)
92cdbbae06f Update api.md
13038f37e87 Support printing (const) volatile void* (#4056)
67252257504 Update changelog
e60ff504ea0 Fix usage with std::generator (#4057)
ccea338070c Update lint.yml
92227c77a4e Improve support for non-POSIX platforms more
486838f26fd Improve support for non-POSIX platforms
a43391199f7 Update changelog
7a8b54a0ef7 Don't confuse Glib::ustring with std::string
b50e685db99 Update version
e314776c2ea Fix version check
2208143accf Update changelog
a96259701e1 Improve std::complex formatter (#4050)
232c6bc4815 Update changelog
503e183b9e3 Bump version and add version validation
e50c8b6bd87 Fix disabling Unicode support
9d946a2fc42 Fix compilation errors due to `make_format_args` in gcc 14.1.1 with c++20 (#4042)
c4f6fa71357 fix: Make basic_format_arg::visit() const (#4043)
10f12fd3d27 Bump github/codeql-action from 3.25.3 to 3.25.11 (#4041)
24c1f886afc Remove double has_value check (#4040)
0041a40c135 Update version
686339f7c12 Minor cleanup
e355c116f94 Tweak wording in the changelog
707bb5b369b Fix grammar
6f68c62cb5d Ignore doxygen files
d059fe42a87 Ignore vagrant files
43c5b34749d Fix package build
e89568e6cba Update vagrant config
f5bf6f77812 Update build script
bd9af9a9f14 Update changelog
16521089054 Fix typo
84f61318259 Fix formatting of release notes
dedc17c1c95 Fix handling of tables, take 3
5d0adb6d74d Fix handling of tables, take 2
3f251fc9c98 Fix handling of tables
1930ed4bfac Fix release script
26d07e49b22 Fix formatting
949d5d17955 Fix build script
53186535d58 Bump version
602e3c3d11c Update build script
2952130cbcb Fix doc build
1e94a463edc Create build dir
a34120329a3 Update doc script
0fae326c42e Update site dir
8b1fcf5cc10 Update doc dir
ec46c3de972 Update build script
2d9d32c62b1 Update build script
4703ade76dc Update build script
52e7b25f953 Update changelog
b61c8c3d23b Change actions/github-script from e69ef54 -> 60a0d83 (#4038)
bbf44cc0005 Defines are still needed for FMT_MODULE as well (#4027)
06948fa710a Pin deps
d9899492c14 Simplify deps
ff72f553e3c Update changelog
7f951f25020 Optimize range formatter
7ae102bd664 make format_int constexpr (#4032)
edde9731260 Update test names
b1efe8516e2 Prevent silent data loss
2c0d9e9409f Add a define to force the use of fallback_file
18a9676d958 Add an experimental path
af8cd4e4042 Module purview can only contain direct preprocessor code (#4029)
514b6955d22 Suppress a bogus warning in MSVC (#4023)
ac967732305 Added missing std::declval for non-default-constructible types (#4024)
c00149f5e29 Fix a typo
71244e07deb Cleanup includes
a57b0194a60 Correct comments
febd8ed5fee Cleanup includes
0434026a954 Remove build-docs.py
0882bfef2a2 Don't deploy docs from a PR
2a2048a7855 Don't pass seconds as a double in examples
ea1187f4c8f Generate doxyxml in build
1334eedaf52 Improve docs
709169a4d8d Set the anchors
2bf1b3004ef Update changelog
8687315e86e Guard more system headers by `FMT_MODULE` (#4006)
98dd673cf82 Cleanup cmake
a245a8d4b9f Update changelog
e0b66e8f83b Remove dependency on <ranges>
794df69c8c5 Added range_format::(debug_)string formatter (#3973)
1d9df9ce1cd Remove a redundant comment
c4ea903250e Only install `FILE_SET` when needed (#4013)
3e3062c13ba Update msys2/setup-msys2 to v2.23.0 (#4012)
b998b471160 Update changelog
bff1de15e74 Fix deploy docs (#4010)
90932dd20d8 Update doc.yml
232c5e8547a Update doc.yml
26cdd1cb309 Update doc.yml
ad34d4df95f Update doc.yml
f796264449d Fix doc workflow
28673d96999 Update api.md
a5c1b5d4407 Update changelog
cc4d1245b86 README.md: update to remove "not yet release" remarks on clang-tidy
18a325f370f Disable footer
a1337aa8aad Merge literal-based API doc into the parent section
51a690ab153 Check if `.cc` exists in `fmt.cc` (#4005)
f332a81b722 Remove unnecessary build step
33a1de57af3 Deploy docs, take 3
c7252b33447 Deploy docs, take 2
3f71b606680 Deploy docs
215ce4d9795 Fix error getting config 'user.email'
89f3a810ec9 Fix error getting config 'user.name'
1f170d3fe01 Install mike
d175db8f5b5 Fix doc CI and clean workflows
a8cfc0cc2c7 Deploy dev docs
65e278b2867 Don't pollute the source directory
3620c174a61 Fix doc build
702b6f3788c Update docs
ed21034a10d Implement deployment
76d57f93db3 Remove old script
6ceef04dfe9 Merge branch 'master' of github.com:fmtlib/fmt
ab6b257a390 Implement doc building
077e4ae746c Added generator expression to /utf-8 compile option (#3995)
d4a8d26c557 Temporarily disable doc build in CI
b5c8fd783ce Fix doc build
735a613821b Build docs
a6e6e9c3c9a Fix a link
e6d4f927cc7 Improve docs
8de3e87da1f Add a CMake option to control Unicode support
46d2acb3ba3 Don't add `os.cc` to sources with FMT_MODULE (#4004)
fad0222a0c8 Export `compiled_string` so that user can customize one (#3999)
d1cab6a9aee Drop parentheses
fcb6a452d6e Improve docs
72928661edd Improve docs
d6ec6b7e273 Update docs
e845fc572e9 Ignore old changelog
2bf811b1d96 Also allow compiled format for clang >= 12 (#4001)
9653eed8e71 Don't hide the navbar
9b5d1826d42 Update changelog
fe741daaab9 Mention namespace `fmt::literals` in the document (#4002)
0f6e7165489 Fix missing includes in fmt.cc (#3994)
a3d95971be0 Update changelog
7bd11b5cdfd Remove a redundant extension to reduce divergence from std::format
21372bc0b2c Update cmake config
a0495e3eb5a Update changelog
cba5e8615a0 Update changelog
e9609dec1a4 Update changelog
6ebbaf4b4d1 Split changelog
4e31d2dc61d Update changelog
fcc0b499781 Fix `FMT_INSTALL` with `FMT_MODULE` (#3998)
0560c334fb2 Fix build with `FMT_MODULE=OFF` (#3997)
db9365a11b0 Update lint.yml
5c445bc42cb Reverting check to make shorter branch comes first
94f96d112db Fix undefined reference when compiling with FMT_STATIC_THOUSANDS_SEPARATOR and chrono.h
6abc1204f3c Check if the generator is ninja
a9b85176385 Use native c++ module support from CMake
fba06f0ee12 Update changelog
598e5180857 Remove redundant tests
0a555818d7b Usage -> Get Started
966a1b3d441 Update docs
adb8e27db0a Fix rendering of template parameters
2c84fa9ac9c Update docs
8da0240dbc4 Improve docs
83bf1423780 Update changelog
595e54919b5 Cleanup docs
c636967c5ca Improve docs
2392367efc3 Set primary color
06f8e02fb3a Remove rtd compat
c71d08fc225 github: update lint.yml to post details on formatting issue (#3988)
d9b90029bf7 Update docs
c0029b9847b Update docs
1ac9b317f2e New landing page
f68dee5351d Fix syntax highlighting
fb9ee2ed657 Simplify doxygen config
d29ceaf9155 Update .gitignore
9b12491c190 Migrate docs
ab29ef37d9b Migrate docs and cleanup
97117cbb51c Migrate to mkdocs
886237ae7b2 Emit anchors
904f2a5c207 Remove a non-pinned dependency
dab1a65d2c3 Sort out directory URI config
509d0181016 Fix a link
75ab3bc2a09 Add a script to invoke mkdocs
871538d3abc Fix install dir
250456d5a3a Migrate to mkdocs
38ba3d3993a Migrate to mkdocs
07141139742 Add macro support to api doc extraction
dd3b3f937b4 Merge branch 'master' of github.com:fmtlib/fmt
03d14c3beb4 Add support for multiple namespaces
416ac0fc7b6 Bump actions/checkout from 4.1.0 to 4.1.6 (#3986)
596add89930 Bump ossf/scorecard-action from 2.3.1 to 2.3.3 (#3984)
a10e0321488 Improve docs
febeb51bde0 Documentation improvements
f18c2b65c46 Fix rendering of aliases
e3910b8a9cd Improve apidoc rendering
34b85678f9a Render members
e5c07c8356f Improve apidoc formatting
933d8ba3527 Improve apidoc formatting
e7ba467e9b1 Improve apidoc formatting
91a859ee4a2 Switch to markdown
6180442ed8c Render template parameters
418c5d09494 Render template params
aafdde7ef8e Switch to JavaScript syntax highlighter
d2ecfcfc450 Fix rendering on github
26b249435ee Improve doc presentation
4f330567e16 Improve apidoc generation
19927462497 Convert API doc to Markdown
a4d42c44f40 Cleanup comments
ddd8a54230e Add mkdocs config
fcd3e1e19c8 is_convertible_v -> is_convertible::value (#3983)
dc401b1c285 Move handlers outside of the docs
f7c5588c46d Cleanup syntax doc
a4e40677af5 Fix markdown
3479828e1d2 Fix markdown
191b0cb486a Fix markdown
e80f4a9b724 Cleanup syntax doc
022d8efec96 Update doc.yml
ca8eeb09eed Add glibc ext for day of month and week of year (#3976)
cddb41f6332 Fix markdown
0b0a05770fa Remove old contents
caa97da1f5c Add a word joiner to prevent line break
cf9833f40b7 Cleanup apidoc comments
b6638f9c297 Convert usage to Markdown
d9034601378 Fix markdown
ba2fbf6e1f3 Fix markdown
6e49bb887ad Remove CSS
e0f3e85076b Fix markdown
4fc3fce9cbf Improve syntax markdown
d6427ae7b21 Improve syntax markdown
3d6869065b6 Improve syntax markdown
551aa8d510c Add CSS
9e07045f500 Fix links
5735048b2da Improve mkdocstrings handler
33eba1049db Minor comment fix
43ab964c47b MSVC 17.10.0 + modules cannot find definition (#3972)
728f9bc388b Added std::type_info formatter (#3978)
e721046e274 Convert index to Markdown
552842c4ffd Convert syntax to Markdown
2c38766fd56 Add a mkdocsstrings handler
c8f1b4e7442 ci: Remove macos-11 runners, add macos-14 (#3980)
529dcd11feb Fix workflow, take 2
1441c660bfe Fix workflow
ecd1559732f Improve styles
a57a63dc0f7 Fix styles
8691f21b457 Fix styles
7e4fac3f4fe Improve styles
4a368625e88 Replace less with sass
f4e1ec81e25 Cleanup html
89c0d101055 Update description
12ef9e09d1d Fix class conflict
5afa6813883 Remove redundant github button
cc13102031e Fix navbar style
8ee6c940147 Reintroduce GCC-11 C++20 into CI (#3979)
766300b3c6f Update html
4115219ede7 Fix CSS path
95076981f78 Update documentation deps
1752d7fbbbe Added formattable concept (#3974)
1768bf97140 Added FMT_EXPORT for fmt::range_format and fmt::range_format_kind (#3970)
fc723fd6c70 Fix regression in #3710 (#3968)
b81761068b5 Check range_begin is dereferenceable (#3964)
706eabd5e58 Resolved warning C4127: conditional expression is constant (#3967)
028bffa0830 Update checks for dynamic_cast usage when compiled with no rtti (#3963)
86741b3e1cf Bazel support: Add missing platform dependency (#3965)
75e892420ed Minor cleanup
0b5287f8b7d Remove unused function
a4715c48b42 Bazel support: Add utf-8 to Windows build (#3962)
8e728044f67 Fix format_as for non-const begin/end views (#3955)
1f436c646ed Cleanup locking/buffering
db1ee420e09 Cleanup unicode check more
7d6ae972b98 Cleanup unicode checks
3460b30fd5c Improve utf-8 detection
b7809f91e2c Enable Unicode support by default
1dc71f21ead Enable Unicode by default
8db8f224902 Optimize join_view
d2473b7b73c Simplify join_view formatter
328d256c605 Apply coding conventions
57593a123be Simplify map formatter
10508a30ecd Enable fmt::join for uncopyable iterators (#3946)
16cec4f5913 Make the map formatter correctly handle elements with custom formatters
77bfd8499af Split range and map formatters
3af8ac7a068 Privatize write_debug_string
ceb406d06c7 Remove range_default_formatter
19afc9c3bb1 Update README.md
6ff593b027b Update README.md
78420bedddb Update README.md
a21bc7b8694 Update doc.yml
97d0613ba99 Update doc.yml
04b0ae418b6 Update doc.yml
27dd1dcf082 Update lint.yml
3649c3954fd Update lint.yml
7650ed04a3d Fix to_nonnegative_int
9234fe83f94 Add tests to check that isnan doesn't cause FP errors
8a8f4825a3e Fix: isnan() shouldn't cause FP exceptions
17062a0c9b4 Bump actions/upload-artifact from 4.3.1 to 4.3.3 (#3950)
88d3997f5e3 Bump github/codeql-action from 3.24.9 to 3.25.3 (#3949)
48c908453d8 Fix CodeQL alert (#3945)
cf1f55f7985 Specialize `formatter` for all `std::basic_string` types (#3943)
400f6a8ee28 Dedup ADL begin/end lookup
a3e0931ea22 Update signature in the doc
51eeccd0fbf const void* is neither a fundamental nor string type
f30f1fd5141 Document formatter specializations provided by base.h
f4b256c6676 Fix warning C26439
f746a59a5c4 Cleanup FMT_ASSERT
ee0c3351a4d Fix format_to + FMT_STRING for wide character type (#3931)
99735764ea7 Fix FMT_USE_NONTYPE_TEMPLATE_ARGS define back (#3937)
aa52eb765de Resolved warning C4996: 'fileno': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _fileno. (#3930)
116a9ce4880 Added FMT_IMPORT_STD feature macro (#3928)
5eb68c0ef25 Fix mix-up of 'FMT_BEGIN_EXPORT' and 'namespace detail'. (#3924)
550437b29ec Resolved warning C4127: conditional expression is constant (#3923)
4e8640ed90a Fix: enable `FMT_NORETURN` without exception support too (#3917)
c70e7b74737 Coding conventions and minor fixes
71144eeaff2 implement year_month_day (#3913)
843e2935641 Bump github/codeql-action from 3.24.6 to 3.24.9 (#3915)
f5ec5ada2bc Update syntax.rst
3b5f3de3b57 Make CMake version message less confusing (#3907)
ca9193983bd Replace std::fill_n with fmt::detail::fill_n (#3909)
74a187288bb Implemented fmt::day, fmt::month, fmt::year and related unit tests (#3906)
88620e53a4f Range formatting documentation (#3905)
5d63e87d235 Add a formatter for float128
aecec01b34a Initial support for extended FP types
5af88653eb9 Cleanup
45b772f85c0 Improve std::complex formatter to be compatible with P2197R0 (#3900)
53347891cf6 Make line buffering test less flaky
38881e5acfb Fix handling of the fileno macro
6c7cc6a06fe Fix group_digits for negative integers (#3901)
365c3fbd258 Bump timeout
c0dac839828 Use p2197 format for complex by default
bb882c03bc1 Simplify path formatting
12acd7988b5 Fix ambiguous call
c710bfa10ca Apply clang-format
73f2b344b20 Add std::complex formatter
9f3fc6e38b1 Add XChar support into nested_formatter
c17816cb4ab Fix invalid fmt::formatter<>::format return type (#3895)
df6e7b22f7f Fix relative path for cmake in usage doc (#3890)
c816fa67519 Fix a warning
e281749c5de Simplify range formatter
11f2f30f0b9 Simplify range formatter
13cfaa2ab03 Guard against usage of _isatty when header was not included (#3880)
0861db500f8 Support character range formatting (#3863)
dfe5b12c08d Update os-test.cc (#3883)
09935d82390 Bump github/codeql-action from 3.23.2 to 3.24.6 (#3876)
3bc6cc1e63a Protect against locking formatters
4fcc317dc98 Bump actions/upload-artifact from 4.3.0 to 4.3.1 (#3875)
ae1e93d34de Fix warning C4702 emitted from format.h (MSVC) (#3866)
f68f452deaa Workaround an ld warning on macOS
ebea5736a26 Fix chrono locale format bug for RHEL gcc (#3859)
ddf0b7d2b54 Fix warning C4365 emitted from printf.h (#3865)
0166f455f66 std.h c++23 build fix (#3856)
8e42eef4950 Don't error on min time_point
91b30e5b4ed More API details
7a63e233d28 Readd core.h to headers
44c3fe1ebb4 Fix handling of static separator
ae181cc93d0 C++23 compatibility: basic_string_view cannot be constructed from nullptr (#3846)
3a6fb2fcafc Fix some typos. (#3843)
0879504796d Fix typo in typename. `containter_type` -> `container_type`. (#3844)
34f415b56ea Fix %S formatting for chrono durations with leading zeroes (#3814)
e17bc67547a Make scan variadic
06311ed1ced Fix fixed rounding around zero in Dragon
e5bab8dab42 added formatter for std::expected (#3834)
9f5f39cb507 Bump actions/upload-artifact from 4.0.0 to 4.3.0 (#3837)
ea581437e57 Bump github/codeql-action from 2.22.5 to 3.23.2 (#3836)
6321a97d6bd Simplify color formatting
4b6b32f3884 Deprecate wide stream function
1b54ba4b9d9 Fix UB in format_arg_store implementation. (#3833)
71a4a8d4799 Really fix MSVC warning about <bit> only being available in C++20. (#3832)
8e62172ab67 Fix a warning
28afff363c8 Improve buffering
af44c29744e Separate buffer initialization from flush
a1e1eedbb5c Minor cleanup
ffce3632b7a Add glibc stream support
b5669512b1a Don't hang on test failure
6435b169ec7 Add support for line buffering
6f260455aa5 Add scan_data::make_args
git-subtree-dir: external/fmt
git-subtree-split: 3b70966df5b88fb9c7c6a4c620ab663723802c31
110 KiB
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_COMPATIBILITYmacro 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_clzor 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 to 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::ostringstreamandsprintfon dtoa-benchmark and faster than double-conversion and Ryū:It is possible to get even better performance at the cost of larger binary size by compiling with the
FMT_USE_FULL_CACHE_DRAGONBOXmacro set to 1.Thanks @jk-jeon.
-
Added an experimental unsynchronized file output API which, together with format string compilation, can give 5-9 times speed up compared to fprintf on common platforms (godbolt):
#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):#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/endtofmt::join(https://github.com/fmtlib/fmt/issues/1784, https://github.com/fmtlib/fmt/pull/1786). For example (godbolt):#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::appendoverload that takes a range (https://github.com/fmtlib/fmt/pull/1806). Thanks @BRevzin. -
Improved handling of single code units in
FMT_COMPILE. For example:#include <fmt/compile.h> char* f(char* buf) { return fmt::format_to(buf, FMT_COMPILE("x{}"), 42); }compiles to just (godbolt):
_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) retHere a single
movinstruction 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:
#include <fmt/core.h> struct how_about_no {}; int main() { fmt::print("{}", how_about_no()); }Error (godbolt):
fmt/core.h:1438:3: error: static_assert failed due to requirement 'fmt::v7::formattable<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 function template that allows you to write formatting functions with compile-time format string checks and avoid binary code bloat (godbolt):
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
snprintffallback with a faster internal IEEE 754floatanddoubleformatter for arbitrary precision. For example (godbolt):#include <fmt/core.h> int main() { fmt::print("{:.500}\n", 4.9406564584124654E-324); }prints
4.9406564584124654417656879286822137236505980261432476442558568250067550727020875186529983636163599237979656469544571773092665671035593979639877479601078187812630071319031140452784581716784898210368871863605699873072305000638740915356498438731247339727316961514003171538539807412623856559117102665855668676818703956031062493194527159149245532930545654440112748012970999954193198940908041656332452475714786901472678015935523861155013480352649347201937902681071074917033322268447533357208324319360923829e-324. -
Made
format_to_nandformatted_sizepart of the core API (godbolt):#include <fmt/core.h> int main() { char buffer[10]; auto result = fmt::format_to_n(buffer, sizeof(buffer), "{}", 42); } -
Added
fmt::format_to_noverload 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):#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_tooverload that taketext_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):#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):#include <fmt/core.h> int main() { fmt::print("{:#.2g}", 0.5); }prints
0.50. -
Changed the default floating point format to not include
.0for consistency withstd::formatandstd::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-34instead of1.0e-34(https://github.com/fmtlib/fmt/issues/1873, https://github.com/fmtlib/fmt/issues/1917). -
Made
fmt::to_stringfallback onostreaminsertion operator if theformatterspecialization 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.hdetection. (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
ostreaminsertion 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_INSTANTIATIONSCMake 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_NAMESPACESmacro 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_limitsfor 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_limitsfor 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.
-
Added a simpler and more efficient format string compilation API:
#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::compileAPI is now deprecated. -
Optimized integer formatting:
format_towith format string compilation and a stack-allocated buffer is now faster than to_chars on both libc++ and libstdc++. -
Optimized handling of small format strings. For example,
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-O2and 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 totalAfter (
-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 totalBefore (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 totalAfter (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 totalIt is still recommended to use
fmt/core.hinstead offmt/format.hbut 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
#include <fmt/core.h> int main() { fmt::print("The answer is {answer}\n", fmt::arg("answer", 42)); }compiles to just (godbolt)
.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):
#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)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,
clearandreservetodynamic_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 withstd::format(https://github.com/fmtlib/fmt/issues/1652). -
Replaced the
'n'format specifier with'L'for compatibility withstd::format(https://github.com/fmtlib/fmt/issues/1624). The'n'specifier can be enabled via theFMT_DEPRECATED_N_SPECIFIERmacro. -
The
'='format specifier is now disabled by default for compatibility withstd::format. It can be enabled via theFMT_DEPRECATED_NUMERIC_ALIGNmacro. -
Removed the following deprecated APIs:
FMT_STRING_ALIASandfmtmacros - replaced byFMT_STRINGfmt::basic_string_view::char_type- replaced byfmt::basic_string_view::value_typeconvert_to_intformat_arg_store::types*parse_context- replaced by*format_parse_contextFMT_DEPRECATED_INCLUDE_OSFMT_DEPRECATED_PERCENT- incompatible withstd::format*writer- replaced by compiled format API
-
Renamed the
internalnamespace todetail(https://github.com/fmtlib/fmt/issues/1538). The former is still provided as an alias if theFMT_USE_INTERNALmacro is defined. -
Improved compatibility between
fmt::printfwith 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 usecopyfmt(https://github.com/fmtlib/fmt/issues/1666). -
Added the
FMT_OSCMake 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_PRODUCTIONwith theFMT_FUZZmacro 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, @erthink, @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_viewand ostreamoperator<<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:
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
Sis 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):fmt::print("{:#.0f}", 42.0);now prints
42. -
Implemented the
'L'specifier for locale-specific numeric formatting to improve compatibility withstd::format. The'n'specifier is now deprecated and will be removed in the next major release. -
Moved OS-specific APIs such as
windows_errorfromfmt/format.htofmt/os.h. You can defineFMT_DEPRECATED_INCLUDE_OSto automatically includefmt/os.hfromfmt/format.hfor 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_identityto block unnecessary template argument deduction. Thanks Tim Song. -
Improved UTF-8 handling (https://github.com/fmtlib/fmt/issues/1109):
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):
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::joinacceptinitializer_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::durationtypes to wide output (https://github.com/fmtlib/fmt/pull/1533). Thanks @zeffy. -
Added const
beginandendoverload 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_DOUBLEandFMT_USE_LONG_DOUBLEmacros for extremely memory-constrained embedded system (https://github.com/fmtlib/fmt/pull/1590). Thanks @albaguirre. -
Made
FMT_STRINGwork withconstexprstring_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_TESTCMake 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
floatanddoubleusing the shortest decimal representation with correct rounding by default:#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 thanprintfand 10% faster than double-conversion on dtoa-benchmark:Function Time (ns) Speedup ostringstream 1,346.30 1.00x ostrstream 1,195.74 1.13x sprintf 995.08 1.35x doubleconv 99.10 13.59x fmt 88.34 15.24x -
{fmt} no longer converts
floatarguments todouble. In particular this improves the default (shortest) representation of floats and makesfmt::formatconsistent withstd::formatspecs (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):fmt::print("{}", 0.1f);prints
0.1instead of0.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):
fmt::print("{}", std::numeric_limits<__int128_t>::max());prints
170141183460469231731687303715884105727.Thanks @denizevrenci.
-
The overload of
printthat takestext_styleis 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_toverload ofvprintwas moved fromfmt/core.htofmt/format.h. -
Added an overload of
fmt::jointhat works with tuples (https://github.com/fmtlib/fmt/issues/1322, https://github.com/fmtlib/fmt/pull/1330):#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":
fmt::print("{:#o}", 0);prints
0. -
The locale is now passed to ostream insertion (
<<) operators (https://github.com/fmtlib/fmt/pull/1406):#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):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_contextfor consistency with C++20std::formatand deprecatedbasic_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 using its conda-forge package (https://github.com/fmtlib/fmt/pull/1410):
conda install -c conda-forge fmtThanks @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-overflowsanitizer (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 with an optional exception that allows distributing binary code without attribution.
-
Floating-point formatting is now locale-independent by default:
#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
nspecifier: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_GRISUmacro defined to 1:#define FMT_USE_GRISU 1 #include <fmt/format.h> auto s = fmt::format("{}", 4.2); // formats 4.2 using GrisuWith Grisu enabled, {fmt} is 13x faster than
std::ostringstream(libc++) and 10x faster thansprintfon dtoa-benchmark (full results): -
Separated formatting and parsing contexts for consistency with C++20 std::format, removing the undocumented
basic_format_context::parse_context()function. -
Added oss-fuzz support (https://github.com/fmtlib/fmt/pull/1199). Thanks @pauldreik.
-
formatterspecializations now always take precedence overoperator<<(https://github.com/fmtlib/fmt/issues/952):#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::compilefunction 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):#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):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):
auto s = fmt::format("{:.1}", std::chrono::duration<double>(1.234)); // s == 1.2sThanks @DanielaE.
-
Implemented
chronoformat specifiers%Qand%qthat give the value and the unit respectively (https://github.com/fmtlib/fmt/pull/1019):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:
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. Usefmt/chrono.hinstead. -
Added
fmt::formatandfmt::vformatoverloads that taketext_style(https://github.com/fmtlib/fmt/issues/993, https://github.com/fmtlib/fmt/pull/994):#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, namelyprintoverloads that taketext_styleinstead. -
Made
std::unique_ptrandstd::shared_ptrformattable as pointers viafmt::ptr(https://github.com/fmtlib/fmt/pull/1121):std::unique_ptr<int> p = ...; fmt::print("{}", fmt::ptr(p)); // prints p as a pointerThanks @sighingnow.
-
Made
printandvprintreport 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_contextis now an alias template, so usebuffer_context<T>instead ofbuffer_context<T>::type. These features require GCC 4.8 or later. -
formatterspecializations now always take precedence over implicit conversions tointand the undocumentedconvert_to_inttrait is now deprecated. -
Moved the undocumented
basic_writer,writer, andwwritertypes to theinternalnamespace. -
Removed deprecated
basic_format_context::begin(). Useout()instead. -
Disallowed passing the result of
joinas 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
fputwsfor writing wide strings so that it's no longer required to call_setmodeon 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_tsuch 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/issues/1037). Thanks @Kronuz.
-
Added the
FMT_ENFORCE_COMPILE_STRINGmacro to enforce the use of compile-time format strings (https://github.com/fmtlib/fmt/pull/1231). Thanks @jackoalan. -
Stopped setting
CMAKE_BUILD_TYPEif {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::pathwhich 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
formatterspecialization 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
formatcompile-time checks fromprintf(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:
#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):
#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:
Thanks @Rakete1111.
-
Added support for 4-bit terminal colors (https://github.com/fmtlib/fmt/issues/968, https://github.com/fmtlib/fmt/pull/974)
#include <fmt/color.h> int main() { print(fg(fmt::terminal_color::red), "stop\n"); }Note that these colors vary by terminal:
Thanks @Rakete1111.
-
Parameterized formatting functions on the type of the format string (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
Sthat has an overloadedto_string_view(const S&)returningfmt::string_viewcan be used as a format string: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_viewwork as a format string (https://github.com/fmtlib/fmt/pull/898):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):
print(fmt(L"{:f}"), 42); // compile-time error: invalid type specifierThanks @XZiar.
-
Made colored print functions work with wide strings (https://github.com/fmtlib/fmt/pull/867):
#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):
using namespace fmt::literals; auto s = fmt::format("{:*^5}"_u, "🤡"_u); // s == "**🤡**"_u -
Improved locale support:
#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_argsandmake_wprintf_argsfunctions (https://github.com/fmtlib/fmt/pull/934). Thanks @tnovotny. -
Deprecated
fmt::visit,parse_context, andwparse_context. Usefmt::visit_format_arg,format_parse_context, andwformat_parse_contextinstead. -
Removed undocumented
basic_fixed_bufferwhich 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:
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_viewconstruction 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_nwithstd::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
visitlookup issues on gcc 7 & 8 (https://github.com/fmtlib/fmt/pull/870). Thanks @medithe. - Fixed linkage errors on older gcc.
- Prevented
fmt/range.hfrom specializingfmt::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_toformatting towmemory_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
fmtmacro from opt-out to opt-in to prevent name collisions. To enable it define theFMT_STRING_ALIASmacro to 1 before includingfmt/format.h:#define FMT_STRING_ALIAS 1 #include <fmt/format.h> std::string answer = format(fmt("{}"), 42); -
Added compile-time format string checks to
format_tooverload that takesfmt::memory_buffer(https://github.com/fmtlib/fmt/issues/783):fmt::memory_buffer buf; // Compile-time error: invalid type specifier. fmt::format_to(buf, fmt("{:d}"), "foo"); -
Moved experimental color support to
fmt/color.hand enabled the new API by default. The old API can be enabled by defining theFMT_DEPRECATED_COLORSmacro. -
Added formatting support for types explicitly convertible to
fmt::string_view: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*_tby replacing theformatfunction 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
noexceptspecifier 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<<withformat_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):
// 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_COLORSmacro:#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_coloredandvprint_coloredfunctions and thecolorenum) 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_towork withbasic_memory_buffer(https://github.com/fmtlib/fmt/issues/776). -
Added
vformat_to_nandwchar_toverload offormat_to_n(https://github.com/fmtlib/fmt/issues/764, https://github.com/fmtlib/fmt/issues/769). -
Made
is_rangeandis_tuple_likepart 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_PEDANTICwarning 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
vformatfunctions 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 which continues to be maintained and works with C++98 compilers. -
Renamed symbols to follow standard C++ naming conventions and proposed a subset of the library for standardization in P0645R2 Text Formatting.
-
Implemented
constexprparsing of format strings and compile-time format string checks. For example#include <fmt/format.h> std::string s = format(fmt("{:d}"), "foo");gives a compile-time error because
dis an invalid specifier for strings (godbolt):... <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
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):
... <source>:12:45: error: expression '<throw-expression>' is not a constant expression throw format_error("invalid specifier"); -
Added iterator support:
#include <vector> #include <fmt/format.h> std::vector<char> out; fmt::format_to(std::back_inserter(out), "{}", 42); -
Added the format_to_n function that restricts the output to the specified number of characters (https://github.com/fmtlib/fmt/issues/298):
char out[4]; fmt::format_to_n(out, sizeof(out), "{}", 12345); // out == "1234" (without terminating '\0') -
Added the formatted_size function for computing the output size:
#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:
#include <fmt/core.h> fmt::print("The answer is {}.", 42); -
Added the make_format_args function for capturing formatting arguments:
// 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_argsfunction for capturingprintfarguments (https://github.com/fmtlib/fmt/issues/687, https://github.com/fmtlib/fmt/pull/694). Thanks @Kronuz. -
Added prefix
vto non-variadic functions takingformat_argsto distinguish them from variadic ones: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):#include <fmt/ranges.h> std::vector<int> v = {1, 2, 3}; fmt::print("{}", v); // prints {1, 2, 3}Thanks @Remotion.
-
Implemented
wchar_tdate and time formatting (https://github.com/fmtlib/fmt/pull/712):#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_viewin the format API and providedfmt::string_viewwhich implements a subset ofstd::string_viewAPI for pre-C++17 systems. -
Added support for
std::experimental::string_view(https://github.com/fmtlib/fmt/pull/607):#include <fmt/core.h> #include <experimental/string_view> fmt::print("{}", std::experimental::string_view("foo"));Thanks @virgiliofornazin.
-
Allowed mixing named and automatic arguments:
fmt::format("{} {two}", 1, fmt::arg("two", 2)); -
Removed the write API in favor of the format API with compile-time handling of format strings.
-
Disallowed formatting of multibyte strings into a wide character target (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
dto thefmtlibrary 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/*.htoinclude/fmt/*.hto prevent irrelevant files and directories appearing on the include search paths when fmt is used as a subproject and moved source files to thesrcdirectory. -
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_CPPFORMATCMake option. -
Fixed a name conflict with the macro
CHAR_WIDTHin 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_SUFFIXfor compatibility with Sphinx 1.5 (https://github.com/fmtlib/fmt/pull/497). Thanks @ginggs. -
Added a missing
inlinein 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_prefixgcc 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
-stdoptions 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_viewon 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 tofmt::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
constvariadic member function emulation withFMT_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
overrideand[[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
GNUInstallDirsto 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/*.hand CMake options (https://github.com/fmtlib/fmt/pull/527). Thanks @maddinat0r. -
Added
string.hcontainingfmt::to_string()as alternative tostd::to_string()as well as other string writer functionality (https://github.com/fmtlib/fmt/issues/326 and https://github.com/fmtlib/fmt/pull/441):#include "fmt/string.h" std::string answer = fmt::to_string(42);Thanks @glebov-andrey.
-
Moved
fmt::printf()to newprintf.hheader and allowed%sas generic specifier (https://github.com/fmtlib/fmt/pull/453), made%.fmore conformant to regularprintf()(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):#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.hcontaining aBasicContainerWriterto write to containers likestd::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):#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()andfmt::gmtime()as replacement for the standard version totime.h(https://github.com/fmtlib/fmt/pull/396). Thanks @codicodi. -
Internal improvements to
NamedArgandArgLists(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_VERSIONmacro (https://github.com/fmtlib/fmt/issues/411). - Used
FMT_NULLinstead of literal0(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.hif 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_clzin 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 charstrings (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
fmtdirectory:#include "fmt/format.h"Including
format.hfrom thecppformatdirectory is deprecated but works via a proxy header which will be removed in the next major version.The documentation is now available at https://fmt.dev.
-
Added support for strftime-like date and time formatting (https://github.com/fmtlib/fmt/issues/283):
#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::ostreamsupport including formatting of user-defined types that provide overloadedoperator<<has been moved tofmt/ostream.h:#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://github.com/fmtlib/fmt/issues/235).
-
Added support for locale-specific integer formatting with the
nspecifier (https://github.com/fmtlib/fmt/issues/305):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
printfformat specifier (https://github.com/fmtlib/fmt/issues/265):fmt::printf("%lld", -42); // prints -42Note that it would be an undefined behavior in
std::printf. -
Length modifiers such as
llare now optional in printf formatting functions and the correct type is determined automatically (https://github.com/fmtlib/fmt/issues/255):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):
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
ArgMapto 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
fprintfoverload that writes to astd::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_DIRCMake 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
cppformatdirectory. Includingformat.hfrom 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, andtestare now disabled if C++ Format is included as a CMake subproject. They can be enabled by settingFMT_DOC,FMT_INSTALL, andFMT_TESTin the parent project.
Thanks @niosHD.
- The code have been moved to the
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):
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):
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):
fmt::format("{0:{1}}", 42, 5); // gives " 42"Thanks @jamboree.
-
[Breaking] Enums are now formatted with an overloaded
std::ostreaminsertion operator (operator<<) if available (https://github.com/fmtlib/fmt/issues/232). -
[Breaking] Changed default
boolformat to textual, "true" or "false" (https://github.com/fmtlib/fmt/issues/170):fmt::print("{}", true); // prints "true"To print
boolas a number use numeric format specifier such asd:fmt::print("{:d}", true); // prints "1" -
fmt::printfandfmt::sprintfnow support formatting ofboolwith the%sspecifier giving textual output, "true" or "false" (https://github.com/fmtlib/fmt/pull/223):fmt::printf("%s", true); // prints "true"Thanks @LarsGullik.
-
[Breaking]
signed charandunsigned charare now formatted as integers by default (https://github.com/fmtlib/fmt/pull/217). -
[Breaking] Pointers to C strings can now be formatted with the
pspecifier (https://github.com/fmtlib/fmt/pull/223):fmt::print("{:p}", "test"); // prints pointer valueThanks @LarsGullik.
-
[Breaking]
fmt::printfandfmt::sprintfnow 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)printfnow supports formatting of objects of user-defined types that provide an overloadedstd::ostreaminsertion operator (operator<<) (https://github.com/fmtlib/fmt/issues/201):fmt::printf("The date is %s", Date(2012, 12, 9)); -
[Breaking] The
Buffertemplate 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
BasicStringRefand std::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_strreplaced byBasicStringRef::dataBasicStringRefis 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_INSTALLandFMT_TESTto control generation ofdoc,installandtesttargets 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. -
noexceptis now used when compiling with MSVC2015 (https://github.com/fmtlib/fmt/pull/215). Thanks @dmkrepo. -
Added an option to disable use of
windows.hwhenFMT_USE_WINDOWS_His defined as 0 before includingformat.h(https://github.com/fmtlib/fmt/issues/171). Thanks @alfps. -
[Breaking]
windows.his now included withNOMINMAXunlessFMT_WIN_MINMAXis defined. This is done to prevent breaking code usingstd::minandstd::maxand 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_IOSTREAMSis defined as 0 before includingformat.h(https://github.com/fmtlib/fmt/issues/205, https://github.com/fmtlib/fmt/pull/208). Thanks @JodiTheTigger. -
Improved detection of
isnan,isinfandsignbit.
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::Writeron integer formatting and fixed a minor regression. Now it is ~7% faster thankarma::generateon Karma's benchmark (https://github.com/fmtlib/fmt/issues/186). - [Breaking] Reduced compiled code size (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
formattocppformatfor 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 GNU/Linux (stretch, sid) and derived distributions such as Ubuntu 15.10 and later (https://github.com/fmtlib/fmt/issues/155):
$ sudo apt-get install libcppformat1-devThanks @jackyf.
-
Packages for Fedora and RHEL are now available. Thanks Dave Johansen.
-
C++ Format can now be installed via Homebrew on OS X (https://github.com/fmtlib/fmt/issues/157):
$ brew install cppformatThanks @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 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_listdetection (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):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
fmtnamespace 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). Thanks @Naios, @jackyf and Dave Johansen.
-
Fixed a name conflict with macro
freedefined incrtdbg.hwhen_CRTDBG_MAP_ALLOCis 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_assertdetection 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):char buffer[100]; fmt::ArrayWriter w(buffer); w.write("The answer is {}", 42); -
Added 0 A.D. and PenUltima Online (POL) to the list of notable projects using C++ Format.
-
C++ Format now uses MSVC intrinsics for better formatting performance (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 installcommand. -
Improved Biicode 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://github.com/fmtlib/fmt/pull/107). Thanks @newnon.
The android-ndk-example repository provides and example of using C++ Format with Android NDK:
-
Improved documentation of
SystemErrorandWindowsError(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::writewithout 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).
1.0.0 - 2015-02-05
-
Add support for a header-only configuration when
FMT_HEADER_ONLYis defined before includingformat.h:#define FMT_HEADER_ONLY #include "format.h" -
Compute string length in the constructor of
BasicStringRefinstead of thesizemethod (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 <<forstd::wostream(https://github.com/fmtlib/fmt/issues/86):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):
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_SHAREDCMake variable in favor of standard BUILD_SHARED_LIBS. -
Fix error handling in
fmt::fprintf. -
Fix a number of warnings.
0.12.0 - 2014-10-25
-
[Breaking] Improved separation between formatting and buffer management.
Writeris now a base class that cannot be instantiated directly. The newMemoryWriterclass implements the default buffer management with small allocations done on stack. Sofmt::Writershould be replaced withfmt::MemoryWriterin variable declarations.Old code:
fmt::Writer w;New code:
fmt::MemoryWriter w;If you pass
fmt::Writerby reference, you can continue to do so: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):
auto s = format("GLSL version: {}", glGetString(GL_VERSION)); -
Reduced code bloat. According to the new benchmark results, cppformat is close to
printfand by the order of magnitude better than Boost Format in terms of compiled code size. -
Improved appearance of the documentation on mobile by using the Sphinx Bootstrap theme:
Old New 

0.11.0 - 2014-08-21
-
Safe printf implementation with a POSIX extension for positional arguments:
fmt::printf("Elapsed time: %.2f seconds", 1.23); fmt::printf("%1$s, %3$d %2$s", weekday, month, day); -
Arguments of
chartype can now be formatted as integers (Issue https://github.com/fmtlib/fmt/issues/55):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 theFMT_VARIADICmacro. You can use this macro for defining your own portable variadic functions: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:std::string s = format("The answer is {}.", 42);Previously it required 2 function calls:
std::string s = str(Format("The answer is {}.") << 42);Instead of unsafe
c_strfunction,fmt::Writershould be used directly to bypass creation ofstd::string:fmt::Writer w; w.write("The answer is {}.", 42); w.c_str(); // returns a C stringThis 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_strwhich 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):
fmt::printf("The answer is %d.", 42); std::string s = fmt::sprintf("Look, a %s!", "string"); -
Support for hexadecimal floating point format specifiers
aandA:print("{:a}", -42.0); // Prints -0x1.5p+5 print("{:A}", -42.0); // Prints -0X1.5P+5 -
CMake option
FMT_SHAREDthat 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::Formatnow has a variadic overload:Writer out; out.Format("Look, I'm {}!", "variadic"); -
For efficiency and consistency with other overloads, variadic overload of the
Formatfunction now returnsWriterinstead ofstd::string. Use thestrfunction to convert it tostd::string: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
ThrowSystemErrorfunction that formats a message and throwsSystemErrorcontaining the formatted message and system-specific error description. For example, the following codeFILE *f = fopen(filename, "r"); if (!f) ThrowSystemError(errno, "Failed to open file '{}'") << filename;will throw
SystemErrorexception with description "Failed to open file '<filename>': No such file or directory" if file doesn't exist. -
Support for AppVeyor continuous integration platform.
-
Formatnow throwsSystemErrorin 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






