summaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/bits/basic_string.tcc
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2021-10-15 22:01:25 +0100
committerJonathan Wakely <jwakely@redhat.com>2021-10-16 00:44:16 +0100
commit929abc7fe3ad4491ac412ca232e055618559f268 (patch)
tree09aebd2745d678c5c9bf09241b6b43e6cae3714a /libstdc++-v3/include/bits/basic_string.tcc
parent79802c5dcc043a515f429bb2bec7573b8537c32a (diff)
downloadgcc-929abc7fe3ad4491ac412ca232e055618559f268.tar.gz
libstdc++: Define std::basic_string::resize_and_overwrite for C++23 (P1072R10)
A recently approved change for the C++23 working draft. libstdc++-v3/ChangeLog: * include/bits/basic_string.h (__cpp_lib_string_resize_and_overwrite): Define for C++23. (basic_string::resize_and_overwrite): Declare. * include/bits/basic_string.tcc (basic_string::resize_and_overwrite): Define. * include/std/version (__cpp_lib_resize_and_overwrite): Define for C++23. * testsuite/21_strings/basic_string/capacity/char/resize_and_overwrite.cc: New test.
Diffstat (limited to 'libstdc++-v3/include/bits/basic_string.tcc')
-rw-r--r--libstdc++-v3/include/bits/basic_string.tcc31
1 files changed, 31 insertions, 0 deletions
diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc
index 371f1c3ccee..98c386239f9 100644
--- a/libstdc++-v3/include/bits/basic_string.tcc
+++ b/libstdc++-v3/include/bits/basic_string.tcc
@@ -515,6 +515,37 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return __n;
}
+#if __cplusplus > 202002L
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ template<typename _Operation>
+ constexpr void
+ basic_string<_CharT, _Traits, _Alloc>::
+ resize_and_overwrite(size_type __n, _Operation __op)
+ {
+ const size_type __capacity = capacity();
+ _CharT* __p;
+ if (__n > __capacity)
+ {
+ __p = _M_create(__n, __capacity);
+ this->_S_copy(__p, _M_data(), length()); // exclude trailing null
+ _M_dispose();
+ _M_data(__p);
+ _M_capacity(__n);
+ }
+ else
+ __p = _M_data();
+ struct _Terminator {
+ ~_Terminator() { _M_this->_M_set_length(_M_r); }
+ basic_string* _M_this;
+ size_type _M_r;
+ };
+ _Terminator __term{this};
+ const size_type __n2 [[maybe_unused]] = __n;
+ __term._M_r = std::move(__op)(__p, __n);
+ _GLIBCXX_DEBUG_ASSERT(__term._M_r >= 0 && __term._M_r <= __n2);
+ }
+#endif // C++23
+
#endif // _GLIBCXX_USE_CXX11_ABI
template<typename _CharT, typename _Traits, typename _Alloc>