]> gcc.gnu.org Git - gcc.git/commitdiff
libstdc++: Split std::basic_string::_M_use_local_data into two functions
authorJonathan Wakely <jwakely@redhat.com>
Fri, 29 Sep 2023 11:12:22 +0000 (12:12 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Sat, 21 Oct 2023 10:54:00 +0000 (11:54 +0100)
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.

libstdc++-v3/include/bits/basic_string.h
libstdc++-v3/include/bits/basic_string.tcc

index 4f94cd967cf5035c7a245b11a671136c462e7b4a..0fa32afeb846d6059dda5e98e407291ab9c292e1 100644 (file)
@@ -353,13 +353,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();
       }
@@ -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());
index 4bc98f2aea7f4f71612a3214fe327b1eb45ada35..f0a44e5e881509c30e301c447034135c4c51d797 100644 (file)
@@ -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());
        }
This page took 0.075658 seconds and 5 git commands to generate.