rapidyaml 0.14.0
parse and emit YAML, and do it fast
Loading...
Searching...
No Matches
catsep: cat arguments to string with separator

Functions

template<class Sep, class Arg, class... Args>
size_t c4::catsep (substr buf, Sep const &sep, Arg const &a, Args const &...more)
 serialize the arguments, concatenating them to the given fixed-size buffer, using a separator between each argument.
template<class... Args>
substr c4::catsep_sub (substr buf, Args &&...args)
 like c4::catsep() but return a substr instead of a size
template<class CharOwningContainer, class Sep, class... Args>
void c4::catseprs (CharOwningContainer *cont, Sep const &sep, Args const &...args)
 catsep+resize: like c4::catsep(), but receives a container, and resizes it as needed to contain the result.
template<class CharOwningContainer, class Sep, class... Args>
CharOwningContainer c4::catseprs (Sep const &sep, Args const &...args)
 catsep+resize: like c4::catsep(), but create a new container with the result.
template<class CharOwningContainer, class Sep, class... Args>
csubstr c4::catseprs_append (CharOwningContainer *cont, Sep const &sep, Args const &...args)
 catsep+resize+append: like c4::catsep(), but receives a container, and appends the arguments, resizing the container as needed to contain the result.

Detailed Description

Function Documentation

◆ catsep()

template<class Sep, class Arg, class... Args>
size_t c4::catsep ( substr buf,
Sep const & sep,
Arg const & a,
Args const &... more )

serialize the arguments, concatenating them to the given fixed-size buffer, using a separator between each argument.

The buffer size is strictly respected: no writes will occur beyond its end.

Returns
the number of characters needed to write all the arguments into the buffer.
See also
c4::catseprs() if instead of a fixed-size buffer, a resizeable container is desired
c4::uncatsep() for the inverse function (ie, reading instead of writing)
c4::cat() if no separator is needed
c4::format() if a format string is desired
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! ";
cat(buf, str, str, str); // compile error: 'passing argument 2 to ‘restrict’-qualified parameter aliases with arguments 3, 4'
size_t cat(substr buf, Arg const &a, Args const &...more)
serialize the arguments, concatenating them to the given fixed-size buffer.
Definition format.hpp:649
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! ";
csubstr ss = to_csubstr(str);
cat(buf, ss, ss, ss); // ok! compiles cleanly
csubstr to_csubstr(const char(&s)[N]) noexcept
Definition substr.hpp:2381
basic_substring< const char > csubstr
an immutable string view
Definition substr.hpp:2357

Definition at line 774 of file format.hpp.

775{
776 size_t num = to_chars(buf, a);
777 buf = buf.len >= num ? buf.sub(num) : substr{};
778 num += detail::catsep_more(buf, sep, more...);
779 return num;
780}
basic_substring< char > substr
a mutable string view
Definition substr.hpp:2356
size_t to_chars(substr buf, uint8_t v) noexcept
size_t len
the length of the substring
Definition substr.hpp:218
basic_substring sub(size_t first) const noexcept
return [first,len[
Definition substr.hpp:503

◆ catsep_sub()

template<class... Args>
substr c4::catsep_sub ( substr buf,
Args &&... args )

like c4::catsep() but return a substr instead of a size

See also
c4::catsep(). c4::uncatsep() is the inverse of c4::catsep().

Definition at line 786 of file format.hpp.

787{
788 size_t sz = catsep(buf, std::forward<Args>(args)...);
789 C4_CHECK(sz <= buf.len);
790 return {buf.str, sz <= buf.len ? sz : buf.len};
791}
size_t catsep(substr buf, Sep const &sep, Arg const &a, Args const &...more)
serialize the arguments, concatenating them to the given fixed-size buffer, using a separator between...
Definition format.hpp:774
C * str
a restricted pointer to the first character of the substring
Definition substr.hpp:216

◆ catseprs() [1/2]

template<class CharOwningContainer, class Sep, class... Args>
void c4::catseprs ( CharOwningContainer * cont,
Sep const & sep,
Args const &... args )
inline

catsep+resize: like c4::catsep(), but receives a container, and resizes it as needed to contain the result.

The container is overwritten. To append to the container use c4::catseprs_append().

See also
c4::catsep()
c4::catseprs_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! ";
cat(buf, str, str, str); // compile error: 'passing argument 2 to ‘restrict’-qualified parameter aliases with arguments 3, 4'
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! ";
csubstr ss = to_csubstr(str);
cat(buf, ss, ss, ss); // ok! compiles cleanly

Definition at line 1152 of file format.hpp.

1153{
1154 cont->resize(cont->capacity()); // improve the odds of fitting in the original buffer
1155retry:
1156 substr buf = to_substr(*cont);
1157 size_t ret = catsep(buf, sep, args...);
1158 cont->resize(ret);
1159 if(ret > buf.len)
1160 goto retry;
1161}
substr to_substr(char(&s)[N]) noexcept
Definition substr.hpp:2377

◆ catseprs() [2/2]

template<class CharOwningContainer, class Sep, class... Args>
CharOwningContainer c4::catseprs ( Sep const & sep,
Args const &... args )
inline

catsep+resize: like c4::catsep(), but create a new container with the result.

Returns
the requested 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! ";
cat(buf, str, str, str); // compile error: 'passing argument 2 to ‘restrict’-qualified parameter aliases with arguments 3, 4'
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! ";
csubstr ss = to_csubstr(str);
cat(buf, ss, ss, ss); // ok! compiles cleanly

Definition at line 1187 of file format.hpp.

1188{
1189 CharOwningContainer cont;
1190 catseprs(&cont, sep, args...);
1191 return cont;
1192}
void catseprs(CharOwningContainer *cont, Sep const &sep, Args const &...args)
catsep+resize: like c4::catsep(), but receives a container, and resizes it as needed to contain the r...
Definition format.hpp:1152

◆ catseprs_append()

template<class CharOwningContainer, class Sep, class... Args>
csubstr c4::catseprs_append ( CharOwningContainer * cont,
Sep const & sep,
Args const &... args )
inline

catsep+resize+append: like c4::catsep(), but receives a container, and appends the arguments, resizing the container as needed to contain the result.

The buffer is appended to.

Returns
a csubstr of the appended part
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! ";
cat(buf, str, str, str); // compile error: 'passing argument 2 to ‘restrict’-qualified parameter aliases with arguments 3, 4'
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! ";
csubstr ss = to_csubstr(str);
cat(buf, ss, ss, ss); // ok! compiles cleanly

Definition at line 1220 of file format.hpp.

1221{
1222 const size_t pos = cont->size();
1223 cont->resize(cont->capacity()); // improve the odds of fitting in the original buffer
1224retry:
1225 substr buf = to_substr(*cont).sub(pos);
1226 size_t ret = catsep(buf, sep, args...);
1227 cont->resize(pos + ret);
1228 if(ret > buf.len)
1229 goto retry;
1230 return to_csubstr(*cont).range(pos, cont->size());
1231}
basic_substring range(size_t first, size_t last=npos) const noexcept
return [first,last[.
Definition substr.hpp:520