[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 =