diff options
author | Louis Dionne <ldionne.2@gmail.com> | 2024-06-11 16:55:56 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-11 16:55:56 -0400 |
commit | 6faae130e4ea34f8b092fdfcd866fbb5861bfc49 (patch) | |
tree | 9c1c08e36412afce2834398aec96b4adc286ee96 /libcxx | |
parent | f638f7b6a7c22bc802bb9620acfa10a00d4217cf (diff) | |
download | llvm-6faae130e4ea34f8b092fdfcd866fbb5861bfc49.zip llvm-6faae130e4ea34f8b092fdfcd866fbb5861bfc49.tar.gz llvm-6faae130e4ea34f8b092fdfcd866fbb5861bfc49.tar.bz2 |
[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
Diffstat (limited to 'libcxx')
-rw-r--r-- | libcxx/include/string | 13 |
1 files changed, 3 insertions, 10 deletions
diff --git a/libcxx/include/string b/libcxx/include/string index 1db803e..5301f8a 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -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 |