git repos / blockattack-game

blame: source/misc/embedded_libs/fmt-8.1.1/doc/api.rst

normal view · raw

f8deb5b9 Poul Sander 2022-01-15 13:55 1
.. _string-formatting-api:
f8deb5b9 Poul Sander 2022-01-15 13:55 2
f8deb5b9 Poul Sander 2022-01-15 13:55 3
*************
f8deb5b9 Poul Sander 2022-01-15 13:55 4
API Reference
f8deb5b9 Poul Sander 2022-01-15 13:55 5
*************
f8deb5b9 Poul Sander 2022-01-15 13:55 6
f8deb5b9 Poul Sander 2022-01-15 13:55 7
The {fmt} library API consists of the following parts:
f8deb5b9 Poul Sander 2022-01-15 13:55 8
f8deb5b9 Poul Sander 2022-01-15 13:55 9
* :ref:`fmt/core.h <core-api>`: the core API providing main formatting functions
f8deb5b9 Poul Sander 2022-01-15 13:55 10
  for ``char``/UTF-8 with compile-time checks and minimal dependencies
f8deb5b9 Poul Sander 2022-01-15 13:55 11
* :ref:`fmt/format.h <format-api>`: the full format API providing additional
f8deb5b9 Poul Sander 2022-01-15 13:55 12
  formatting functions and locale support
f8deb5b9 Poul Sander 2022-01-15 13:55 13
* :ref:`fmt/ranges.h <ranges-api>`: formatting of ranges and tuples
f8deb5b9 Poul Sander 2022-01-15 13:55 14
* :ref:`fmt/chrono.h <chrono-api>`: date and time formatting
f8deb5b9 Poul Sander 2022-01-15 13:55 15
* :ref:`fmt/compile.h <compile-api>`: format string compilation
f8deb5b9 Poul Sander 2022-01-15 13:55 16
* :ref:`fmt/color.h <color-api>`: terminal color and text style
f8deb5b9 Poul Sander 2022-01-15 13:55 17
* :ref:`fmt/os.h <os-api>`: system APIs
f8deb5b9 Poul Sander 2022-01-15 13:55 18
* :ref:`fmt/ostream.h <ostream-api>`: ``std::ostream`` support
f8deb5b9 Poul Sander 2022-01-15 13:55 19
* :ref:`fmt/printf.h <printf-api>`: ``printf`` formatting
f8deb5b9 Poul Sander 2022-01-15 13:55 20
* :ref:`fmt/xchar.h <xchar-api>`: optional ``wchar_t`` support 
f8deb5b9 Poul Sander 2022-01-15 13:55 21
f8deb5b9 Poul Sander 2022-01-15 13:55 22
All functions and types provided by the library reside in namespace ``fmt`` and
f8deb5b9 Poul Sander 2022-01-15 13:55 23
macros have prefix ``FMT_``.
f8deb5b9 Poul Sander 2022-01-15 13:55 24
f8deb5b9 Poul Sander 2022-01-15 13:55 25
.. _core-api:
f8deb5b9 Poul Sander 2022-01-15 13:55 26
f8deb5b9 Poul Sander 2022-01-15 13:55 27
Core API
f8deb5b9 Poul Sander 2022-01-15 13:55 28
========
f8deb5b9 Poul Sander 2022-01-15 13:55 29
f8deb5b9 Poul Sander 2022-01-15 13:55 30
``fmt/core.h`` defines the core API which provides main formatting functions for
f8deb5b9 Poul Sander 2022-01-15 13:55 31
``char``/UTF-8 with compile-time checks. It has minimal include dependencies for
f8deb5b9 Poul Sander 2022-01-15 13:55 32
better compile times. This header is only beneficial when using {fmt} as a
f8deb5b9 Poul Sander 2022-01-15 13:55 33
library and not in the header-only mode.
f8deb5b9 Poul Sander 2022-01-15 13:55 34
f8deb5b9 Poul Sander 2022-01-15 13:55 35
The following functions use :ref:`format string syntax <syntax>`
f8deb5b9 Poul Sander 2022-01-15 13:55 36
similar to that of Python's `str.format
f8deb5b9 Poul Sander 2022-01-15 13:55 37
<https://docs.python.org/3/library/stdtypes.html#str.format>`_.
f8deb5b9 Poul Sander 2022-01-15 13:55 38
They take *fmt* and *args* as arguments.
f8deb5b9 Poul Sander 2022-01-15 13:55 39
f8deb5b9 Poul Sander 2022-01-15 13:55 40
*fmt* is a format string that contains literal text and replacement fields
f8deb5b9 Poul Sander 2022-01-15 13:55 41
surrounded by braces ``{}``. The fields are replaced with formatted arguments
f8deb5b9 Poul Sander 2022-01-15 13:55 42
in the resulting string. `~fmt::format_string` is a format string which can be
f8deb5b9 Poul Sander 2022-01-15 13:55 43
implicitly constructed from a string literal or a ``constexpr`` string and is
f8deb5b9 Poul Sander 2022-01-15 13:55 44
checked at compile time in C++20. To pass a runtime format string wrap it in
f8deb5b9 Poul Sander 2022-01-15 13:55 45
`fmt::runtime`.
f8deb5b9 Poul Sander 2022-01-15 13:55 46
f8deb5b9 Poul Sander 2022-01-15 13:55 47
*args* is an argument list representing objects to be formatted.
f8deb5b9 Poul Sander 2022-01-15 13:55 48
f8deb5b9 Poul Sander 2022-01-15 13:55 49
.. _format:
f8deb5b9 Poul Sander 2022-01-15 13:55 50
f8deb5b9 Poul Sander 2022-01-15 13:55 51
.. doxygenfunction:: format(format_string<T...> fmt, T&&... args) -> std::string
f8deb5b9 Poul Sander 2022-01-15 13:55 52
.. doxygenfunction:: vformat(string_view fmt, format_args args) -> std::string
f8deb5b9 Poul Sander 2022-01-15 13:55 53
f8deb5b9 Poul Sander 2022-01-15 13:55 54
.. doxygenfunction:: format_to(OutputIt out, format_string<T...> fmt, T&&... args) -> OutputIt
f8deb5b9 Poul Sander 2022-01-15 13:55 55
.. doxygenfunction:: format_to_n(OutputIt out, size_t n, format_string<T...> fmt, T&&... args) -> format_to_n_result<OutputIt>
f8deb5b9 Poul Sander 2022-01-15 13:55 56
.. doxygenfunction:: formatted_size(format_string<T...> fmt, T&&... args) -> size_t
f8deb5b9 Poul Sander 2022-01-15 13:55 57
f8deb5b9 Poul Sander 2022-01-15 13:55 58
.. doxygenstruct:: fmt::format_to_n_result
f8deb5b9 Poul Sander 2022-01-15 13:55 59
   :members:
f8deb5b9 Poul Sander 2022-01-15 13:55 60
f8deb5b9 Poul Sander 2022-01-15 13:55 61
.. _print:
f8deb5b9 Poul Sander 2022-01-15 13:55 62
f8deb5b9 Poul Sander 2022-01-15 13:55 63
.. doxygenfunction:: fmt::print(format_string<T...> fmt, T&&... args)
f8deb5b9 Poul Sander 2022-01-15 13:55 64
.. doxygenfunction:: fmt::vprint(string_view fmt, format_args args)
f8deb5b9 Poul Sander 2022-01-15 13:55 65
f8deb5b9 Poul Sander 2022-01-15 13:55 66
.. doxygenfunction:: print(std::FILE *f, format_string<T...> fmt, T&&... args)
f8deb5b9 Poul Sander 2022-01-15 13:55 67
.. doxygenfunction:: vprint(std::FILE *f, string_view fmt, format_args args)
f8deb5b9 Poul Sander 2022-01-15 13:55 68
f8deb5b9 Poul Sander 2022-01-15 13:55 69
Compile-time Format String Checks
f8deb5b9 Poul Sander 2022-01-15 13:55 70
---------------------------------
f8deb5b9 Poul Sander 2022-01-15 13:55 71
f8deb5b9 Poul Sander 2022-01-15 13:55 72
Compile-time checks are enabled when using ``FMT_STRING``. They support built-in
f8deb5b9 Poul Sander 2022-01-15 13:55 73
and string types as well as user-defined types with ``constexpr`` ``parse``
f8deb5b9 Poul Sander 2022-01-15 13:55 74
functions in their ``formatter`` specializations.
f8deb5b9 Poul Sander 2022-01-15 13:55 75
Requires C++14 and is a no-op in C++11.
f8deb5b9 Poul Sander 2022-01-15 13:55 76
f8deb5b9 Poul Sander 2022-01-15 13:55 77
.. doxygendefine:: FMT_STRING
f8deb5b9 Poul Sander 2022-01-15 13:55 78
f8deb5b9 Poul Sander 2022-01-15 13:55 79
To force the use of compile-time checks, define the preprocessor variable
f8deb5b9 Poul Sander 2022-01-15 13:55 80
``FMT_ENFORCE_COMPILE_STRING``. When set, functions accepting ``FMT_STRING``
f8deb5b9 Poul Sander 2022-01-15 13:55 81
will fail to compile with regular strings. Runtime-checked
f8deb5b9 Poul Sander 2022-01-15 13:55 82
formatting is still possible using ``fmt::vformat``, ``fmt::vprint``, etc.
f8deb5b9 Poul Sander 2022-01-15 13:55 83
f8deb5b9 Poul Sander 2022-01-15 13:55 84
.. doxygenclass:: fmt::basic_format_string
f8deb5b9 Poul Sander 2022-01-15 13:55 85
   :members:
f8deb5b9 Poul Sander 2022-01-15 13:55 86
f8deb5b9 Poul Sander 2022-01-15 13:55 87
.. doxygentypedef:: fmt::format_string
f8deb5b9 Poul Sander 2022-01-15 13:55 88
f8deb5b9 Poul Sander 2022-01-15 13:55 89
.. doxygenfunction:: fmt::runtime(const S&)
f8deb5b9 Poul Sander 2022-01-15 13:55 90
f8deb5b9 Poul Sander 2022-01-15 13:55 91
Named Arguments
f8deb5b9 Poul Sander 2022-01-15 13:55 92
---------------
f8deb5b9 Poul Sander 2022-01-15 13:55 93
f8deb5b9 Poul Sander 2022-01-15 13:55 94
.. doxygenfunction:: fmt::arg(const S&, const T&)
f8deb5b9 Poul Sander 2022-01-15 13:55 95
f8deb5b9 Poul Sander 2022-01-15 13:55 96
Named arguments are not supported in compile-time checks at the moment.
f8deb5b9 Poul Sander 2022-01-15 13:55 97
f8deb5b9 Poul Sander 2022-01-15 13:55 98
Argument Lists
f8deb5b9 Poul Sander 2022-01-15 13:55 99
--------------
f8deb5b9 Poul Sander 2022-01-15 13:55 100
f8deb5b9 Poul Sander 2022-01-15 13:55 101
You can create your own formatting function with compile-time checks and small
f8deb5b9 Poul Sander 2022-01-15 13:55 102
binary footprint, for example (https://godbolt.org/z/oba4Mc):
f8deb5b9 Poul Sander 2022-01-15 13:55 103
f8deb5b9 Poul Sander 2022-01-15 13:55 104
.. code:: c++
f8deb5b9 Poul Sander 2022-01-15 13:55 105
f8deb5b9 Poul Sander 2022-01-15 13:55 106
    #include <fmt/format.h>
f8deb5b9 Poul Sander 2022-01-15 13:55 107
f8deb5b9 Poul Sander 2022-01-15 13:55 108
    void vlog(const char* file, int line, fmt::string_view format,
f8deb5b9 Poul Sander 2022-01-15 13:55 109
              fmt::format_args args) {
f8deb5b9 Poul Sander 2022-01-15 13:55 110
      fmt::print("{}: {}: ", file, line);
f8deb5b9 Poul Sander 2022-01-15 13:55 111
      fmt::vprint(format, args);
f8deb5b9 Poul Sander 2022-01-15 13:55 112
    }
f8deb5b9 Poul Sander 2022-01-15 13:55 113
f8deb5b9 Poul Sander 2022-01-15 13:55 114
    template <typename S, typename... Args>
f8deb5b9 Poul Sander 2022-01-15 13:55 115
    void log(const char* file, int line, const S& format, Args&&... args) {
f8deb5b9 Poul Sander 2022-01-15 13:55 116
      vlog(file, line, format,
f8deb5b9 Poul Sander 2022-01-15 13:55 117
          fmt::make_args_checked<Args...>(format, args...));
f8deb5b9 Poul Sander 2022-01-15 13:55 118
    }
f8deb5b9 Poul Sander 2022-01-15 13:55 119
f8deb5b9 Poul Sander 2022-01-15 13:55 120
    #define MY_LOG(format, ...) \
f8deb5b9 Poul Sander 2022-01-15 13:55 121
      log(__FILE__, __LINE__, FMT_STRING(format), __VA_ARGS__)
f8deb5b9 Poul Sander 2022-01-15 13:55 122
f8deb5b9 Poul Sander 2022-01-15 13:55 123
    MY_LOG("invalid squishiness: {}", 42);
f8deb5b9 Poul Sander 2022-01-15 13:55 124
f8deb5b9 Poul Sander 2022-01-15 13:55 125
Note that ``vlog`` is not parameterized on argument types which improves compile
f8deb5b9 Poul Sander 2022-01-15 13:55 126
times and reduces binary code size compared to a fully parameterized version.
f8deb5b9 Poul Sander 2022-01-15 13:55 127
f8deb5b9 Poul Sander 2022-01-15 13:55 128
.. doxygenfunction:: fmt::make_args_checked(const S&, const remove_reference_t<Args>&...)
f8deb5b9 Poul Sander 2022-01-15 13:55 129
f8deb5b9 Poul Sander 2022-01-15 13:55 130
.. doxygenfunction:: fmt::make_format_args(const Args&...)
f8deb5b9 Poul Sander 2022-01-15 13:55 131
f8deb5b9 Poul Sander 2022-01-15 13:55 132
.. doxygenclass:: fmt::format_arg_store
f8deb5b9 Poul Sander 2022-01-15 13:55 133
   :members:
f8deb5b9 Poul Sander 2022-01-15 13:55 134
f8deb5b9 Poul Sander 2022-01-15 13:55 135
.. doxygenclass:: fmt::dynamic_format_arg_store
f8deb5b9 Poul Sander 2022-01-15 13:55 136
   :members:
f8deb5b9 Poul Sander 2022-01-15 13:55 137
f8deb5b9 Poul Sander 2022-01-15 13:55 138
.. doxygenclass:: fmt::basic_format_args
f8deb5b9 Poul Sander 2022-01-15 13:55 139
   :members:
f8deb5b9 Poul Sander 2022-01-15 13:55 140
f8deb5b9 Poul Sander 2022-01-15 13:55 141
.. doxygentypedef:: fmt::format_args
f8deb5b9 Poul Sander 2022-01-15 13:55 142
f8deb5b9 Poul Sander 2022-01-15 13:55 143
.. doxygenclass:: fmt::basic_format_arg
f8deb5b9 Poul Sander 2022-01-15 13:55 144
   :members:
f8deb5b9 Poul Sander 2022-01-15 13:55 145
f8deb5b9 Poul Sander 2022-01-15 13:55 146
.. doxygenclass:: fmt::basic_format_context
f8deb5b9 Poul Sander 2022-01-15 13:55 147
   :members:
f8deb5b9 Poul Sander 2022-01-15 13:55 148
f8deb5b9 Poul Sander 2022-01-15 13:55 149
.. doxygentypedef:: fmt::format_context
f8deb5b9 Poul Sander 2022-01-15 13:55 150
f8deb5b9 Poul Sander 2022-01-15 13:55 151
Compatibility
f8deb5b9 Poul Sander 2022-01-15 13:55 152
-------------
f8deb5b9 Poul Sander 2022-01-15 13:55 153
f8deb5b9 Poul Sander 2022-01-15 13:55 154
.. doxygenclass:: fmt::basic_string_view
f8deb5b9 Poul Sander 2022-01-15 13:55 155
   :members:
f8deb5b9 Poul Sander 2022-01-15 13:55 156
f8deb5b9 Poul Sander 2022-01-15 13:55 157
.. doxygentypedef:: fmt::string_view
f8deb5b9 Poul Sander 2022-01-15 13:55 158
f8deb5b9 Poul Sander 2022-01-15 13:55 159
Locale
f8deb5b9 Poul Sander 2022-01-15 13:55 160
------
f8deb5b9 Poul Sander 2022-01-15 13:55 161
f8deb5b9 Poul Sander 2022-01-15 13:55 162
All formatting is locale-independent by default. Use the ``'L'`` format
f8deb5b9 Poul Sander 2022-01-15 13:55 163
specifier to insert the appropriate number separator characters from the
f8deb5b9 Poul Sander 2022-01-15 13:55 164
locale::
f8deb5b9 Poul Sander 2022-01-15 13:55 165
f8deb5b9 Poul Sander 2022-01-15 13:55 166
  #include <fmt/core.h>
f8deb5b9 Poul Sander 2022-01-15 13:55 167
  #include <locale>
f8deb5b9 Poul Sander 2022-01-15 13:55 168
f8deb5b9 Poul Sander 2022-01-15 13:55 169
  std::locale::global(std::locale("en_US.UTF-8"));
f8deb5b9 Poul Sander 2022-01-15 13:55 170
  auto s = fmt::format("{:L}", 1000000);  // s == "1,000,000"
f8deb5b9 Poul Sander 2022-01-15 13:55 171
f8deb5b9 Poul Sander 2022-01-15 13:55 172
.. _format-api:
f8deb5b9 Poul Sander 2022-01-15 13:55 173
f8deb5b9 Poul Sander 2022-01-15 13:55 174
Format API
f8deb5b9 Poul Sander 2022-01-15 13:55 175
==========
f8deb5b9 Poul Sander 2022-01-15 13:55 176
f8deb5b9 Poul Sander 2022-01-15 13:55 177
``fmt/format.h`` defines the full format API providing additional formatting
f8deb5b9 Poul Sander 2022-01-15 13:55 178
functions and locale support.
f8deb5b9 Poul Sander 2022-01-15 13:55 179
f8deb5b9 Poul Sander 2022-01-15 13:55 180
.. _udt:
f8deb5b9 Poul Sander 2022-01-15 13:55 181
f8deb5b9 Poul Sander 2022-01-15 13:55 182
Formatting User-defined Types
f8deb5b9 Poul Sander 2022-01-15 13:55 183
-----------------------------
f8deb5b9 Poul Sander 2022-01-15 13:55 184
f8deb5b9 Poul Sander 2022-01-15 13:55 185
To make a user-defined type formattable, specialize the ``formatter<T>`` struct
f8deb5b9 Poul Sander 2022-01-15 13:55 186
template and implement ``parse`` and ``format`` methods::
f8deb5b9 Poul Sander 2022-01-15 13:55 187
f8deb5b9 Poul Sander 2022-01-15 13:55 188
  #include <fmt/format.h>
f8deb5b9 Poul Sander 2022-01-15 13:55 189
f8deb5b9 Poul Sander 2022-01-15 13:55 190
  struct point {
f8deb5b9 Poul Sander 2022-01-15 13:55 191
    double x, y;
f8deb5b9 Poul Sander 2022-01-15 13:55 192
  };
f8deb5b9 Poul Sander 2022-01-15 13:55 193
f8deb5b9 Poul Sander 2022-01-15 13:55 194
  template <> struct fmt::formatter<point> {
f8deb5b9 Poul Sander 2022-01-15 13:55 195
    // Presentation format: 'f' - fixed, 'e' - exponential.
f8deb5b9 Poul Sander 2022-01-15 13:55 196
    char presentation = 'f';
f8deb5b9 Poul Sander 2022-01-15 13:55 197
f8deb5b9 Poul Sander 2022-01-15 13:55 198
    // Parses format specifications of the form ['f' | 'e'].
f8deb5b9 Poul Sander 2022-01-15 13:55 199
    constexpr auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {
f8deb5b9 Poul Sander 2022-01-15 13:55 200
      // [ctx.begin(), ctx.end()) is a character range that contains a part of
f8deb5b9 Poul Sander 2022-01-15 13:55 201
      // the format string starting from the format specifications to be parsed,
f8deb5b9 Poul Sander 2022-01-15 13:55 202
      // e.g. in
f8deb5b9 Poul Sander 2022-01-15 13:55 203
      //
f8deb5b9 Poul Sander 2022-01-15 13:55 204
      //   fmt::format("{:f} - point of interest", point{1, 2});
f8deb5b9 Poul Sander 2022-01-15 13:55 205
      //
f8deb5b9 Poul Sander 2022-01-15 13:55 206
      // the range will contain "f} - point of interest". The formatter should
f8deb5b9 Poul Sander 2022-01-15 13:55 207
      // parse specifiers until '}' or the end of the range. In this example
f8deb5b9 Poul Sander 2022-01-15 13:55 208
      // the formatter should parse the 'f' specifier and return an iterator
f8deb5b9 Poul Sander 2022-01-15 13:55 209
      // pointing to '}'.
f8deb5b9 Poul Sander 2022-01-15 13:55 210
f8deb5b9 Poul Sander 2022-01-15 13:55 211
      // Parse the presentation format and store it in the formatter:
f8deb5b9 Poul Sander 2022-01-15 13:55 212
      auto it = ctx.begin(), end = ctx.end();
f8deb5b9 Poul Sander 2022-01-15 13:55 213
      if (it != end && (*it == 'f' || *it == 'e')) presentation = *it++;
f8deb5b9 Poul Sander 2022-01-15 13:55 214
f8deb5b9 Poul Sander 2022-01-15 13:55 215
      // Check if reached the end of the range:
f8deb5b9 Poul Sander 2022-01-15 13:55 216
      if (it != end && *it != '}') throw format_error("invalid format");
f8deb5b9 Poul Sander 2022-01-15 13:55 217
f8deb5b9 Poul Sander 2022-01-15 13:55 218
      // Return an iterator past the end of the parsed range:
f8deb5b9 Poul Sander 2022-01-15 13:55 219
      return it;
f8deb5b9 Poul Sander 2022-01-15 13:55 220
    }
f8deb5b9 Poul Sander 2022-01-15 13:55 221
f8deb5b9 Poul Sander 2022-01-15 13:55 222
    // Formats the point p using the parsed format specification (presentation)
f8deb5b9 Poul Sander 2022-01-15 13:55 223
    // stored in this formatter.
f8deb5b9 Poul Sander 2022-01-15 13:55 224
    template <typename FormatContext>
f8deb5b9 Poul Sander 2022-01-15 13:55 225
    auto format(const point& p, FormatContext& ctx) -> decltype(ctx.out()) {
f8deb5b9 Poul Sander 2022-01-15 13:55 226
      // ctx.out() is an output iterator to write to.
f8deb5b9 Poul Sander 2022-01-15 13:55 227
      return presentation == 'f'
f8deb5b9 Poul Sander 2022-01-15 13:55 228
                ? format_to(ctx.out(), "({:.1f}, {:.1f})", p.x, p.y)
f8deb5b9 Poul Sander 2022-01-15 13:55 229
                : format_to(ctx.out(), "({:.1e}, {:.1e})", p.x, p.y);
f8deb5b9 Poul Sander 2022-01-15 13:55 230
    }
f8deb5b9 Poul Sander 2022-01-15 13:55 231
  };
f8deb5b9 Poul Sander 2022-01-15 13:55 232
f8deb5b9 Poul Sander 2022-01-15 13:55 233
Then you can pass objects of type ``point`` to any formatting function::
f8deb5b9 Poul Sander 2022-01-15 13:55 234
f8deb5b9 Poul Sander 2022-01-15 13:55 235
  point p = {1, 2};
f8deb5b9 Poul Sander 2022-01-15 13:55 236
  std::string s = fmt::format("{:f}", p);
f8deb5b9 Poul Sander 2022-01-15 13:55 237
  // s == "(1.0, 2.0)"
f8deb5b9 Poul Sander 2022-01-15 13:55 238
f8deb5b9 Poul Sander 2022-01-15 13:55 239
You can also reuse existing formatters via inheritance or composition, for
f8deb5b9 Poul Sander 2022-01-15 13:55 240
example::
f8deb5b9 Poul Sander 2022-01-15 13:55 241
f8deb5b9 Poul Sander 2022-01-15 13:55 242
  enum class color {red, green, blue};
f8deb5b9 Poul Sander 2022-01-15 13:55 243
f8deb5b9 Poul Sander 2022-01-15 13:55 244
  template <> struct fmt::formatter<color>: formatter<string_view> {
f8deb5b9 Poul Sander 2022-01-15 13:55 245
    // parse is inherited from formatter<string_view>.
f8deb5b9 Poul Sander 2022-01-15 13:55 246
    template <typename FormatContext>
f8deb5b9 Poul Sander 2022-01-15 13:55 247
    auto format(color c, FormatContext& ctx) {
f8deb5b9 Poul Sander 2022-01-15 13:55 248
      string_view name = "unknown";
f8deb5b9 Poul Sander 2022-01-15 13:55 249
      switch (c) {
f8deb5b9 Poul Sander 2022-01-15 13:55 250
      case color::red:   name = "red"; break;
f8deb5b9 Poul Sander 2022-01-15 13:55 251
      case color::green: name = "green"; break;
f8deb5b9 Poul Sander 2022-01-15 13:55 252
      case color::blue:  name = "blue"; break;
f8deb5b9 Poul Sander 2022-01-15 13:55 253
      }
f8deb5b9 Poul Sander 2022-01-15 13:55 254
      return formatter<string_view>::format(name, ctx);
f8deb5b9 Poul Sander 2022-01-15 13:55 255
    }
f8deb5b9 Poul Sander 2022-01-15 13:55 256
  };
f8deb5b9 Poul Sander 2022-01-15 13:55 257
f8deb5b9 Poul Sander 2022-01-15 13:55 258
Since ``parse`` is inherited from ``formatter<string_view>`` it will recognize
f8deb5b9 Poul Sander 2022-01-15 13:55 259
all string format specifications, for example
f8deb5b9 Poul Sander 2022-01-15 13:55 260
f8deb5b9 Poul Sander 2022-01-15 13:55 261
.. code-block:: c++
f8deb5b9 Poul Sander 2022-01-15 13:55 262
f8deb5b9 Poul Sander 2022-01-15 13:55 263
   fmt::format("{:>10}", color::blue)
f8deb5b9 Poul Sander 2022-01-15 13:55 264
f8deb5b9 Poul Sander 2022-01-15 13:55 265
will return ``"      blue"``.
f8deb5b9 Poul Sander 2022-01-15 13:55 266
f8deb5b9 Poul Sander 2022-01-15 13:55 267
You can also write a formatter for a hierarchy of classes::
f8deb5b9 Poul Sander 2022-01-15 13:55 268
f8deb5b9 Poul Sander 2022-01-15 13:55 269
  #include <type_traits>
f8deb5b9 Poul Sander 2022-01-15 13:55 270
  #include <fmt/format.h>
f8deb5b9 Poul Sander 2022-01-15 13:55 271
f8deb5b9 Poul Sander 2022-01-15 13:55 272
  struct A {
f8deb5b9 Poul Sander 2022-01-15 13:55 273
    virtual ~A() {}
f8deb5b9 Poul Sander 2022-01-15 13:55 274
    virtual std::string name() const { return "A"; }
f8deb5b9 Poul Sander 2022-01-15 13:55 275
  };
f8deb5b9 Poul Sander 2022-01-15 13:55 276
f8deb5b9 Poul Sander 2022-01-15 13:55 277
  struct B : A {
f8deb5b9 Poul Sander 2022-01-15 13:55 278
    virtual std::string name() const { return "B"; }
f8deb5b9 Poul Sander 2022-01-15 13:55 279
  };
f8deb5b9 Poul Sander 2022-01-15 13:55 280
f8deb5b9 Poul Sander 2022-01-15 13:55 281
  template <typename T>
f8deb5b9 Poul Sander 2022-01-15 13:55 282
  struct fmt::formatter<T, std::enable_if_t<std::is_base_of<A, T>::value, char>> :
f8deb5b9 Poul Sander 2022-01-15 13:55 283
      fmt::formatter<std::string> {
f8deb5b9 Poul Sander 2022-01-15 13:55 284
    template <typename FormatCtx>
f8deb5b9 Poul Sander 2022-01-15 13:55 285
    auto format(const A& a, FormatCtx& ctx) {
f8deb5b9 Poul Sander 2022-01-15 13:55 286
      return fmt::formatter<std::string>::format(a.name(), ctx);
f8deb5b9 Poul Sander 2022-01-15 13:55 287
    }
f8deb5b9 Poul Sander 2022-01-15 13:55 288
  };
f8deb5b9 Poul Sander 2022-01-15 13:55 289
f8deb5b9 Poul Sander 2022-01-15 13:55 290
  int main() {
f8deb5b9 Poul Sander 2022-01-15 13:55 291
    B b;
f8deb5b9 Poul Sander 2022-01-15 13:55 292
    A& a = b;
f8deb5b9 Poul Sander 2022-01-15 13:55 293
    fmt::print("{}", a); // prints "B"
f8deb5b9 Poul Sander 2022-01-15 13:55 294
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 295
f8deb5b9 Poul Sander 2022-01-15 13:55 296
If a type provides both a ``formatter`` specialization and an implicit
f8deb5b9 Poul Sander 2022-01-15 13:55 297
conversion to a formattable type, the specialization takes precedence over the
f8deb5b9 Poul Sander 2022-01-15 13:55 298
conversion.
f8deb5b9 Poul Sander 2022-01-15 13:55 299
f8deb5b9 Poul Sander 2022-01-15 13:55 300
.. doxygenclass:: fmt::basic_format_parse_context
f8deb5b9 Poul Sander 2022-01-15 13:55 301
   :members:
f8deb5b9 Poul Sander 2022-01-15 13:55 302
f8deb5b9 Poul Sander 2022-01-15 13:55 303
Literal-based API
f8deb5b9 Poul Sander 2022-01-15 13:55 304
-----------------
f8deb5b9 Poul Sander 2022-01-15 13:55 305
f8deb5b9 Poul Sander 2022-01-15 13:55 306
The following user-defined literals are defined in ``fmt/format.h``.
f8deb5b9 Poul Sander 2022-01-15 13:55 307
f8deb5b9 Poul Sander 2022-01-15 13:55 308
.. doxygenfunction:: operator""_format(const char *s, size_t n) -> detail::udl_formatter<char> 
f8deb5b9 Poul Sander 2022-01-15 13:55 309
f8deb5b9 Poul Sander 2022-01-15 13:55 310
.. doxygenfunction:: operator""_a(const char *s, size_t) -> detail::udl_arg<char>
f8deb5b9 Poul Sander 2022-01-15 13:55 311
f8deb5b9 Poul Sander 2022-01-15 13:55 312
Utilities
f8deb5b9 Poul Sander 2022-01-15 13:55 313
---------
f8deb5b9 Poul Sander 2022-01-15 13:55 314
f8deb5b9 Poul Sander 2022-01-15 13:55 315
.. doxygenfunction:: fmt::ptr(T p) -> const void*
f8deb5b9 Poul Sander 2022-01-15 13:55 316
.. doxygenfunction:: fmt::ptr(const std::unique_ptr<T> &p) -> const void*
f8deb5b9 Poul Sander 2022-01-15 13:55 317
.. doxygenfunction:: fmt::ptr(const std::shared_ptr<T> &p) -> const void*
f8deb5b9 Poul Sander 2022-01-15 13:55 318
f8deb5b9 Poul Sander 2022-01-15 13:55 319
.. doxygenfunction:: fmt::to_string(const T &value) -> std::string
f8deb5b9 Poul Sander 2022-01-15 13:55 320
f8deb5b9 Poul Sander 2022-01-15 13:55 321
.. doxygenfunction:: fmt::to_string_view(const Char *s) -> basic_string_view<Char>
f8deb5b9 Poul Sander 2022-01-15 13:55 322
f8deb5b9 Poul Sander 2022-01-15 13:55 323
.. doxygenfunction:: fmt::join(Range &&range, string_view sep) -> join_view<detail::iterator_t<Range>, detail::sentinel_t<Range>>
f8deb5b9 Poul Sander 2022-01-15 13:55 324
f8deb5b9 Poul Sander 2022-01-15 13:55 325
.. doxygenfunction:: fmt::join(It begin, Sentinel end, string_view sep) -> join_view<It, Sentinel>
f8deb5b9 Poul Sander 2022-01-15 13:55 326
f8deb5b9 Poul Sander 2022-01-15 13:55 327
.. doxygenfunction:: fmt::group_digits(T value) -> group_digits_view<T>
f8deb5b9 Poul Sander 2022-01-15 13:55 328
f8deb5b9 Poul Sander 2022-01-15 13:55 329
.. doxygenclass:: fmt::detail::buffer
f8deb5b9 Poul Sander 2022-01-15 13:55 330
   :members:
f8deb5b9 Poul Sander 2022-01-15 13:55 331
f8deb5b9 Poul Sander 2022-01-15 13:55 332
.. doxygenclass:: fmt::basic_memory_buffer
f8deb5b9 Poul Sander 2022-01-15 13:55 333
   :protected-members:
f8deb5b9 Poul Sander 2022-01-15 13:55 334
   :members:
f8deb5b9 Poul Sander 2022-01-15 13:55 335
f8deb5b9 Poul Sander 2022-01-15 13:55 336
System Errors
f8deb5b9 Poul Sander 2022-01-15 13:55 337
-------------
f8deb5b9 Poul Sander 2022-01-15 13:55 338
f8deb5b9 Poul Sander 2022-01-15 13:55 339
{fmt} does not use ``errno`` to communicate errors to the user, but it may call
f8deb5b9 Poul Sander 2022-01-15 13:55 340
system functions which set ``errno``. Users should not make any assumptions
f8deb5b9 Poul Sander 2022-01-15 13:55 341
about the value of ``errno`` being preserved by library functions.
f8deb5b9 Poul Sander 2022-01-15 13:55 342
f8deb5b9 Poul Sander 2022-01-15 13:55 343
.. doxygenfunction:: fmt::system_error
f8deb5b9 Poul Sander 2022-01-15 13:55 344
f8deb5b9 Poul Sander 2022-01-15 13:55 345
.. doxygenfunction:: fmt::format_system_error
f8deb5b9 Poul Sander 2022-01-15 13:55 346
f8deb5b9 Poul Sander 2022-01-15 13:55 347
Custom Allocators
f8deb5b9 Poul Sander 2022-01-15 13:55 348
-----------------
f8deb5b9 Poul Sander 2022-01-15 13:55 349
f8deb5b9 Poul Sander 2022-01-15 13:55 350
The {fmt} library supports custom dynamic memory allocators.
f8deb5b9 Poul Sander 2022-01-15 13:55 351
A custom allocator class can be specified as a template argument to
f8deb5b9 Poul Sander 2022-01-15 13:55 352
:class:`fmt::basic_memory_buffer`::
f8deb5b9 Poul Sander 2022-01-15 13:55 353
f8deb5b9 Poul Sander 2022-01-15 13:55 354
    using custom_memory_buffer = 
f8deb5b9 Poul Sander 2022-01-15 13:55 355
      fmt::basic_memory_buffer<char, fmt::inline_buffer_size, custom_allocator>;
f8deb5b9 Poul Sander 2022-01-15 13:55 356
f8deb5b9 Poul Sander 2022-01-15 13:55 357
It is also possible to write a formatting function that uses a custom
f8deb5b9 Poul Sander 2022-01-15 13:55 358
allocator::
f8deb5b9 Poul Sander 2022-01-15 13:55 359
f8deb5b9 Poul Sander 2022-01-15 13:55 360
    using custom_string =
f8deb5b9 Poul Sander 2022-01-15 13:55 361
      std::basic_string<char, std::char_traits<char>, custom_allocator>;
f8deb5b9 Poul Sander 2022-01-15 13:55 362
f8deb5b9 Poul Sander 2022-01-15 13:55 363
    custom_string vformat(custom_allocator alloc, fmt::string_view format_str,
f8deb5b9 Poul Sander 2022-01-15 13:55 364
                          fmt::format_args args) {
f8deb5b9 Poul Sander 2022-01-15 13:55 365
      auto buf = custom_memory_buffer(alloc);
f8deb5b9 Poul Sander 2022-01-15 13:55 366
      fmt::vformat_to(std::back_inserter(buf), format_str, args);
f8deb5b9 Poul Sander 2022-01-15 13:55 367
      return custom_string(buf.data(), buf.size(), alloc);
f8deb5b9 Poul Sander 2022-01-15 13:55 368
    }
f8deb5b9 Poul Sander 2022-01-15 13:55 369
f8deb5b9 Poul Sander 2022-01-15 13:55 370
    template <typename ...Args>
f8deb5b9 Poul Sander 2022-01-15 13:55 371
    inline custom_string format(custom_allocator alloc,
f8deb5b9 Poul Sander 2022-01-15 13:55 372
                                fmt::string_view format_str,
f8deb5b9 Poul Sander 2022-01-15 13:55 373
                                const Args& ... args) {
f8deb5b9 Poul Sander 2022-01-15 13:55 374
      return vformat(alloc, format_str, fmt::make_format_args(args...));
f8deb5b9 Poul Sander 2022-01-15 13:55 375
    }
f8deb5b9 Poul Sander 2022-01-15 13:55 376
f8deb5b9 Poul Sander 2022-01-15 13:55 377
The allocator will be used for the output container only. Formatting functions
f8deb5b9 Poul Sander 2022-01-15 13:55 378
normally don't do any allocations for built-in and string types except for
f8deb5b9 Poul Sander 2022-01-15 13:55 379
non-default floating-point formatting that occasionally falls back on
f8deb5b9 Poul Sander 2022-01-15 13:55 380
``sprintf``.
f8deb5b9 Poul Sander 2022-01-15 13:55 381
f8deb5b9 Poul Sander 2022-01-15 13:55 382
.. _ranges-api:
f8deb5b9 Poul Sander 2022-01-15 13:55 383
f8deb5b9 Poul Sander 2022-01-15 13:55 384
Ranges and Tuple Formatting
f8deb5b9 Poul Sander 2022-01-15 13:55 385
===========================
f8deb5b9 Poul Sander 2022-01-15 13:55 386
f8deb5b9 Poul Sander 2022-01-15 13:55 387
The library also supports convenient formatting of ranges and tuples::
f8deb5b9 Poul Sander 2022-01-15 13:55 388
f8deb5b9 Poul Sander 2022-01-15 13:55 389
  #include <fmt/ranges.h>
f8deb5b9 Poul Sander 2022-01-15 13:55 390
f8deb5b9 Poul Sander 2022-01-15 13:55 391
  std::tuple<char, int, float> t{'a', 1, 2.0f};
f8deb5b9 Poul Sander 2022-01-15 13:55 392
  // Prints "('a', 1, 2.0)"
f8deb5b9 Poul Sander 2022-01-15 13:55 393
  fmt::print("{}", t);
f8deb5b9 Poul Sander 2022-01-15 13:55 394
f8deb5b9 Poul Sander 2022-01-15 13:55 395
f8deb5b9 Poul Sander 2022-01-15 13:55 396
NOTE: currently, the overload of ``fmt::join`` for iterables exists in the main
f8deb5b9 Poul Sander 2022-01-15 13:55 397
``format.h`` header, but expect this to change in the future.
f8deb5b9 Poul Sander 2022-01-15 13:55 398
f8deb5b9 Poul Sander 2022-01-15 13:55 399
Using ``fmt::join``, you can separate tuple elements with a custom separator::
f8deb5b9 Poul Sander 2022-01-15 13:55 400
f8deb5b9 Poul Sander 2022-01-15 13:55 401
  #include <fmt/ranges.h>
f8deb5b9 Poul Sander 2022-01-15 13:55 402
f8deb5b9 Poul Sander 2022-01-15 13:55 403
  std::tuple<int, char> t = {1, 'a'};
f8deb5b9 Poul Sander 2022-01-15 13:55 404
  // Prints "1, a"
f8deb5b9 Poul Sander 2022-01-15 13:55 405
  fmt::print("{}", fmt::join(t, ", "));
f8deb5b9 Poul Sander 2022-01-15 13:55 406
f8deb5b9 Poul Sander 2022-01-15 13:55 407
.. _chrono-api:
f8deb5b9 Poul Sander 2022-01-15 13:55 408
f8deb5b9 Poul Sander 2022-01-15 13:55 409
Date and Time Formatting
f8deb5b9 Poul Sander 2022-01-15 13:55 410
========================
f8deb5b9 Poul Sander 2022-01-15 13:55 411
f8deb5b9 Poul Sander 2022-01-15 13:55 412
``fmt/chrono.h`` provides formatters for
f8deb5b9 Poul Sander 2022-01-15 13:55 413
f8deb5b9 Poul Sander 2022-01-15 13:55 414
* `std::chrono::duration <https://en.cppreference.com/w/cpp/chrono/duration>`_
f8deb5b9 Poul Sander 2022-01-15 13:55 415
* `std::chrono::time_point
f8deb5b9 Poul Sander 2022-01-15 13:55 416
  <https://en.cppreference.com/w/cpp/chrono/time_point>`_
f8deb5b9 Poul Sander 2022-01-15 13:55 417
* `std::tm <https://en.cppreference.com/w/cpp/chrono/c/tm>`_
f8deb5b9 Poul Sander 2022-01-15 13:55 418
f8deb5b9 Poul Sander 2022-01-15 13:55 419
The format syntax is described in :ref:`chrono-specs`.
f8deb5b9 Poul Sander 2022-01-15 13:55 420
f8deb5b9 Poul Sander 2022-01-15 13:55 421
**Example**::
f8deb5b9 Poul Sander 2022-01-15 13:55 422
f8deb5b9 Poul Sander 2022-01-15 13:55 423
  #include <fmt/chrono.h>
f8deb5b9 Poul Sander 2022-01-15 13:55 424
f8deb5b9 Poul Sander 2022-01-15 13:55 425
  int main() {
f8deb5b9 Poul Sander 2022-01-15 13:55 426
    std::time_t t = std::time(nullptr);
f8deb5b9 Poul Sander 2022-01-15 13:55 427
f8deb5b9 Poul Sander 2022-01-15 13:55 428
    // Prints "The date is 2020-11-07." (with the current date):
f8deb5b9 Poul Sander 2022-01-15 13:55 429
    fmt::print("The date is {:%Y-%m-%d}.", fmt::localtime(t));
f8deb5b9 Poul Sander 2022-01-15 13:55 430
f8deb5b9 Poul Sander 2022-01-15 13:55 431
    using namespace std::literals::chrono_literals;
f8deb5b9 Poul Sander 2022-01-15 13:55 432
f8deb5b9 Poul Sander 2022-01-15 13:55 433
    // Prints "Default format: 42s 100ms":
f8deb5b9 Poul Sander 2022-01-15 13:55 434
    fmt::print("Default format: {} {}\n", 42s, 100ms);
f8deb5b9 Poul Sander 2022-01-15 13:55 435
f8deb5b9 Poul Sander 2022-01-15 13:55 436
    // Prints "strftime-like format: 03:15:30":
f8deb5b9 Poul Sander 2022-01-15 13:55 437
    fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s);
f8deb5b9 Poul Sander 2022-01-15 13:55 438
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 439
f8deb5b9 Poul Sander 2022-01-15 13:55 440
.. doxygenfunction:: localtime(std::time_t time)
f8deb5b9 Poul Sander 2022-01-15 13:55 441
f8deb5b9 Poul Sander 2022-01-15 13:55 442
.. doxygenfunction:: gmtime(std::time_t time)
f8deb5b9 Poul Sander 2022-01-15 13:55 443
f8deb5b9 Poul Sander 2022-01-15 13:55 444
.. _compile-api:
f8deb5b9 Poul Sander 2022-01-15 13:55 445
f8deb5b9 Poul Sander 2022-01-15 13:55 446
Format string compilation
f8deb5b9 Poul Sander 2022-01-15 13:55 447
=========================
f8deb5b9 Poul Sander 2022-01-15 13:55 448
f8deb5b9 Poul Sander 2022-01-15 13:55 449
``fmt/compile.h`` provides format string compilation support when using
f8deb5b9 Poul Sander 2022-01-15 13:55 450
``FMT_COMPILE``. Format strings are parsed, checked and converted into efficient
f8deb5b9 Poul Sander 2022-01-15 13:55 451
formatting code at compile-time. This supports arguments of built-in and string
f8deb5b9 Poul Sander 2022-01-15 13:55 452
types as well as user-defined types with ``constexpr`` ``parse`` functions in
f8deb5b9 Poul Sander 2022-01-15 13:55 453
their ``formatter`` specializations. Format string compilation can generate more
f8deb5b9 Poul Sander 2022-01-15 13:55 454
binary code compared to the default API and is only recommended in places where
f8deb5b9 Poul Sander 2022-01-15 13:55 455
formatting is a performance bottleneck.
f8deb5b9 Poul Sander 2022-01-15 13:55 456
f8deb5b9 Poul Sander 2022-01-15 13:55 457
.. doxygendefine:: FMT_COMPILE
f8deb5b9 Poul Sander 2022-01-15 13:55 458
f8deb5b9 Poul Sander 2022-01-15 13:55 459
.. _color-api:
f8deb5b9 Poul Sander 2022-01-15 13:55 460
f8deb5b9 Poul Sander 2022-01-15 13:55 461
Terminal color and text style
f8deb5b9 Poul Sander 2022-01-15 13:55 462
=============================
f8deb5b9 Poul Sander 2022-01-15 13:55 463
f8deb5b9 Poul Sander 2022-01-15 13:55 464
``fmt/color.h`` provides support for terminal color and text style output.
f8deb5b9 Poul Sander 2022-01-15 13:55 465
f8deb5b9 Poul Sander 2022-01-15 13:55 466
.. doxygenfunction:: print(const text_style &ts, const S &format_str, const Args&... args)
f8deb5b9 Poul Sander 2022-01-15 13:55 467
f8deb5b9 Poul Sander 2022-01-15 13:55 468
.. doxygenfunction:: fg(detail::color_type)
f8deb5b9 Poul Sander 2022-01-15 13:55 469
f8deb5b9 Poul Sander 2022-01-15 13:55 470
.. doxygenfunction:: bg(detail::color_type)
f8deb5b9 Poul Sander 2022-01-15 13:55 471
f8deb5b9 Poul Sander 2022-01-15 13:55 472
.. _os-api:
f8deb5b9 Poul Sander 2022-01-15 13:55 473
f8deb5b9 Poul Sander 2022-01-15 13:55 474
System APIs
f8deb5b9 Poul Sander 2022-01-15 13:55 475
===========
f8deb5b9 Poul Sander 2022-01-15 13:55 476
f8deb5b9 Poul Sander 2022-01-15 13:55 477
.. doxygenclass:: fmt::ostream
f8deb5b9 Poul Sander 2022-01-15 13:55 478
   :members:
f8deb5b9 Poul Sander 2022-01-15 13:55 479
f8deb5b9 Poul Sander 2022-01-15 13:55 480
.. doxygenfunction:: fmt::windows_error
f8deb5b9 Poul Sander 2022-01-15 13:55 481
   :members:
f8deb5b9 Poul Sander 2022-01-15 13:55 482
f8deb5b9 Poul Sander 2022-01-15 13:55 483
.. _ostream-api:
f8deb5b9 Poul Sander 2022-01-15 13:55 484
f8deb5b9 Poul Sander 2022-01-15 13:55 485
``std::ostream`` Support
f8deb5b9 Poul Sander 2022-01-15 13:55 486
========================
f8deb5b9 Poul Sander 2022-01-15 13:55 487
f8deb5b9 Poul Sander 2022-01-15 13:55 488
``fmt/ostream.h`` provides ``std::ostream`` support including formatting of
f8deb5b9 Poul Sander 2022-01-15 13:55 489
user-defined types that have an overloaded insertion operator (``operator<<``)::
f8deb5b9 Poul Sander 2022-01-15 13:55 490
f8deb5b9 Poul Sander 2022-01-15 13:55 491
  #include <fmt/ostream.h>
f8deb5b9 Poul Sander 2022-01-15 13:55 492
f8deb5b9 Poul Sander 2022-01-15 13:55 493
  class date {
f8deb5b9 Poul Sander 2022-01-15 13:55 494
    int year_, month_, day_;
f8deb5b9 Poul Sander 2022-01-15 13:55 495
  public:
f8deb5b9 Poul Sander 2022-01-15 13:55 496
    date(int year, int month, int day): year_(year), month_(month), day_(day) {}
f8deb5b9 Poul Sander 2022-01-15 13:55 497
f8deb5b9 Poul Sander 2022-01-15 13:55 498
    friend std::ostream& operator<<(std::ostream& os, const date& d) {
f8deb5b9 Poul Sander 2022-01-15 13:55 499
      return os << d.year_ << '-' << d.month_ << '-' << d.day_;
f8deb5b9 Poul Sander 2022-01-15 13:55 500
    }
f8deb5b9 Poul Sander 2022-01-15 13:55 501
  };
f8deb5b9 Poul Sander 2022-01-15 13:55 502
f8deb5b9 Poul Sander 2022-01-15 13:55 503
  std::string s = fmt::format("The date is {}", date(2012, 12, 9));
f8deb5b9 Poul Sander 2022-01-15 13:55 504
  // s == "The date is 2012-12-9"
f8deb5b9 Poul Sander 2022-01-15 13:55 505
f8deb5b9 Poul Sander 2022-01-15 13:55 506
{fmt} only supports insertion operators that are defined in the same namespaces
f8deb5b9 Poul Sander 2022-01-15 13:55 507
as the types they format and can be found with the argument-dependent lookup.
f8deb5b9 Poul Sander 2022-01-15 13:55 508
f8deb5b9 Poul Sander 2022-01-15 13:55 509
.. doxygenfunction:: print(std::basic_ostream<Char> &os, const S &format_str, Args&&... args)
f8deb5b9 Poul Sander 2022-01-15 13:55 510
f8deb5b9 Poul Sander 2022-01-15 13:55 511
.. _printf-api:
f8deb5b9 Poul Sander 2022-01-15 13:55 512
f8deb5b9 Poul Sander 2022-01-15 13:55 513
``printf`` Formatting
f8deb5b9 Poul Sander 2022-01-15 13:55 514
=====================
f8deb5b9 Poul Sander 2022-01-15 13:55 515
f8deb5b9 Poul Sander 2022-01-15 13:55 516
The header ``fmt/printf.h`` provides ``printf``-like formatting functionality.
f8deb5b9 Poul Sander 2022-01-15 13:55 517
The following functions use `printf format string syntax
f8deb5b9 Poul Sander 2022-01-15 13:55 518
<https://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html>`_ with
f8deb5b9 Poul Sander 2022-01-15 13:55 519
the POSIX extension for positional arguments. Unlike their standard
f8deb5b9 Poul Sander 2022-01-15 13:55 520
counterparts, the ``fmt`` functions are type-safe and throw an exception if an
f8deb5b9 Poul Sander 2022-01-15 13:55 521
argument type doesn't match its format specification.
f8deb5b9 Poul Sander 2022-01-15 13:55 522
f8deb5b9 Poul Sander 2022-01-15 13:55 523
.. doxygenfunction:: printf(const S &format_str, const T&... args)
f8deb5b9 Poul Sander 2022-01-15 13:55 524
f8deb5b9 Poul Sander 2022-01-15 13:55 525
.. doxygenfunction:: fprintf(std::FILE *f, const S &fmt, const T&... args) -> int
f8deb5b9 Poul Sander 2022-01-15 13:55 526
f8deb5b9 Poul Sander 2022-01-15 13:55 527
.. doxygenfunction:: sprintf(const S&, const T&...)
f8deb5b9 Poul Sander 2022-01-15 13:55 528
f8deb5b9 Poul Sander 2022-01-15 13:55 529
.. _xchar-api:
f8deb5b9 Poul Sander 2022-01-15 13:55 530
f8deb5b9 Poul Sander 2022-01-15 13:55 531
``wchar_t`` Support
f8deb5b9 Poul Sander 2022-01-15 13:55 532
===================
f8deb5b9 Poul Sander 2022-01-15 13:55 533
f8deb5b9 Poul Sander 2022-01-15 13:55 534
The optional header ``fmt/xchar.h`` provides support for ``wchar_t`` and exotic
f8deb5b9 Poul Sander 2022-01-15 13:55 535
character types.
f8deb5b9 Poul Sander 2022-01-15 13:55 536
f8deb5b9 Poul Sander 2022-01-15 13:55 537
.. doxygenstruct:: fmt::is_char
f8deb5b9 Poul Sander 2022-01-15 13:55 538
f8deb5b9 Poul Sander 2022-01-15 13:55 539
.. doxygentypedef:: fmt::wstring_view
f8deb5b9 Poul Sander 2022-01-15 13:55 540
f8deb5b9 Poul Sander 2022-01-15 13:55 541
.. doxygentypedef:: fmt::wformat_context
f8deb5b9 Poul Sander 2022-01-15 13:55 542
f8deb5b9 Poul Sander 2022-01-15 13:55 543
.. doxygenfunction:: fmt::to_wstring(const T &value)
f8deb5b9 Poul Sander 2022-01-15 13:55 544
f8deb5b9 Poul Sander 2022-01-15 13:55 545
Compatibility with C++20 ``std::format``
f8deb5b9 Poul Sander 2022-01-15 13:55 546
========================================
f8deb5b9 Poul Sander 2022-01-15 13:55 547
f8deb5b9 Poul Sander 2022-01-15 13:55 548
{fmt} implements nearly all of the `C++20 formatting library
f8deb5b9 Poul Sander 2022-01-15 13:55 549
<https://en.cppreference.com/w/cpp/utility/format>`_ with the following
f8deb5b9 Poul Sander 2022-01-15 13:55 550
differences:
f8deb5b9 Poul Sander 2022-01-15 13:55 551
f8deb5b9 Poul Sander 2022-01-15 13:55 552
* Names are defined in the ``fmt`` namespace instead of ``std`` to avoid
f8deb5b9 Poul Sander 2022-01-15 13:55 553
  collisions with standard library implementations.
f8deb5b9 Poul Sander 2022-01-15 13:55 554
* Width calculation doesn't use grapheme clusterization. The latter has been
f8deb5b9 Poul Sander 2022-01-15 13:55 555
  implemented in a separate branch but hasn't been integrated yet.
f8deb5b9 Poul Sander 2022-01-15 13:55 556
* Most C++20 chrono types are not supported yet.
1970-01-01 00:00 557