libstdc++: Add Doxygen comment for string::resize_and_overwite

This is a complicated API that should be clearly documented.

Also improve the comment on basic_ios::_M_setstate.

libstdc++-v3/ChangeLog:

	* include/bits/basic_ios.h (basic_ios::_M_setstate): Add
	caveat to comment.
	* include/bits/basic_string.h (resize_and_overwrite): Add
	doxygen comment.
This commit is contained in:
Jonathan Wakely 2023-02-23 15:50:28 +00:00
parent ce83c3e492
commit dfa85beebf
2 changed files with 31 additions and 2 deletions

View file

@ -157,9 +157,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
setstate(iostate __state)
{ this->clear(this->rdstate() | __state); }
// Flip the internal state on for the proper state bits, then
// Flips the internal state on for the proper state bits, then
// rethrows the propagated exception if bit also set in
// exceptions().
// exceptions(). Must only be called within a catch handler.
void
_M_setstate(iostate __state)
{

View file

@ -1117,6 +1117,35 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
#if __cplusplus > 202002L
#define __cpp_lib_string_resize_and_overwrite 202110L
/** Resize the string and call a function to fill it.
*
* @param __n The maximum size requested.
* @param __op A callable object that writes characters to the string.
*
* This is a low-level function that is easy to misuse, be careful.
*
* Calling `str.resize_and_overwrite(n, op)` will reserve at least `n`
* characters in `str`, evaluate `n2 = std::move(op)(str.data(), n)`,
* and finally set the string length to `n2` (adding a null terminator
* at the end). The function object `op` is allowed to write to the
* extra capacity added by the initial reserve operation, which is not
* allowed if you just call `str.reserve(n)` yourself.
*
* This can be used to efficiently fill a `string` buffer without the
* overhead of zero-initializing characters that will be overwritten
* anyway.
*
* The callable `op` must not access the string directly (only through
* the pointer passed as its first argument), must not write more than
* `n` characters to the string, must return a value no greater than `n`,
* and must ensure that all characters up to the returned length are
* valid after it returns (i.e. there must be no uninitialized values
* left in the string after the call, because accessing them would
* have undefined behaviour). If `op` exits by throwing an exception
* the behaviour is undefined.
*
* @since C++23
*/
template<typename _Operation>
constexpr void
resize_and_overwrite(size_type __n, _Operation __op);