[libc++] Simplify the definition of string::operator== (#95000)

Instead of hardcoding a loop for small strings, always call
char_traits::compare which ends up desugaring to __builtin_memcmp.

Note that the original code dates back 11 years, when we didn't lower to
intrinsics in `char_traits::compare`.

Fixes #94222
This commit is contained in:
Louis Dionne 2024-06-11 16:55:56 -04:00 committed by GitHub
parent f638f7b6a7
commit 6faae130e4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -3746,17 +3746,10 @@ template <class _Allocator>
inline _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool
operator==(const basic_string<char, char_traits<char>, _Allocator>& __lhs,
const basic_string<char, char_traits<char>, _Allocator>& __rhs) _NOEXCEPT {
size_t __lhs_sz = __lhs.size();
if (__lhs_sz != __rhs.size())
size_t __sz = __lhs.size();
if (__sz != __rhs.size())
return false;
const char* __lp = __lhs.data();
const char* __rp = __rhs.data();
if (__lhs.__is_long())
return char_traits<char>::compare(__lp, __rp, __lhs_sz) == 0;
for (; __lhs_sz != 0; --__lhs_sz, ++__lp, ++__rp)
if (*__lp != *__rp)
return false;
return true;
return char_traits<char>::compare(__lhs.data(), __rhs.data(), __sz) == 0;
}
#if _LIBCPP_STD_VER <= 17