From aa8601dc6ddd110a3465e85f2f1db89c8f9efcb2 Mon Sep 17 00:00:00 2001 From: Amirreza Ashouri <39487863+AMP999@users.noreply.github.com> Date: Mon, 18 Sep 2023 18:00:44 +0330 Subject: [PATCH] [libc++] [string_view] Remove operators made redundant by C++20 (#66206) Thanks to Giuseppe D'Angelo for pointing this out on the cpplang Slack! The example implementation in https://eel.is/c++draft/string.view.comparison#example-1 was necessary when it was written, in C++17, but in C++20 we don't need that complexity anymore, because of the reversed candidates that are synthesized by the compiler. --- libcxx/include/string_view | 65 ++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/libcxx/include/string_view b/libcxx/include/string_view index 3149fe250578..1a94ac09b99e 100644 --- a/libcxx/include/string_view +++ b/libcxx/include/string_view @@ -776,7 +776,35 @@ template #endif // [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 { + if (__lhs.size() != __rhs.size()) return false; + return __lhs.compare(__rhs) == 0; +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr auto operator<=>( + basic_string_view<_CharT, _Traits> __lhs, type_identity_t> __rhs) noexcept { + if constexpr (requires { typename _Traits::comparison_category; }) { + // [string.view]/4 + static_assert( + __comparison_category, + "return type is not a comparison category type"); + return static_cast(__lhs.compare(__rhs) <=> 0); + } else { + return static_cast(__lhs.compare(__rhs) <=> 0); + } +} + +#else + // operator == + template _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY bool operator==(basic_string_view<_CharT, _Traits> __lhs, @@ -797,8 +825,6 @@ bool operator==(basic_string_view<_CharT, _Traits> __lhs, return __lhs.compare(__rhs) == 0; } -#if _LIBCPP_STD_VER < 20 -// This overload is automatically generated in C++20. template _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY bool operator==(__type_identity_t > __lhs, @@ -807,41 +833,6 @@ bool operator==(__type_identity_t > __lhs, if (__lhs.size() != __rhs.size()) return false; return __lhs.compare(__rhs) == 0; } -#endif // _LIBCPP_STD_VER >= 20 - -// operator <=> - -#if _LIBCPP_STD_VER >= 20 - -template -_LIBCPP_HIDE_FROM_ABI constexpr auto -operator<=>(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) noexcept { - if constexpr (requires { typename _Traits::comparison_category; }) { - // [string.view]/4 - static_assert( - __comparison_category, - "return type is not a comparison category type"); - return static_cast(__lhs.compare(__rhs) <=> 0); - } else { - return static_cast(__lhs.compare(__rhs) <=> 0); - } -} - -template -_LIBCPP_HIDE_FROM_ABI constexpr auto operator<=>( - basic_string_view<_CharT, _Traits> __lhs, type_identity_t> __rhs) noexcept { - if constexpr (requires { typename _Traits::comparison_category; }) { - // [string.view]/4 - static_assert( - __comparison_category, - "return type is not a comparison category type"); - return static_cast(__lhs.compare(__rhs) <=> 0); - } else { - return static_cast(__lhs.compare(__rhs) <=> 0); - } -} - -#else // _LIBCPP_STD_VER >= 20 // operator != template