[libcxx] adds concepts std::equality_comparable[_with]
Implements parts of:
- P0898R3 Standard Library Concepts
- P1754 Rename concepts to standard_case for C++20, while we still can
Depends on D96660
Reviewed By: ldionne, #libc, Quuxplusone
Differential Revision: https://reviews.llvm.org/D97176
GitOrigin-RevId: e63ddcccf8dbe5cdd348b791f3beb7afe3a1a71c
diff --git a/include/concepts b/include/concepts
index 505ade9..88a18e9 100644
--- a/include/concepts
+++ b/include/concepts
@@ -243,6 +243,38 @@
concept move_constructible =
constructible_from<_Tp, _Tp> && convertible_to<_Tp, _Tp>;
+// [concept.booleantestable]
+template<class _Tp>
+concept __boolean_testable_impl = convertible_to<_Tp, bool>;
+
+template<class _Tp>
+concept __boolean_testable = __boolean_testable_impl<_Tp> && requires(_Tp&& __t) {
+ { !std::forward<_Tp>(__t) } -> __boolean_testable_impl;
+};
+
+// [concept.equalitycomparable]
+template<class _Tp, class _Up>
+concept __weakly_equality_comparable_with =
+ requires(const remove_reference_t<_Tp>& __t, const remove_reference_t<_Up>& __u) {
+ { __t == __u } -> __boolean_testable;
+ { __t != __u } -> __boolean_testable;
+ { __u == __t } -> __boolean_testable;
+ { __u != __t } -> __boolean_testable;
+ };
+
+template<class _Tp>
+concept equality_comparable = __weakly_equality_comparable_with<_Tp, _Tp>;
+
+template<class _Tp, class _Up>
+concept equality_comparable_with =
+ equality_comparable<_Tp> && equality_comparable<_Up> &&
+ common_reference_with<const remove_reference_t<_Tp>&, const remove_reference_t<_Up>&> &&
+ equality_comparable<
+ common_reference_t<
+ const remove_reference_t<_Tp>&,
+ const remove_reference_t<_Up>&>> &&
+ __weakly_equality_comparable_with<_Tp, _Up>;
+
// [concept.copyconstructible]
template<class _Tp>
concept copy_constructible =