Releases: fmtlib/fmt
4.1.0
-
Added
fmt::to_wstring()
in addition tofmt::to_string()
(#559). Thanks @alabuzhev (Alex Alabuzhev). -
Added support for C++17
std::string_view
(#571 and #578). Thanks @thelostt (Mário Feroldi) and @mwinterb. -
Enabled stream exceptions to catch errors (#581). Thanks @crusader-mike.
-
Allowed formatting of class hierarchies with
fmt::format_arg()
(#547). Thanks @rollbear (Björn Fahller). -
Removed limitations on character types (#563). Thanks @Yelnats321 (Elnar Dakeshov).
-
Conditionally enabled use of
std::allocator_traits
(#583). Thanks @mwinterb. -
Added support for
const
variadic member function emulation withFMT_VARIADIC_CONST
(#591). Thanks @ludekvodicka (Ludek Vodicka). -
Various bugfixes: bad overflow check, unsupported implicit type conversion when determining formatting function, test segfaults (#551), ill-formed macros (#542) and ambiguous overloads (#580). Thanks @xylosper (Byoung-young Lee).
-
Prevented warnings on MSVC (#605, #602, and #545), clang (#582), GCC (#573), various conversion warnings (#609, #567, #553 and #553), and added
override
and[[noreturn]]
(#549 and #555). Thanks @alabuzhev (Alex Alabuzhev), @virgiliofornazin (Virgilio Alexandre Fornazin), @alexanderbock (Alexander Bock), @yumetodo, @VaderY (Császár Mátyás), @jpcima (JP Cimalando), @thelostt (Mário Feroldi), and @Manu343726 (Manu Sánchez). -
Improved CMake: Used GNUInstallDirs to set installation location (#610) and fixed warnings (#536 and #556). Thanks @mikecrowe (Mike Crowe), @evgen231 and @henryiii (Henry Schreiner).
4.0.0
-
Removed old compatibility headers
cppformat/*.h
and CMake options (#527). Thanks @maddinat0r (Alex Martin). -
Added
string.h
containingfmt::to_string()
as alternative tostd::to_string()
as well as other string writer functionality (#326 and #441):#include "fmt/string.h" std::string answer = fmt::to_string(42);
Thanks to @glebov-andrey (Andrey Glebov).
-
Moved
fmt::printf()
to newprintf.h
header and allowed%s
as generic specifier (#453), made%.f
more conformant to regularprintf()
(#490), added custom writer support (#476) and implemented missing custom argument formatting (#339 and #340):#include "fmt/printf.h" // %s format specifier can be used with any argument type. fmt::printf("%s", 42);
Thanks @mojoBrendan, @manylegged (Arthur Danskin) and @spacemoose (Glen Stark). See also #360, #335 and #331.
-
Added
container.h
containing aBasicContainerWriter
to write to containers likestd::vector
(#450). Thanks @polyvertex (Jean-Charles Lefebvre). -
Added
fmt::join()
function that takes a range and formats its elements separated by a given string (#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 (#444). Thanks @polyvertex (Jean-Charles Lefebvre). See also #439.
-
Added
fmt::format_system_error()
for error code formatting (#323 and #526). Thanks @maddinat0r (Alex Martin). -
Added thread-safe
fmt::localtime()
andfmt::gmtime()
as replacement for the standard version totime.h
(#396). Thanks @codicodi. -
Internal improvements to
NamedArg
andArgLists
(#389 and #390). Thanks @chronoxor. -
Fixed crash due to bug in
FormatBuf
(#493). Thanks @effzeh. See also #480 and #491. -
Fixed handling of wide strings in
fmt::StringWriter
. -
Improved compiler error messages (#357).
-
Fixed various warnings and issues with various compilers (#494, #499, #483, #519, #485, #482, #475, #473 and #414). Thanks @chronoxor, @zhaohuaxishi, @pkestene (Pierre Kestener), @dschmidt (Dominik Schmidt) and @0x414c (Alexey Gorishny) .
-
Improved CMake: targets are now namespaced (#511 and #513), supported header-only
printf.h
(#354), fixed issue with minimal supported library subset (#418, #419 and #420). Thanks @bjoernthiel (Bjoern Thiel), @niosHD (Mario Werner), @LogicalKnight (Sean LK) and @alabuzhev (Alex Alabuzhev). -
Improved documentation. Thanks to @pwm1234 (Phil) for #393.
3.0.2
-
Added
FMT_VERSION
macro (#411). -
Used
FMT_NULL
instead of literal0
(#409). Thanks @alabuzhev (Alex Alabuzhev). -
Added extern templates for
format_float
(#413). -
Fixed implicit conversion issue (#507).
-
Fixed signbit detection (#423).
-
Fixed naming collision (#425).
-
Fixed missing intrinsic for C++/CLI (#457). Thanks @calumr (Calum Robinson)
-
Fixed Android detection (#458). Thanks @Gachapen (Magnus Bjerke Vik).
-
Use lean
windows.h
if not in header-only mode (#503). Thanks @Quentin01 (Quentin Buathier). -
Fixed issue with CMake exporting C++11 flag (#445). Thanks @EricWF (Eric).
-
Fixed issue with nvcc and MSVC compiler bug and MinGW (#505).
-
Fixed DLL issues (#469 and #502). Thanks @richardeakin (Richard Eakin) and @AndreasSchoenle (Andreas Schönle).
-
Fixed test compilation under FreeBSD (#433).
-
Fixed various warnings (#403, #410 and #510). Thanks @Lecetem, @chenhayat (Chen Hayat) and @trozen.
-
Removed redundant include (#479).
-
Fixed documentation issues.
3.0.1
- Fixed handling of thousands seperator (#353)
- Fixed handling of
unsigned char
strings (#373) - Corrected buffer growth when formatting time (#367)
- Removed warnings under MSVC and clang (#318, #250, also merged #385 and #361). Thanks @jcelerier (Jean-Michaël Celerier) and @nmoehrle (Nils Moehrle).
- Fixed compilation issues under Android (#327, #345 and #381), FreeBSD (#358), Cygwin (#388), MinGW (#355) as well as other issues (#350, #366, #348, #402, #405). Thanks to @dpantele (Dmitry), @hghwng (Hugh Wang), @arvedarved (Tilman Keskinöz), @LogicalKnight (Sean) and @JanHellwig (Jan Hellwig).
- Fixed some documentation issues and extended specification (#320, #333, #347, #362). Thanks to @smellman (Taro Matsuzawa aka. btm).
3.0.0
-
The project has been renamed from C++ Format (cppformat) to fmt for consistency with the used namespace and macro prefix (#307). Library headers are now located in the
fmt
directory:#include "fmt/format.h"
Including
format.h
from thecppformat
directory is deprecated but works via a proxy header which will be removed in the next major version.The documentation is now available at http://fmtlib.net. -
Added support for strftime-like date and time formatting (#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::ostream
support 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 (#235).
-
Added support for locale-specific integer formatting with the
n
specifier (#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
printf
format specifier (#265):fmt::printf("%lld", -42); // prints -42
Note that it would be an undefined behavior in
std::printf
. -
Length modifiers such as
ll
are now optional in printf formatting functions and the correct type is determined automatically (#255):fmt::printf("%d", std::numeric_limits<long long>::max());
Note that it would be an undefined behavior in
std::printf
. -
Added initial support for custom formatters (#231).
-
Fixed detection of user-defined literal support on Intel C++ compiler (#311, #312). Thanks to @dean0x7d (Dean Moldovan) and @speth (Ray Speth).
-
Reduced compile time (#243, #249, #317):Thanks to @dean0x7d (Dean Moldovan).
-
Compile test fixes (#313). Thanks to @dean0x7d (Dean Moldovan).
-
Documentation fixes (#239, #248, #252, #258, #260, #301, #309). Thanks to @ReadmeCritic @Gachapen (Magnus Bjerke Vik) and @jwilk (Jakub Wilk).
-
Fixed compiler and sanitizer warnings (#244, #256, #259, #263, #274, #277, #286, #291, #296, #308) Thanks to @mwinterb, @pweiskircher (Patrik Weiskircher), @Naios.
-
Improved compatibility with Windows Store apps (#280, #285) Thanks to @mwinterb.
-
Added tests of compatibility with older C++ standards (#273). Thanks to @niosHD.
-
Changed
ArgMap
to be backed by a vector instead of a map. (#261, #262). Thanks to @mwinterb. -
Added
fprintf
overload that writes to astd::ostream
(#251). Thanks to nickhutchinson (Nicholas Hutchinson). -
Export symbols when building a Windows DLL (#245). Thanks to macdems (Maciek Dems).
-
Fixed compilation on Cygwin (#304).
-
Implemented a workaround for a bug in Apple LLVM version 4.2 of clang (#276).
-
Implemented a workaround for Google Test bug #705 on gcc 6 (#268). Thanks to octoploid.
-
Removed Biicode support because the latter has been discontinued.
2.1.1
2.1.0
-
Project layout and build system improvements (#267):
- The code have been moved to the
cppformat
directory. Includingformat.h
from the top-level directory is deprecated but works via a proxy header which will be removed in the next major version. - C++ Format CMake targets now have proper interface definitions.
- Installed version of the library now supports the header-only configuration.
- Targets
doc
,install
, andtest
are now disabled if C++ Format is included as a CMake subproject. They can be enabled by settingFMT_DOC
,FMT_INSTALL
, andFMT_TEST
in the parent project.
Thanks to @niosHD.
- The code have been moved to the
2.0.1
2.0.0
General
-
[Breaking] Named arguments (#169, #173, #174):
fmt::print("The answer is {answer}.", fmt::arg("answer", 42));
Thanks to @jamboree.
-
[Experimental] User-defined literals for format and named arguments (#204, #206, #207):
using namespace fmt::literals; fmt::print("The answer is {answer}.", "answer"_a=42);
Thanks to @dean0x7d (Dean Moldovan).
-
[Breaking] Formatting of more than 16 arguments is now supported when using variadic templates (#141). Thanks to @Shauren.
-
Runtime width specification (#168):
fmt::format("{0:{1}}", 42, 5); // gives " 42"
Thanks to @jamboree.
-
[Breaking] Enums are now formatted with an overloaded
std::ostream
insertion operator (operator<<
) if available (#232). -
[Breaking] Changed default
bool
format to textual, "true" or "false" (#170):fmt::print("{}", true); // prints "true"
To print
bool
as a number use numeric format specifier such asd
:fmt::print("{:d}", true); // prints "1"
-
fmt::printf
andfmt::sprintf
now support formatting ofbool
with the%s
specifier giving textual output, "true" or "false" (#223):fmt::printf("%s", true); // prints "true"
Thanks to @LarsGullik.
-
[Breaking]
signed char
andunsigned char
are now formatted as integers by default (#217). -
[Breaking] Pointers to C strings can now be formatted with the
p
specifier (#223):fmt::print("{:p}", "test"); // prints pointer value
Thanks to @LarsGullik.
-
[Breaking]
fmt::printf
andfmt::sprintf
now print null pointers as(nil)
and null strings as(null)
for consistency with glibc (#226). Thanks to @LarsGullik. -
[Breaking]
fmt::(s)printf
now supports formatting of objects of user-defined types that provide an overloadedstd::ostream
insertion operator (operator<<
) (#201):fmt::printf("The date is %s", Date(2012, 12, 9));
-
[Breaking] The
Buffer
template is now part of the public API and can be used to implement custom memory buffers (#140). Thanks to @polyvertex (Jean-Charles Lefebvre). -
[Breaking] Improved compatibility between
BasicStringRef
and std::experimental::basic_string_view (#100, #159, #183):- Comparison operators now compare string content, not pointers
BasicStringRef::c_str
replaced byBasicStringRef::data
BasicStringRef
is no longer assumed to be null-terminated
References to null-terminated strings are now represented by a new class,
BasicCStringRef
. -
Dependency on pthreads introduced by Google Test is now optional (#185).
-
New CMake options
FMT_DOC
,FMT_INSTALL
andFMT_TEST
to control generation ofdoc
,install
andtest
targets respectively, on by default (#197, #198, #200). Thanks to @maddinat0r (Alex Martin). -
noexcept
is now used when compiling with MSVC2015 (#215). Thanks to @dmkrepo (Dmitriy). -
Added an option to disable use of
windows.h
whenFMT_USE_WINDOWS_H
is defined as 0 before includingformat.h
(#171). Thanks to @alfps (Alf P. Steinbach). -
[Breaking]
windows.h
is now included withNOMINMAX
unlessFMT_WIN_MINMAX
is defined. This is done to prevent breaking code usingstd::min
andstd::max
and only affects the header-only configuration (#152, #153, #154). Thanks to @DevO2012. -
Improved support for custom character types (#171). Thanks to @alfps (Alf P. Steinbach).
-
Added an option to disable use of IOStreams when
FMT_USE_IOSTREAMS
is defined as 0 before includingformat.h
(#205, #208). Thanks to @JodiTheTigger. -
Improved detection of
isnan
,isinf
andsignbit
.
Optimization
- Made formatting of user-defined types more efficient with a custom stream buffer (#92, #230). Thanks to @NotImplemented.
- Further improved performance of
fmt::Writer
on integer formatting and fixed a minor regression. Now it is ~7% faster thankarma::generate
on Karma's benchmark (#186). - [Breaking] Reduced compiled code size (#143, #149).
Distribution
-
[Breaking] Headers are now installed in
${CMAKE_INSTALL_PREFIX}/include/cppformat
(#178). Thanks to @jackyf (Eugene V. Lyubimkin). -
[Breaking] Changed the library name from
format
tocppformat
for consistency with the project name and to avoid potential conflicts (#178). Thanks to @jackyf (Eugene V. Lyubimkin). -
C++ Format is now available in Debian GNU/Linux (stretch, sid) and derived distributions such as Ubuntu 15.10 and later (#155):
$ sudo apt-get install libcppformat1-dev
Thanks to @jackyf (Eugene V. Lyubimkin).
-
Packages for Fedora and RHEL are now available. Thanks to Dave Johansen.
-
C++ Format can now be installed via Homebrew on OS X (#157):
$ brew install cppformat
Thanks to @ortho, Anatoliy Bulukin.
Documentation
- Migrated from ReadTheDocs to GitHub Pages for better responsiveness and reliability (#128). New documentation address is http://cppformat.github.io/.
- Added Building the documentation section to the documentation.
- Documentation build script is now compatible with Python 3 and newer pip versions. (#189, #209). Thanks to @JodiTheTigger and @xentec.
- Documentation fixes and improvements (#36, #75, #125, #160, #161, #162, #165, #210). Thanks to @syohex (Syohei YOSHIDA) and bug reporters.
- Fixed out-of-tree documentation build (#177). Thanks to @jackyf (Eugene V. Lyubimkin).
Fixes
-
Fixed
initializer_list
detection (#136). Thanks to @Gachapen (Magnus Bjerke Vik). -
[Breaking] Fixed formatting of enums with numeric format specifiers in
fmt::(s)printf
(#131, #139):enum { ANSWER = 42 }; fmt::printf("%d", ANSWER);
Thanks to @Naios.
-
Improved compatibility with old versions of MinGW (#129, #130, #132). Thanks to @cstamford (Christopher Stamford).
-
Fixed a compile error on MSVC with disabled exceptions (#144).
-
Added a workaround for broken implementation of variadic templates in MSVC2012 (#148).
-
Placed the anonymous namespace within
fmt
namespace for the header-only configuration (#171). Thanks to @alfps (Alf P. Steinbach). -
Implemented a workaround for a name lookup bug in MSVC2010 (#188).
-
Fixed compiler warnings (#95, #96, #114, #135, #142, #145, #146, #158, #163, #175, #190, #191, #194, #196, #216, #218, #220, #229, #233, #234, #236). Thanks to @seanmiddleditch (Sean Middleditch), @dixlorenz (Dix Lorenz), @CarterLi (李通洲), @Naios, @fmatthew5876 (Matthew Fioravante), @LevskiWeng (Levski Weng), @rpopescu, @gabime (Gabi Melman), @cubicool (Jeremy Moles), @jkflying (Julian Kent), @LogicalKnight (Sean L), @inguin (Ingo van Lil) and @Jopie64 (Johan).
-
Fixed portability issues (mostly causing test failures) on ARM, ppc64, ppc64le, s390x and SunOS 5.11 i386 ( #138, #179, #180, #202, #225, Red Hat Bugzilla Bug 1260297). Thanks to @Naios, @jackyf (Eugene V. Lyubimkin) and Dave Johansen.
-
Fixed a name conflict with macro
free
defined incrtdbg.h
when_CRTDBG_MAP_ALLOC
is set (#211). -
Fixed shared library build on OS X (#212). Thanks to @dean0x7d (Dean Moldovan).
-
Fixed an overload conflict on MSVC when
/Zc:wchar_t-
option is specified (#214). Thanks to @slavanap (Vyacheslav Napadovsky). -
Improved compatibility with MSVC 2008 (#236). Thanks to @Jopie64 (Johan).
-
Improved compatibility with bcc32 (#227).
-
Fixed
static_assert
detection on Clang (#228). Thanks to @dean0x7d (Dean Moldovan).
1.1.0
- Added
BasicArrayWriter
, a class template that provides operations for formatting and writing data into a fixed-size array (#105 and #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 (#115, #116, #118 and #121). Previously these optimizations where only used on GCC and Clang. Thanks to @CarterLi and @objectx.
- CMake install target (#119). Thanks to @TrentHouliston.
You can now install C++ Format with make install
command.
- Improved Biicode support (#98 and #104). Thanks to @MariadeAnton and @franramirez688.
- Improved support for bulding with Android NDK (#107). Thanks to @newnon.
The android-ndk-example repository provides and example of using C++ Format with Android NDK:
- Improved documentation of
SystemError
andWindowsError
(#54). - Various code improvements (#110, #111 #112). Thanks to @CarterLi.
- Improved compile-time errors when formatting wide into narrow strings (#117).
- Fixed
BasicWriter::write
without formatting arguments when C++11 support is disabled (#109). - Fixed header-only build on OS X with GCC 4.9 (#124).
- Fixed packaging issues (#94).
- Fixed warnings in GCC, MSVC and Xcode/Clang (#95, #96 and #114).
- Added changelog (#103).