[libcxx-commits] [libcxx] [libc++] Avoid code duplication in strings operator+ overloads (PR #126048)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Feb 6 05:12:53 PST 2025
================
@@ -3986,83 +3940,73 @@ operator>=(const _CharT* __lhs, const basic_string<_CharT, _Traits, _Allocator>&
template <class _CharT, class _Traits, class _Allocator>
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string<_CharT, _Traits, _Allocator>
-operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
- const basic_string<_CharT, _Traits, _Allocator>& __rhs) {
+__concatenate_strings(const _Allocator& __alloc,
+ __type_identity_t<basic_string_view<_CharT, _Traits> > __str1,
+ __type_identity_t<basic_string_view<_CharT, _Traits> > __str2) {
using _String = basic_string<_CharT, _Traits, _Allocator>;
- auto __lhs_sz = __lhs.size();
- auto __rhs_sz = __rhs.size();
_String __r(__uninitialized_size_tag(),
- __lhs_sz + __rhs_sz,
- _String::__alloc_traits::select_on_container_copy_construction(__lhs.get_allocator()));
+ __str1.size() + __str2.size(),
+ _String::__alloc_traits::select_on_container_copy_construction(__alloc));
auto __ptr = std::__to_address(__r.__get_pointer());
- _Traits::copy(__ptr, __lhs.data(), __lhs_sz);
- _Traits::copy(__ptr + __lhs_sz, __rhs.data(), __rhs_sz);
- _Traits::assign(__ptr + __lhs_sz + __rhs_sz, 1, _CharT());
+ _Traits::copy(__ptr, __str1.data(), __str1.size());
+ _Traits::copy(__ptr + __str1.size(), __str2.data(), __str2.size());
+ _Traits::assign(__ptr[__str1.size() + __str2.size()], _CharT());
return __r;
}
+template <class _CharT, class _Traits, class _Allocator>
+_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string<_CharT, _Traits, _Allocator>
+operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
+ const basic_string<_CharT, _Traits, _Allocator>& __rhs) {
+ return std::__concatenate_strings<_CharT, _Traits>(__lhs.get_allocator(), __lhs, __rhs);
----------------
ldionne wrote:
If you make a "mistake" and you use `__rhs.get_allocator()` here instead, does any test fail? If not, can we add coverage for that (unless both behaviors are conforming)?
https://github.com/llvm/llvm-project/pull/126048
More information about the libcxx-commits
mailing list