[libcxx] adds concepts `std::totally_ordered` and `std::totally_ordered_with`

Implements parts of:
    - P0898R3 Standard Library Concepts
    - P1754 Rename concepts to standard_case for C++20, while we still can

Reviewed By: Mordante

Differential Revision: https://reviews.llvm.org/D98983

GitOrigin-RevId: 7959d59028dd126416cdf10dbbd22162922e1336
diff --git a/include/concepts b/include/concepts
index 0a4e7d5..0a3e927 100644
--- a/include/concepts
+++ b/include/concepts
@@ -214,7 +214,7 @@
 template<class _Lhs, class _Rhs>
 concept assignable_from =
   is_lvalue_reference_v<_Lhs> &&
-  common_reference_with<const remove_reference_t<_Lhs>&, const remove_reference_t<_Rhs>&> &&
+  common_reference_with<__make_const_lvalue_ref<_Lhs>, __make_const_lvalue_ref<_Rhs>> &&
   requires (_Lhs __lhs, _Rhs&& __rhs) {
     { __lhs = _VSTD::forward<_Rhs>(__rhs) } -> same_as<_Lhs>;
   };
@@ -346,7 +346,7 @@
 // [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) {
+  requires(__make_const_lvalue_ref<_Tp> __t, __make_const_lvalue_ref<_Up> __u) {
     { __t == __u } -> __boolean_testable;
     { __t != __u } -> __boolean_testable;
     { __u == __t } -> __boolean_testable;
@@ -359,13 +359,41 @@
 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>&> &&
+  common_reference_with<__make_const_lvalue_ref<_Tp>, __make_const_lvalue_ref<_Up>> &&
   equality_comparable<
     common_reference_t<
-      const remove_reference_t<_Tp>&,
-      const remove_reference_t<_Up>&>> &&
+      __make_const_lvalue_ref<_Tp>,
+      __make_const_lvalue_ref<_Up>>> &&
   __weakly_equality_comparable_with<_Tp, _Up>;
 
+// [concept.totallyordered]
+
+template<class _Tp, class _Up>
+concept __partially_ordered_with =
+  requires(__make_const_lvalue_ref<_Tp> __t, __make_const_lvalue_ref<_Up> __u) {
+    { __t <  __u } -> __boolean_testable;
+    { __t >  __u } -> __boolean_testable;
+    { __t <= __u } -> __boolean_testable;
+    { __t >= __u } -> __boolean_testable;
+    { __u <  __t } -> __boolean_testable;
+    { __u >  __t } -> __boolean_testable;
+    { __u <= __t } -> __boolean_testable;
+    { __u >= __t } -> __boolean_testable;
+  };
+
+template<class _Tp>
+concept totally_ordered = equality_comparable<_Tp> && __partially_ordered_with<_Tp, _Tp>;
+
+template<class _Tp, class _Up>
+concept totally_ordered_with =
+  totally_ordered<_Tp> && totally_ordered<_Up> &&
+  equality_comparable_with<_Tp, _Up> &&
+  totally_ordered<
+    common_reference_t<
+      __make_const_lvalue_ref<_Tp>,
+      __make_const_lvalue_ref<_Up>>> &&
+  __partially_ordered_with<_Tp, _Up>;
+
 // [concepts.object]
 template<class _Tp>
 concept movable =