From 2c4c79cb0c73c6041afe703488dd7f0b04fe2cdb Mon Sep 17 00:00:00 2001 From: Nikolas Klauser Date: Thu, 21 Nov 2024 17:29:25 +0100 Subject: [PATCH] [libc++][NFC] Simplify the implementation of string and string_views operator== --- libcxx/include/string | 40 ++++++++------------------------------ libcxx/include/string_view | 40 ++++++++++++-------------------------- 2 files changed, 20 insertions(+), 60 deletions(-) diff --git a/libcxx/include/string b/libcxx/include/string index 17bf4b3b98bf3..e96237488b80c 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -1881,11 +1881,6 @@ public: _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __clear_and_shrink() _NOEXCEPT; private: - template - inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool friend - operator==(const basic_string, _Alloc>& __lhs, - const basic_string, _Alloc>& __rhs) _NOEXCEPT; - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __shrink_or_extend(size_type __target_capacity); _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_STRING_INTERNAL_MEMORY_ACCESS bool @@ -3842,36 +3837,9 @@ template inline _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool operator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT { -# if _LIBCPP_STD_VER >= 20 - return basic_string_view<_CharT, _Traits>(__lhs) == basic_string_view<_CharT, _Traits>(__rhs); -# else size_t __lhs_sz = __lhs.size(); return __lhs_sz == __rhs.size() && _Traits::compare(__lhs.data(), __rhs.data(), __lhs_sz) == 0; -# endif -} - -template -inline _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool -operator==(const basic_string, _Allocator>& __lhs, - const basic_string, _Allocator>& __rhs) _NOEXCEPT { - size_t __sz = __lhs.size(); - if (__sz != __rhs.size()) - return false; - return char_traits::compare(__lhs.data(), __rhs.data(), __sz) == 0; -} - -# if _LIBCPP_STD_VER <= 17 -template -inline _LIBCPP_HIDE_FROM_ABI bool -operator==(const _CharT* __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT { - typedef basic_string<_CharT, _Traits, _Allocator> _String; - _LIBCPP_ASSERT_NON_NULL(__lhs != nullptr, "operator==(char*, basic_string): received nullptr"); - size_t __lhs_len = _Traits::length(__lhs); - if (__lhs_len != __rhs.size()) - return false; - return __rhs.compare(0, _String::npos, __lhs, __lhs_len) == 0; } -# endif // _LIBCPP_STD_VER <= 17 template inline _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool @@ -3890,6 +3858,14 @@ operator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* return __lhs.compare(0, _String::npos, __rhs, __rhs_len) == 0; } +# if _LIBCPP_STD_VER <= 17 +template +inline _LIBCPP_HIDE_FROM_ABI bool +operator==(const _CharT* __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT { + return __rhs == __lhs; +} +# endif // _LIBCPP_STD_VER <= 17 + # if _LIBCPP_STD_VER >= 20 template diff --git a/libcxx/include/string_view b/libcxx/include/string_view index 27b9f152ea290..a62d75a008c0c 100644 --- a/libcxx/include/string_view +++ b/libcxx/include/string_view @@ -722,16 +722,19 @@ basic_string_view(_Range) -> basic_string_view>; // [string.view.comparison] -# if _LIBCPP_STD_VER >= 20 - -template -_LIBCPP_HIDE_FROM_ABI constexpr bool operator==(basic_string_view<_CharT, _Traits> __lhs, - type_identity_t> __rhs) noexcept { +// The dummy default template parameters are used to work around a MSVC issue with mangling, see VSO-409326 for details. +// This applies to the other sufficient overloads below for the other comparison operators. +template +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator==(basic_string_view<_CharT, _Traits> __lhs, + __type_identity_t > __rhs) _NOEXCEPT { if (__lhs.size() != __rhs.size()) return false; return __lhs.compare(__rhs) == 0; } +# if _LIBCPP_STD_VER >= 20 + template _LIBCPP_HIDE_FROM_ABI constexpr auto operator<=>(basic_string_view<_CharT, _Traits> __lhs, type_identity_t> __rhs) noexcept { @@ -757,51 +760,32 @@ operator==(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _ return __lhs.compare(__rhs) == 0; } -// The dummy default template parameters are used to work around a MSVC issue with mangling, see VSO-409326 for details. -// This applies to the other sufficient overloads below for the other comparison operators. -template -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool -operator==(basic_string_view<_CharT, _Traits> __lhs, - __type_identity_t > __rhs) _NOEXCEPT { - if (__lhs.size() != __rhs.size()) - return false; - return __lhs.compare(__rhs) == 0; -} - template _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool operator==(__type_identity_t > __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT { - if (__lhs.size() != __rhs.size()) - return false; - return __lhs.compare(__rhs) == 0; + return __lhs == __rhs; } // operator != template _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool operator!=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT { - if (__lhs.size() != __rhs.size()) - return true; - return __lhs.compare(__rhs) != 0; + return !(__lhs == __rhs); } template _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool operator!=(basic_string_view<_CharT, _Traits> __lhs, __type_identity_t > __rhs) _NOEXCEPT { - if (__lhs.size() != __rhs.size()) - return true; - return __lhs.compare(__rhs) != 0; + return !(__lhs == __rhs); } template _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool operator!=(__type_identity_t > __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT { - if (__lhs.size() != __rhs.size()) - return true; - return __lhs.compare(__rhs) != 0; + return !(__lhs == __rhs); } // operator <