public inbox for libstdc++-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-8010] libstdc++: Split std::basic_string::_M_use_local_data into two functions
@ 2023-11-08 13:18 Jonathan Wakely
0 siblings, 0 replies; only message in thread
From: Jonathan Wakely @ 2023-11-08 13:18 UTC (permalink / raw)
To: gcc-cvs, libstdc++-cvs
https://gcc.gnu.org/g:4b4f1981cc687338cfbe8ec9ec2ea5a4ae6598a5
commit r13-8010-g4b4f1981cc687338cfbe8ec9ec2ea5a4ae6598a5
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Fri Sep 29 12:12:22 2023 +0100
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.
(cherry picked from commit 405a4140fc30bce86b1ec885a98bb17704e0c8c6)
Diff:
---
libstdc++-v3/include/bits/basic_string.h | 22 ++++++++++++++++------
libstdc++-v3/include/bits/basic_string.tcc | 19 ++++++++++---------
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 11b62af8fb2..b73991d96da 100644
--- a/libstdc++-v3/include/bits/basic_string.h
+++ b/libstdc++-v3/include/bits/basic_string.h
@@ -344,13 +344,23 @@ _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();
}
@@ -513,7 +523,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);
}
@@ -525,7 +535,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);
}
@@ -669,7 +679,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);
}
@@ -709,7 +719,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 3495a69df6b..d7560f594c0 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());
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-11-08 13:18 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-08 13:18 [gcc r13-8010] libstdc++: Split std::basic_string::_M_use_local_data into two functions Jonathan Wakely
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).