|
| template<class Arg , class... Args> |
| size_t | c4::format (substr buf, csubstr fmt, Arg const &a, Args const &...more) |
| | Using a format string, serialize the arguments into the given fixed-size buffer. More...
|
| |
| template<class... Args> |
| substr | c4::format_sub (substr buf, csubstr fmt, Args const &...args) |
| | like c4::format() but return a substr instead of a size More...
|
| |
| template<class CharOwningContainer , class... Args> |
| void | c4::formatrs (CharOwningContainer *cont, csubstr fmt, Args const &...args) |
| | format+resize: like c4::format(), but receives a container, and resizes it as needed to contain the result. More...
|
| |
| template<class CharOwningContainer , class... Args> |
| CharOwningContainer | c4::formatrs (csubstr fmt, Args const &...args) |
| | format+resize: like c4::format(), but create a new container with the result. More...
|
| |
| template<class CharOwningContainer , class... Args> |
| csubstr | c4::formatrs_append (CharOwningContainer *cont, csubstr fmt, Args const &...args) |
| | format+resize+append: like c4::format(), but receives a container, and appends the arguments, resizing the container as needed to contain the result. More...
|
| |
template<class Arg , class... Args>
Using a format string, serialize the arguments into the given fixed-size buffer.
The buffer size is strictly respected: no writes will occur beyond its end. In the format string, each argument is marked with a compact curly-bracket pair "{}". This pair does not take any interior sequence numbers or extra formatting arguments inside it (contrary to eg the C++20 std::format implementation or the Python formatting facilities). To enable argument customization, use the formatting facilities in Format specifiers wrapping the arguments passed to this function.
- Returns
- the number of bytes needed to write into the buffer.
- See also
- c4::formatrs() if instead of a fixed-size buffer, a resizeable container is desired
-
c4::unformat() for the inverse function
-
c4::cat() if no format or separator is needed
-
c4::catsep() if no format is needed, but a separator must be used
For example:
c4::format(buf,
"the {} drank {} {}",
"partier", 5,
"beers");
c4::format(buf,
"the {} drank {} {}",
"programmer", 6,
"coffees");
Using Format specifiers enables control of the result. For example:
- Note
- Arguments beyond the last curly bracket pair are silently ignored. Curly bracket pairs without a corresponding argument are printed as part of the result.
c4::format(buf,
"the {} drank {} {}",
"partier", 5,
"beers",
"and nothing else");
c4::format(buf,
"the {} drank {} {} this is ignored: {}",
"programmer", 6,
"coffees");
-
The curly bracket pair cannot be escaped, but can of course be placed into the result by passing an "{}" argument in its place, or if it is provided beyond the last argument passed to the function (see prior note).
c4::format(buf,
"let's show {} on the result and then {}",
"{}",
"this");
-
The arguments to format are restricted (legal because they are rvalues). This may require a workaround when arguments of type char[]/const char[] are passed repeatedly to the function. For example,
const char str[] =
"Hi! ";
It is possible to work around the problem by suppressing -Wrestrict or by using the decayed type char* or const char*, or even wrapping the argument in a csubstr(): const char str[] = "Hi! ";
Definition at line 936 of file format.hpp.
Referenced by c4::format_sub(), c4::formatrs(), c4::formatrs_append(), sample_formatting(), and to_chars().
938 size_t pos = fmt.find(
"{}");
941 size_t num =
to_chars(buf, fmt.first(pos));
943 buf = buf.len >= num ? buf.sub(num) :
substr{};
946 buf = buf.len >= num ? buf.sub(num) :
substr{};
947 num =
format(buf, fmt.sub(pos + 2), more...);
basic_substring< char > substr
a mutable string view
size_t to_chars(substr buf, fmt::center_< T > const &align)
template<class CharOwningContainer , class... Args>
| void c4::formatrs |
( |
CharOwningContainer * |
cont, |
|
|
csubstr |
fmt, |
|
|
Args const &... |
args |
|
) |
| |
|
inline |
format+resize: like c4::format(), but receives a container, and resizes it as needed to contain the result.
The container is overwritten. To append to the container use c4::formatrs_append().
- See also
- c4::format()
-
c4::formatrs_append()
- Note
- The arguments to format are restricted (legal because they are rvalues). This may require a workaround when arguments of type char[]/const char[] are passed repeatedly to the function. For example,
const char str[] =
"Hi! ";
It is possible to work around the problem by suppressing -Wrestrict or by using the decayed type char* or const char*, or even wrapping the argument in a csubstr(): const char str[] =
"Hi! ";
Definition at line 1263 of file format.hpp.
Referenced by c4::formatrs(), and sample_formatting().
1265 cont->resize(cont->capacity());
1268 size_t ret =
format(buf, fmt, args...);
substr to_substr(char(&s)[N]) noexcept
basic_substring< char > substr
a mutable string view
template<class CharOwningContainer , class... Args>
| csubstr c4::formatrs_append |
( |
CharOwningContainer * |
cont, |
|
|
csubstr |
fmt, |
|
|
Args const &... |
args |
|
) |
| |
|
inline |
format+resize+append: like c4::format(), but receives a container, and appends the arguments, resizing the container as needed to contain the result.
The buffer is appended to.
- Returns
- the region newly appended to the original container
- Note
- The arguments to format are restricted (legal because they are rvalues). This may require a workaround when arguments of type char[]/const char[] are passed repeatedly to the function. For example,
const char str[] =
"Hi! ";
It is possible to work around the problem by suppressing -Wrestrict or by using the decayed type char* or const char*, or even wrapping the argument in a csubstr(): const char str[] =
"Hi! ";
Definition at line 1330 of file format.hpp.
Referenced by sample_formatting().
1332 const size_t pos = cont->size();
1333 C4_SUPPRESS_WARNING_GCC_WITH_PUSH(
"-Warray-bounds")
1334 cont->resize(cont->capacity());
1335 C4_SUPPRESS_WARNING_GCC_POP
1338 size_t ret =
format(buf, fmt, args...);
1339 cont->resize(pos + ret);
1342 return
to_csubstr(*cont).range(pos, cont->size());
substr to_substr(char(&s)[N]) noexcept
csubstr to_csubstr(const char(&s)[N]) noexcept
basic_substring< char > substr
a mutable string view