Releases: fmtlib/fmt
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).
1.0.0
-
Add support for a header-only configuration when
FMT_HEADER_ONLY
is defined before includingformat.h
:#define FMT_HEADER_ONLY #include "format.h"
-
Compute string length in the constructor of
BasicStringRef
instead of thesize
method (#79). This eliminates size computation for string literals on reasonable optimizing compilers. -
Fix formatting of types with overloaded
operator <<
forstd::wostream
(#86):fmt::format(L"The date is {0}", Date(2012, 12, 9));
-
Fix linkage of tests on Arch Linux (#89).
-
Allow precision specifier for non-float arguments (#90):
fmt::print("{:.3}\n", "Carpet"); // prints "Car"
-
Fix build on Android NDK (#93)
-
Improvements to documentation build procedure.
-
Remove
FMT_SHARED
CMake variable in favor of standardBUILD_SHARED_LIBS
. -
Fix error handling in
fmt::fprintf
. -
Fix a number of warnings.
0.12.0
-
[Breaking] Improved separation between formatting and buffer management.
Writer
is now a base class that cannot be instantiated directly. The newMemoryWriter
class implements the default buffer management with small allocations done on stack. Sofmt::Writer
should be replaced withfmt::MemoryWriter
in variable declarations.
Old code:fmt::Writer w;
New code:
fmt::MemoryWriter w;
If you pass
fmt::Writer
by reference, you can continue to do so:void f(fmt::Writer &w);
This doesn't affect the formatting API.
-
Support for custom memory allocators (#69)
-
Formatting functions now accept
signed char
andunsigned char
strings as arguments (#73):auto s = format("GLSL version: {}", glGetString(GL_VERSION));
-
Reduced code bloat. According to the new benchmark results, cppformat is close to
printf
and by the order of magnitude better than Boost Format in terms of compiled code size. -
Improved appearance of the documentation on mobile by using the Sphinx Bootstrap theme:
Old | New |
---|---|
0.11.0
-
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
char
type can now be formatted as integers (#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.