aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2023-09-29 12:12:22 +0100
committerJonathan Wakely <jwakely@redhat.com>2023-10-21 11:54:00 +0100
commit405a4140fc30bce86b1ec885a98bb17704e0c8c6 (patch)
tree8cbd35d9330589d64c49ef983045c872ea563a84
parentbe34a8b538c0f04b11a428bd1a9340eb19dec13f (diff)
downloadgcc-405a4140fc30bce86b1ec885a98bb17704e0c8c6.zip
gcc-405a4140fc30bce86b1ec885a98bb17704e0c8c6.tar.gz
gcc-405a4140fc30bce86b1ec885a98bb17704e0c8c6.tar.bz2
libstdc++: Split std::basic_string::_M_use_local_data into two functions
This splits out the activate-the-union-member-for-constexpr logic from _M_use_local_data, so that it can be used separately in cases that don't need to use std::pointer_traits<pointer>::pointer_to to obtain the return value. This leaves only three uses of _M_use_local_data() which are all of the same form: __s._M_data(_M_use_local_data()); __s._M_set_length(0); We could remove _M_use_local_data() and change those three places to use a new _M_reset() function that does: _M_init_local_buf(); _M_data(_M_local_data()); _M_set_length(0); This is left for a future change. libstdc++-v3/ChangeLog: * include/bits/basic_string.h (_M_init_local_buf()): New function. (_M_use_local_data()): Use _M_init_local_buf. (basic_string(), basic_string(const Alloc&)) (basic_string(basic_string&&)) (basic_string(basic_string&&, const Alloc&)): Use _M_init_local_buf instead of _M_use_local_data(). * include/bits/basic_string.tcc (swap(basic_string&)) (_M_construct(InIter, InIter, input_iterator_tag)) (_M_construct(InIter, InIter, forward_iterator_tag)) (_M_construct(size_type, CharT), reserve()): Likewise.
-rw-r--r--libstdc++-v3/include/bits/basic_string.h22
-rw-r--r--libstdc++-v3/include/bits/basic_string.tcc19
2 files changed, 26 insertions, 15 deletions
diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h
index 4f94cd9..0fa32af 100644
--- a/libstdc++-v3/include/bits/basic_string.h
+++ b/libstdc++-v3/include/bits/basic_string.h
@@ -353,14 +353,24 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
// Ensure that _M_local_buf is the active member of the union.
__attribute__((__always_inline__))
_GLIBCXX14_CONSTEXPR
- pointer
- _M_use_local_data() _GLIBCXX_NOEXCEPT
+ void
+ _M_init_local_buf() _GLIBCXX_NOEXCEPT
{
#if __cpp_lib_is_constant_evaluated
if (std::is_constant_evaluated())
for (size_type __i = 0; __i <= _S_local_capacity; ++__i)
_M_local_buf[__i] = _CharT();
#endif
+ }
+
+ __attribute__((__always_inline__))
+ _GLIBCXX14_CONSTEXPR
+ pointer
+ _M_use_local_data() _GLIBCXX_NOEXCEPT
+ {
+#if __cpp_lib_is_constant_evaluated
+ _M_init_local_buf();
+#endif
return _M_local_data();
}
@@ -522,7 +532,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
_GLIBCXX_NOEXCEPT_IF(is_nothrow_default_constructible<_Alloc>::value)
: _M_dataplus(_M_local_data())
{
- _M_use_local_data();
+ _M_init_local_buf();
_M_set_length(0);
}
@@ -534,7 +544,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
basic_string(const _Alloc& __a) _GLIBCXX_NOEXCEPT
: _M_dataplus(_M_local_data(), __a)
{
- _M_use_local_data();
+ _M_init_local_buf();
_M_set_length(0);
}
@@ -678,7 +688,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
{
if (__str._M_is_local())
{
- (void)_M_use_local_data();
+ _M_init_local_buf();
traits_type::copy(_M_local_buf, __str._M_local_buf,
__str.length() + 1);
}
@@ -718,7 +728,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
{
if (__str._M_is_local())
{
- (void)_M_use_local_data();
+ _M_init_local_buf();
traits_type::copy(_M_local_buf, __str._M_local_buf,
__str.length() + 1);
_M_length(__str.length());
diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc
index 4bc98f2..f0a44e5 100644
--- a/libstdc++-v3/include/bits/basic_string.tcc
+++ b/libstdc++-v3/include/bits/basic_string.tcc
@@ -79,7 +79,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
else if (__s.length())
{
- (void)_M_use_local_data();
+ _M_init_local_buf();
traits_type::copy(_M_local_buf, __s._M_local_buf,
__s.length() + 1);
_M_length(__s.length());
@@ -88,7 +88,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
else if (length())
{
- (void)__s._M_use_local_data();
+ __s._M_init_local_buf();
traits_type::copy(__s._M_local_buf, _M_local_buf,
length() + 1);
__s._M_length(length());
@@ -99,7 +99,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
else
{
const size_type __tmp_capacity = __s._M_allocated_capacity;
- (void)__s._M_use_local_data();
+ __s._M_init_local_buf();
traits_type::copy(__s._M_local_buf, _M_local_buf,
length() + 1);
_M_data(__s._M_data());
@@ -111,7 +111,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
const size_type __tmp_capacity = _M_allocated_capacity;
if (__s._M_is_local())
{
- (void)_M_use_local_data();
+ _M_init_local_buf();
traits_type::copy(_M_local_buf, __s._M_local_buf,
__s.length() + 1);
__s._M_data(_M_data());
@@ -174,11 +174,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
size_type __len = 0;
size_type __capacity = size_type(_S_local_capacity);
- pointer __p = _M_use_local_data();
+ _M_init_local_buf();
while (__beg != __end && __len < __capacity)
{
- __p[__len++] = *__beg;
+ _M_local_buf[__len++] = *__beg;
++__beg;
}
@@ -230,7 +230,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_capacity(__dnew);
}
else
- _M_use_local_data();
+ _M_init_local_buf();
// Check for out_of_range and length_error exceptions.
struct _Guard
@@ -263,7 +263,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_capacity(__n);
}
else
- _M_use_local_data();
+ _M_init_local_buf();
if (__n)
this->_S_assign(_M_data(), __n, __c);
@@ -372,7 +372,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
if (__length <= size_type(_S_local_capacity))
{
- this->_S_copy(_M_use_local_data(), _M_data(), __length + 1);
+ _M_init_local_buf();
+ this->_S_copy(_M_local_buf, _M_data(), __length + 1);
_M_destroy(__capacity);
_M_data(_M_local_data());
}