Skip to content

Commit 732920d

Browse files
committed
[libc++] Remove the usage of __init in operator+
`operator+` currently calls `__init`. This patch removes the usage of implementation details. Reviewed By: ldionne, Mordante, #libc Spies: libcxx-commits Differential Revision: https://reviews.llvm.org/D123058
1 parent 55b6a31 commit 732920d

File tree

1 file changed

+61
-19
lines changed

1 file changed

+61
-19
lines changed

libcxx/include/string

Lines changed: 61 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,8 @@ typedef basic_string<char16_t> u16string;
625625
typedef basic_string<char32_t> u32string;
626626
#endif
627627

628+
struct __uninitialized_size_tag {};
629+
628630
template<class _CharT, class _Traits, class _Allocator>
629631
class
630632
_LIBCPP_TEMPLATE_VIS
@@ -746,6 +748,26 @@ private:
746748

747749
__compressed_pair<__rep, allocator_type> __r_;
748750

751+
// Construct a string with the given allocator and enough storage to hold `__size` characters, but
752+
// don't initialize the characters. The contents of the string, including the null terminator, must be
753+
// initialized separately.
754+
_LIBCPP_HIDE_FROM_ABI explicit basic_string(__uninitialized_size_tag, size_type __size, const allocator_type& __a)
755+
: __r_(__default_init_tag(), __a) {
756+
if (__size > max_size())
757+
__throw_length_error();
758+
if (__fits_in_sso(__size)) {
759+
__zero();
760+
__set_short_size(__size);
761+
} else {
762+
auto __capacity = __recommend(__size) + 1;
763+
auto __allocation = __alloc_traits::allocate(__alloc(), __capacity);
764+
__set_long_cap(__capacity);
765+
__set_long_pointer(__allocation);
766+
__set_long_size(__size);
767+
}
768+
std::__debug_db_insert_c(this);
769+
}
770+
749771
public:
750772
_LIBCPP_TEMPLATE_DATA_VIS
751773
static const size_type npos = -1;
@@ -4156,11 +4178,15 @@ operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
41564178
const basic_string<_CharT, _Traits, _Allocator>& __rhs)
41574179
{
41584180
using _String = basic_string<_CharT, _Traits, _Allocator>;
4159-
_String __r(_String::__alloc_traits::select_on_container_copy_construction(__lhs.get_allocator()));
4160-
typename _String::size_type __lhs_sz = __lhs.size();
4161-
typename _String::size_type __rhs_sz = __rhs.size();
4162-
__r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
4163-
__r.append(__rhs.data(), __rhs_sz);
4181+
auto __lhs_sz = __lhs.size();
4182+
auto __rhs_sz = __rhs.size();
4183+
_String __r(__uninitialized_size_tag(),
4184+
__lhs_sz + __rhs_sz,
4185+
_String::__alloc_traits::select_on_container_copy_construction(__lhs.get_allocator()));
4186+
auto __ptr = std::__to_address(__r.__get_pointer());
4187+
_Traits::copy(__ptr, __lhs.data(), __lhs_sz);
4188+
_Traits::copy(__ptr + __lhs_sz, __rhs.data(), __rhs_sz);
4189+
_Traits::assign(__ptr + __lhs_sz + __rhs_sz, 1, _CharT());
41644190
return __r;
41654191
}
41664192

@@ -4169,11 +4195,15 @@ basic_string<_CharT, _Traits, _Allocator>
41694195
operator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs)
41704196
{
41714197
using _String = basic_string<_CharT, _Traits, _Allocator>;
4172-
_String __r(_String::__alloc_traits::select_on_container_copy_construction(__rhs.get_allocator()));
4173-
typename _String::size_type __lhs_sz = _Traits::length(__lhs);
4174-
typename _String::size_type __rhs_sz = __rhs.size();
4175-
__r.__init(__lhs, __lhs_sz, __lhs_sz + __rhs_sz);
4176-
__r.append(__rhs.data(), __rhs_sz);
4198+
auto __lhs_sz = _Traits::length(__lhs);
4199+
auto __rhs_sz = __rhs.size();
4200+
_String __r(__uninitialized_size_tag(),
4201+
__lhs_sz + __rhs_sz,
4202+
_String::__alloc_traits::select_on_container_copy_construction(__rhs.get_allocator()));
4203+
auto __ptr = std::__to_address(__r.__get_pointer());
4204+
_Traits::copy(__ptr, __lhs, __lhs_sz);
4205+
_Traits::copy(__ptr + __lhs_sz, __rhs.data(), __rhs_sz);
4206+
_Traits::assign(__ptr + __lhs_sz + __rhs_sz, 1, _CharT());
41774207
return __r;
41784208
}
41794209

@@ -4182,10 +4212,14 @@ basic_string<_CharT, _Traits, _Allocator>
41824212
operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs)
41834213
{
41844214
using _String = basic_string<_CharT, _Traits, _Allocator>;
4185-
_String __r(_String::__alloc_traits::select_on_container_copy_construction(__rhs.get_allocator()));
41864215
typename _String::size_type __rhs_sz = __rhs.size();
4187-
__r.__init(&__lhs, 1, 1 + __rhs_sz);
4188-
__r.append(__rhs.data(), __rhs_sz);
4216+
_String __r(__uninitialized_size_tag(),
4217+
__rhs_sz + 1,
4218+
_String::__alloc_traits::select_on_container_copy_construction(__rhs.get_allocator()));
4219+
auto __ptr = std::__to_address(__r.__get_pointer());
4220+
_Traits::assign(__ptr, 1, __lhs);
4221+
_Traits::copy(__ptr + 1, __rhs.data(), __rhs_sz);
4222+
_Traits::assign(__ptr + 1 + __rhs_sz, 1, _CharT());
41894223
return __r;
41904224
}
41914225

@@ -4195,11 +4229,15 @@ basic_string<_CharT, _Traits, _Allocator>
41954229
operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs)
41964230
{
41974231
using _String = basic_string<_CharT, _Traits, _Allocator>;
4198-
_String __r(_String::__alloc_traits::select_on_container_copy_construction(__lhs.get_allocator()));
41994232
typename _String::size_type __lhs_sz = __lhs.size();
42004233
typename _String::size_type __rhs_sz = _Traits::length(__rhs);
4201-
__r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
4202-
__r.append(__rhs, __rhs_sz);
4234+
_String __r(__uninitialized_size_tag(),
4235+
__lhs_sz + __rhs_sz,
4236+
_String::__alloc_traits::select_on_container_copy_construction(__lhs.get_allocator()));
4237+
auto __ptr = std::__to_address(__r.__get_pointer());
4238+
_Traits::copy(__ptr, __lhs.data(), __lhs_sz);
4239+
_Traits::copy(__ptr + __lhs_sz, __rhs, __rhs_sz);
4240+
_Traits::assign(__ptr + __lhs_sz + __rhs_sz, 1, _CharT());
42034241
return __r;
42044242
}
42054243

@@ -4208,10 +4246,14 @@ basic_string<_CharT, _Traits, _Allocator>
42084246
operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs)
42094247
{
42104248
using _String = basic_string<_CharT, _Traits, _Allocator>;
4211-
_String __r(_String::__alloc_traits::select_on_container_copy_construction(__lhs.get_allocator()));
42124249
typename _String::size_type __lhs_sz = __lhs.size();
4213-
__r.__init(__lhs.data(), __lhs_sz, __lhs_sz + 1);
4214-
__r.push_back(__rhs);
4250+
_String __r(__uninitialized_size_tag(),
4251+
__lhs_sz + 1,
4252+
_String::__alloc_traits::select_on_container_copy_construction(__lhs.get_allocator()));
4253+
auto __ptr = std::__to_address(__r.__get_pointer());
4254+
_Traits::copy(__ptr, __lhs.data(), __lhs_sz);
4255+
_Traits::assign(__ptr + __lhs_sz, 1, __rhs);
4256+
_Traits::assign(__ptr + 1 + __lhs_sz, 1, _CharT());
42154257
return __r;
42164258
}
42174259

0 commit comments

Comments
 (0)