2015-03-05 15:26:44 +00:00
|
|
|
0.12.0 - 2014-10-25
|
|
|
|
-------------------
|
|
|
|
|
|
|
|
* [Breaking] Improved separation between formatting and buffer management.
|
|
|
|
``Writer`` is now a base class that cannot be instantiated directly.
|
|
|
|
The new ``MemoryWriter`` class implements the default buffer management
|
|
|
|
with small allocations done on stack. So ``fmt::Writer`` should be replaced
|
|
|
|
with ``fmt::MemoryWriter`` in variable declarations.
|
|
|
|
|
|
|
|
Old code:
|
|
|
|
|
|
|
|
.. code:: c++
|
|
|
|
|
|
|
|
fmt::Writer w;
|
|
|
|
|
|
|
|
New code:
|
|
|
|
|
|
|
|
.. code:: c++
|
|
|
|
|
|
|
|
fmt::MemoryWriter w;
|
|
|
|
|
|
|
|
If you pass ``fmt::Writer`` by reference, you can continue to do so:
|
|
|
|
|
|
|
|
.. code:: c++
|
|
|
|
|
|
|
|
void f(fmt::Writer &w);
|
|
|
|
|
|
|
|
This doesn't affect the formatting API.
|
|
|
|
|
|
|
|
* Support for custom memory allocators
|
|
|
|
(`#69 <https://github.com/cppformat/cppformat/issues/69>`_)
|
|
|
|
|
|
|
|
* Formatting functions now accept `signed char` and `unsigned char` strings as
|
|
|
|
arguments (`#73 <https://github.com/cppformat/cppformat/issues/73>`_):
|
|
|
|
|
|
|
|
.. code:: c++
|
|
|
|
|
|
|
|
auto s = format("GLSL version: {}", glGetString(GL_VERSION));
|
|
|
|
|
|
|
|
* Reduced code bloat. According to the new `benchmark results
|
|
|
|
<https://github.com/cppformat/cppformat#compile-time-and-code-bloat>`_,
|
|
|
|
cppformat is close to ``printf`` and by the order of magnitude better than
|
|
|
|
Boost Format in terms of compiled code size.
|
|
|
|
|
2015-03-05 15:30:50 +00:00
|
|
|
* Improved appearance of the documentation on mobile by using the
|
|
|
|
`Sphinx Bootstrap theme
|
|
|
|
<http://ryan-roemer.github.io/sphinx-bootstrap-theme/`_:
|
2015-03-05 15:26:44 +00:00
|
|
|
|
2015-03-05 15:29:54 +00:00
|
|
|
.. |old| image:: https://cloud.githubusercontent.com/assets/576385/4792130/cd256436-5de3-11e4-9a62-c077d0c2b003.png
|
|
|
|
|
|
|
|
.. |new| image:: https://cloud.githubusercontent.com/assets/576385/4792131/cd29896c-5de3-11e4-8f59-cac952942bf0.png
|
|
|
|
|
|
|
|
+-------+-------+
|
|
|
|
| Old | New |
|
|
|
|
+-------+-------+
|
|
|
|
| |old| | |new| |
|
|
|
|
+-------+-------+
|
2015-03-05 15:26:44 +00:00
|
|
|
|
2015-03-05 02:49:23 +00:00
|
|
|
0.11.0 - 2014-08-21
|
|
|
|
-------------------
|
|
|
|
|
|
|
|
* Safe printf implementation with a POSIX extension for positional arguments:
|
|
|
|
|
|
|
|
.. code:: c++
|
|
|
|
|
|
|
|
fmt::printf("Elapsed time: %.2f seconds", 1.23);
|
|
|
|
fmt::printf("%1$s, %3$d %2$s", weekday, month, day);
|
|
|
|
|
2015-03-05 03:02:59 +00:00
|
|
|
* Arguments of ``char`` type can now be formatted as integers
|
2015-03-05 03:03:56 +00:00
|
|
|
(Issue `#55 <https://github.com/cppformat/cppformat/issues/55>`_):
|
2015-03-05 02:49:23 +00:00
|
|
|
|
|
|
|
.. code:: c++
|
|
|
|
|
|
|
|
fmt::format("0x{0:02X}", 'a');
|
|
|
|
|
|
|
|
* Deprecated parts of the API removed.
|
|
|
|
|
|
|
|
* The library is now built and tested on MinGW with Appveyor in addition to
|
|
|
|
existing test platforms Linux/GCC, OS X/Clang, Windows/MSVC.
|
|
|
|
|
2015-03-05 02:30:00 +00:00
|
|
|
0.10.0 - 2014-07-01
|
|
|
|
-------------------
|
|
|
|
|
|
|
|
**Improved API**
|
|
|
|
|
|
|
|
* All formatting methods are now implemented as variadic functions instead
|
|
|
|
of using ``operator<<`` for feeding arbitrary arguments into a temporary
|
|
|
|
formatter object. This works both with C++11 where variadic templates are
|
|
|
|
used and with older standards where variadic functions are emulated by
|
|
|
|
providing lightweight wrapper functions defined with the ``FMT_VARIADIC``
|
|
|
|
macro. You can use this macro for defining your own portable variadic
|
|
|
|
functions:
|
|
|
|
|
|
|
|
.. code:: c++
|
|
|
|
|
|
|
|
void report_error(const char *format, const fmt::ArgList &args) {
|
|
|
|
fmt::print("Error: {}");
|
|
|
|
fmt::print(format, args);
|
|
|
|
}
|
|
|
|
FMT_VARIADIC(void, report_error, const char *)
|
|
|
|
|
|
|
|
report_error("file not found: {}", path);
|
|
|
|
|
|
|
|
Apart from a more natural syntax, this also improves performance as there
|
|
|
|
is no need to construct temporary formatter objects and control arguments'
|
|
|
|
lifetimes. Because the wrapper functions are very ligthweight, 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:
|
|
|
|
|
|
|
|
.. code:: c++
|
|
|
|
|
|
|
|
std::string s = format("The answer is {}.", 42);
|
|
|
|
|
|
|
|
Previously it required 2 function calls:
|
|
|
|
|
|
|
|
.. code:: c++
|
|
|
|
|
|
|
|
std::string s = str(Format("The answer is {}.") << 42);
|
|
|
|
|
|
|
|
Instead of unsafe ``c_str`` function, ``fmt::Writer`` should be used directly
|
|
|
|
to bypass creation of ``std::string``:
|
|
|
|
|
|
|
|
.. code:: c++
|
|
|
|
|
|
|
|
fmt::Writer w;
|
|
|
|
w.write("The answer is {}.", 42);
|
|
|
|
w.c_str(); // returns a C string
|
|
|
|
|
|
|
|
This doesn't do dynamic memory allocation for small strings and is less error
|
|
|
|
prone as the lifetime of the string is the same as for ``std::string::c_str``
|
|
|
|
which is well understood (hopefully).
|
|
|
|
|
|
|
|
* Improved consistency in naming functions that are a part of the public API.
|
|
|
|
Now all public functions are lowercase following the standard library
|
|
|
|
conventions. Previously it was a combination of lowercase and
|
2015-03-05 03:02:59 +00:00
|
|
|
CapitalizedWords.
|
2015-03-05 03:03:56 +00:00
|
|
|
Issue `#50 <https://github.com/cppformat/cppformat/issues/50>`_.
|
2015-03-05 02:30:00 +00:00
|
|
|
|
|
|
|
* 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):
|
|
|
|
|
|
|
|
.. code:: c++
|
|
|
|
|
|
|
|
fmt::printf("The answer is %d.", 42);
|
|
|
|
std::string s = fmt::sprintf("Look, a %s!", "string");
|
|
|
|
|
|
|
|
* Support for hexadecimal floating point format specifiers ``a`` and ``A``:
|
|
|
|
|
|
|
|
.. code:: c++
|
|
|
|
|
|
|
|
print("{:a}", -42.0); // Prints -0x1.5p+5
|
|
|
|
print("{:A}", -42.0); // Prints -0X1.5P+5
|
|
|
|
|
|
|
|
* CMake option ``FMT_SHARED`` that specifies whether to build format as a
|
|
|
|
shared library (off by default).
|
|
|
|
|
2015-03-05 02:10:08 +00:00
|
|
|
0.9.0 - 2014-05-13
|
|
|
|
------------------
|
|
|
|
|
|
|
|
* More efficient implementation of variadic formatting functions.
|
|
|
|
|
2015-03-05 02:16:26 +00:00
|
|
|
* ``Writer::Format`` now has a variadic overload:
|
|
|
|
|
|
|
|
.. code:: c++
|
2015-03-05 02:10:08 +00:00
|
|
|
|
|
|
|
Writer out;
|
|
|
|
out.Format("Look, I'm {}!", "variadic");
|
|
|
|
|
|
|
|
* For efficiency and consistency with other overloads, variadic overload of
|
2015-03-05 02:16:26 +00:00
|
|
|
the ``Format`` function now returns ``Writer`` instead of ``std::string``.
|
|
|
|
Use the ``str`` function to convert it to ``std::string``:
|
|
|
|
|
|
|
|
.. code:: c++
|
2015-03-05 02:10:08 +00:00
|
|
|
|
|
|
|
std::string s = str(Format("Look, I'm {}!", "variadic"));
|
|
|
|
|
2015-03-05 02:16:26 +00:00
|
|
|
* Replaced formatter actions with output sinks: ``NoAction`` -> ``NullSink``,
|
|
|
|
``Write`` -> ``FileSink``, ``ColorWriter`` -> ``ANSITerminalSink``.
|
|
|
|
This improves naming consistency and shouldn't affect client code unless
|
|
|
|
these classes are used directly which should be rarely needed.
|
|
|
|
|
|
|
|
* Added ``ThrowSystemError`` function that formats a message and throws
|
|
|
|
``SystemError`` containing the formatted message and system-specific error
|
|
|
|
description. For example, the following code
|
2015-03-05 02:10:08 +00:00
|
|
|
|
2015-03-05 02:16:26 +00:00
|
|
|
.. code:: c++
|
2015-03-05 02:10:08 +00:00
|
|
|
|
|
|
|
FILE *f = fopen(filename, "r");
|
|
|
|
if (!f)
|
|
|
|
ThrowSystemError(errno, "Failed to open file '{}'") << filename;
|
|
|
|
|
2015-03-05 02:16:26 +00:00
|
|
|
will throw ``SystemError`` exception with description
|
2015-03-05 02:10:08 +00:00
|
|
|
"Failed to open file '<filename>': No such file or directory" if file
|
|
|
|
doesn't exist.
|
|
|
|
|
2015-03-05 02:49:23 +00:00
|
|
|
* Support for AppVeyor continuous integration platform.
|
2015-03-05 02:10:08 +00:00
|
|
|
|
2015-03-05 02:16:26 +00:00
|
|
|
* ``Format`` now throws ``SystemError`` in case of I/O errors.
|
2015-03-05 02:10:08 +00:00
|
|
|
|
|
|
|
* Improve test infrastructure. Print functions are now tested by redirecting
|
|
|
|
the output to a pipe.
|
|
|
|
|
|
|
|
0.8.0 - 2014-04-14
|
|
|
|
------------------
|
|
|
|
|
|
|
|
* Initial release
|