diff options
Diffstat (limited to 'libcxx/include/string')
| -rw-r--r-- | libcxx/include/string | 33 | 
1 files changed, 18 insertions, 15 deletions
diff --git a/libcxx/include/string b/libcxx/include/string index 8f80afbc..ede4246 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -644,6 +644,7 @@ basic_string<char32_t> operator""s( const char32_t *str, size_t len );  #  include <__utility/forward.h>  #  include <__utility/is_pointer_in_range.h>  #  include <__utility/move.h> +#  include <__utility/no_destroy.h>  #  include <__utility/scope_guard.h>  #  include <__utility/swap.h>  #  include <climits> @@ -914,6 +915,11 @@ private:    union __rep {      __short __s;      __long __l; + +    __rep() = default; +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __rep(__short __r) : __s(__r) {} +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __rep(__long __r) : __l(__r) {} +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __rep(__uninitialized_tag) {}    };    _LIBCPP_COMPRESSED_PAIR(__rep, __rep_, allocator_type, __alloc_); @@ -1206,7 +1212,10 @@ public:    }  #  endif // _LIBCPP_CXX03_LANG -  inline _LIBCPP_CONSTEXPR_SINCE_CXX20 ~basic_string() { __reset_internal_buffer(); } +  // TODO(boomanaiden154): Once we mark this in destructors as dead on return, +  // we can use a normal call to __reset_internal_buffer and remove the extra +  // __rep constructor. +  inline _LIBCPP_CONSTEXPR_SINCE_CXX20 ~basic_string() { __reset_internal_buffer(__rep(__uninitialized_tag())); }    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 operator __self_view() const _NOEXCEPT {      return __self_view(typename __self_view::__assume_valid(), data(), size()); @@ -2259,18 +2268,12 @@ private:      return __long(__buffer, __capacity);    } -  // Deallocate the long buffer if it exists and clear the short buffer so we are an empty string -  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __reset_internal_buffer() { +  // Replace the current buffer with __new_rep. Deallocate the old long buffer if it exists. +  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __reset_internal_buffer(__rep __new_rep = __short()) {      __annotate_delete();      if (__is_long())        __alloc_traits::deallocate(__alloc_, __get_long_pointer(), __get_long_cap()); -    __rep_.__s = __short(); -  } - -  // Replace the current buffer with __alloc; the first __size elements constitute a string -  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __replace_internal_buffer(__long __alloc) { -    __reset_internal_buffer(); -    __rep_.__l = __alloc; +    __rep_ = __new_rep;    }    // Initialize the internal buffer to hold __size elements @@ -2444,7 +2447,7 @@ private:          __annotate_delete();          auto __guard = std::__make_scope_guard(__annotate_new_size(*this));          auto __alloc = __str.__alloc_; -        __replace_internal_buffer(__allocate_long_buffer(__alloc, __str.size())); +        __reset_internal_buffer(__allocate_long_buffer(__alloc, __str.size()));          __alloc_ = std::move(__alloc);        }      } @@ -2710,7 +2713,7 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 void basic_string<_CharT, _Traits, _Allocator>::__                        __sec_cp_sz);    __buffer.__size_ = __n_copy + __n_add + __sec_cp_sz;    traits_type::assign(__buffer.__data_[__buffer.__size_], value_type()); -  __replace_internal_buffer(__buffer); +  __reset_internal_buffer(__buffer);  }  // __grow_by is deprecated because it does not set the size. It may not update the size when the size is changed, and it @@ -2746,7 +2749,7 @@ _LIBCPP_DEPRECATED_("use __grow_by_without_replace") basic_string<_CharT, _Trait    // This is -1 to make sure the caller sets the size properly, since old versions of this function didn't set the size    // at all.    __buffer.__size_ = -1; -  __replace_internal_buffer(__buffer); +  __reset_internal_buffer(__buffer);  }  template <class _CharT, class _Traits, class _Allocator> @@ -3394,7 +3397,7 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 void basic_string<_CharT, _Traits, _Allocator>::re    __long __buffer  = __allocate_long_buffer(__alloc_, __requested_capacity);    __buffer.__size_ = size();    traits_type::copy(std::__to_address(__buffer.__data_), data(), __buffer.__size_ + 1); -  __replace_internal_buffer(__buffer); +  __reset_internal_buffer(__buffer);  }  template <class _CharT, class _Traits, class _Allocator> @@ -3433,7 +3436,7 @@ inline _LIBCPP_CONSTEXPR_SINCE_CXX20 void basic_string<_CharT, _Traits, _Allocat      }      traits_type::copy(std::__to_address(__buffer.__data_), std::__to_address(__get_long_pointer()), __size + 1); -    __replace_internal_buffer(__buffer); +    __reset_internal_buffer(__buffer);  #  if _LIBCPP_HAS_EXCEPTIONS    } catch (...) {      return;  | 
