| Index: include/string
|
| diff --git a/include/string b/include/string
|
| index ee5db1aab63b28e0598ea762e34b482ebf66d40a..aed64ac34aad9dfa32e1bf1b5cb1a894064c41b0 100644
|
| --- a/include/string
|
| +++ b/include/string
|
| @@ -1323,6 +1323,7 @@ private:
|
|
|
| struct __rep
|
| {
|
| + __rep(): __s() {}
|
| union
|
| {
|
| __long __l;
|
| @@ -1758,9 +1759,21 @@ private:
|
| _LIBCPP_INLINE_VISIBILITY
|
| size_type __get_long_size() const _NOEXCEPT
|
| {return __r_.first().__l.__size_;}
|
| +
|
| _LIBCPP_INLINE_VISIBILITY
|
| void __set_size(size_type __s) _NOEXCEPT
|
| - {if (__is_long()) __set_long_size(__s); else __set_short_size(__s);}
|
| + {
|
| + if (__is_long())
|
| + {
|
| + __count_destroyed(__alloc(), __get_long_size());
|
| + __count_constructed(__alloc(), __s);
|
| + __set_long_size(__s);
|
| + }
|
| + else
|
| + {
|
| + __set_short_size(__s);
|
| + }
|
| + }
|
|
|
| _LIBCPP_INLINE_VISIBILITY
|
| void __set_long_cap(size_type __s) _NOEXCEPT
|
| @@ -1770,6 +1783,18 @@ private:
|
| {return __r_.first().__l.__cap_ & size_type(~__long_mask);}
|
|
|
| _LIBCPP_INLINE_VISIBILITY
|
| + void __set_long_cap_size(size_type __c, size_type __s) _NOEXCEPT
|
| + {
|
| + if (__is_long())
|
| + {
|
| + __count_destroyed(__alloc(), __get_long_size());
|
| + }
|
| + __set_long_cap(__c);
|
| + __set_long_size(__s);
|
| + __count_constructed(__alloc(), __s);
|
| + }
|
| +
|
| + _LIBCPP_INLINE_VISIBILITY
|
| void __set_long_pointer(pointer __p) _NOEXCEPT
|
| {__r_.first().__l.__data_ = __p;}
|
| _LIBCPP_INLINE_VISIBILITY
|
| @@ -1988,8 +2013,7 @@ basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_ty
|
| size_type __cap = __recommend(__reserve);
|
| __p = __alloc_traits::allocate(__alloc(), __cap+1);
|
| __set_long_pointer(__p);
|
| - __set_long_cap(__cap+1);
|
| - __set_long_size(__sz);
|
| + __set_long_cap_size(__cap+1, __sz);
|
| }
|
| traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz);
|
| traits_type::assign(__p[__sz], value_type());
|
| @@ -2012,8 +2036,7 @@ basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_ty
|
| size_type __cap = __recommend(__sz);
|
| __p = __alloc_traits::allocate(__alloc(), __cap+1);
|
| __set_long_pointer(__p);
|
| - __set_long_cap(__cap+1);
|
| - __set_long_size(__sz);
|
| + __set_long_cap_size(__cap+1, __sz);
|
| }
|
| traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz);
|
| traits_type::assign(__p[__sz], value_type());
|
| @@ -2149,8 +2172,7 @@ basic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c)
|
| size_type __cap = __recommend(__n);
|
| __p = __alloc_traits::allocate(__alloc(), __cap+1);
|
| __set_long_pointer(__p);
|
| - __set_long_cap(__cap+1);
|
| - __set_long_size(__n);
|
| + __set_long_cap_size(__cap+1, __n);
|
| }
|
| traits_type::assign(_VSTD::__to_raw_pointer(__p), __n, __c);
|
| traits_type::assign(__p[__n], value_type());
|
| @@ -2212,6 +2234,7 @@ basic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _Input
|
| }
|
| catch (...)
|
| {
|
| + __set_size(0);
|
| if (__is_long())
|
| __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
|
| throw;
|
| @@ -2242,8 +2265,7 @@ basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _For
|
| size_type __cap = __recommend(__sz);
|
| __p = __alloc_traits::allocate(__alloc(), __cap+1);
|
| __set_long_pointer(__p);
|
| - __set_long_cap(__cap+1);
|
| - __set_long_size(__sz);
|
| + __set_long_cap_size(__cap+1, __sz);
|
| }
|
| for (; __first != __last; ++__first, (void) ++__p)
|
| traits_type::assign(*__p, *__first);
|
| @@ -2305,6 +2327,7 @@ basic_string<_CharT, _Traits, _Allocator>::~basic_string()
|
| #if _LIBCPP_DEBUG_LEVEL >= 2
|
| __get_db()->__erase_c(this);
|
| #endif
|
| + __set_size(0);
|
| if (__is_long())
|
| __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
|
| }
|
| @@ -2336,9 +2359,8 @@ basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace
|
| if (__old_cap+1 != __min_cap)
|
| __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
|
| __set_long_pointer(__p);
|
| - __set_long_cap(__cap+1);
|
| __old_sz = __n_copy + __n_add + __sec_cp_sz;
|
| - __set_long_size(__old_sz);
|
| + __set_long_cap_size(__cap+1, __old_sz);
|
| traits_type::assign(__p[__old_sz], value_type());
|
| }
|
|
|
| @@ -2367,7 +2389,7 @@ basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_t
|
| if (__old_cap+1 != __min_cap)
|
| __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
|
| __set_long_pointer(__p);
|
| - __set_long_cap(__cap+1);
|
| + __set_long_cap_size(__cap+1, __old_sz);
|
| }
|
|
|
| // assign
|
| @@ -2421,13 +2443,12 @@ basic_string<_CharT, _Traits, _Allocator>::operator=(value_type __c)
|
| if (__is_long())
|
| {
|
| __p = __get_long_pointer();
|
| - __set_long_size(1);
|
| }
|
| else
|
| {
|
| __p = __get_short_pointer();
|
| - __set_short_size(1);
|
| }
|
| + __set_size(1);
|
| traits_type::assign(*__p, __c);
|
| traits_type::assign(*++__p, value_type());
|
| __invalidate_iterators_past(1);
|
| @@ -2628,13 +2649,12 @@ basic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c)
|
| if (__is_short)
|
| {
|
| __p = __get_short_pointer() + __sz;
|
| - __set_short_size(__sz+1);
|
| }
|
| else
|
| {
|
| __p = __get_long_pointer() + __sz;
|
| - __set_long_size(__sz+1);
|
| }
|
| + __set_size(__sz+1);
|
| traits_type::assign(*__p, __c);
|
| traits_type::assign(*++__p, value_type());
|
| }
|
| @@ -3152,15 +3172,14 @@ basic_string<_CharT, _Traits, _Allocator>::pop_back()
|
| if (__is_long())
|
| {
|
| __sz = __get_long_size() - 1;
|
| - __set_long_size(__sz);
|
| traits_type::assign(*(__get_long_pointer() + __sz), value_type());
|
| }
|
| else
|
| {
|
| __sz = __get_short_size() - 1;
|
| - __set_short_size(__sz);
|
| traits_type::assign(*(__get_short_pointer() + __sz), value_type());
|
| }
|
| + __set_size(__sz);
|
| __invalidate_iterators_past(__sz);
|
| }
|
|
|
| @@ -3173,13 +3192,12 @@ basic_string<_CharT, _Traits, _Allocator>::clear() _NOEXCEPT
|
| if (__is_long())
|
| {
|
| traits_type::assign(*__get_long_pointer(), value_type());
|
| - __set_long_size(0);
|
| }
|
| else
|
| {
|
| traits_type::assign(*__get_short_pointer(), value_type());
|
| - __set_short_size(0);
|
| }
|
| + __set_size(0);
|
| }
|
|
|
| template <class _CharT, class _Traits, class _Allocator>
|
| @@ -3190,13 +3208,12 @@ basic_string<_CharT, _Traits, _Allocator>::__erase_to_end(size_type __pos)
|
| if (__is_long())
|
| {
|
| traits_type::assign(*(__get_long_pointer() + __pos), value_type());
|
| - __set_long_size(__pos);
|
| }
|
| else
|
| {
|
| traits_type::assign(*(__get_short_pointer() + __pos), value_type());
|
| - __set_short_size(__pos);
|
| }
|
| + __set_size(__pos);
|
| __invalidate_iterators_past(__pos);
|
| }
|
|
|
| @@ -3271,14 +3288,14 @@ basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __res_arg)
|
| __was_long = __is_long();
|
| __p = __get_pointer();
|
| }
|
| + __set_size(0);
|
| traits_type::copy(_VSTD::__to_raw_pointer(__new_data),
|
| - _VSTD::__to_raw_pointer(__p), size()+1);
|
| + _VSTD::__to_raw_pointer(__p), __sz+1);
|
| if (__was_long)
|
| __alloc_traits::deallocate(__alloc(), __p, __cap+1);
|
| if (__now_long)
|
| {
|
| - __set_long_cap(__res_arg+1);
|
| - __set_long_size(__sz);
|
| + __set_long_cap_size(__res_arg+1, __sz);
|
| __set_long_pointer(__new_data);
|
| }
|
| else
|
| @@ -4288,7 +4305,7 @@ inline namespace literals
|
|
|
| _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_string<char>)
|
| _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_string<wchar_t>)
|
| -_LIBCPP_EXTERN_TEMPLATE(string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&))
|
| +_LIBCPP_EXTERN_TEMPLATE(string operator+<char, char_traits<char>, counting_allocator<char, allocation_group::string> >(char const*, string const&))
|
|
|
| _LIBCPP_END_NAMESPACE_STD
|
|
|
|
|