libstdc++: Simplify std::totally_ordered (LWG 3331)
authorJonathan Wakely <jwakely@redhat.com>
Wed, 19 Feb 2020 21:40:03 +0000 (21:40 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 19 Feb 2020 21:40:03 +0000 (21:40 +0000)
* include/std/concepts (__detail::__partially_ordered_with): Move here
from <compare>.
(totally_ordered, totally_ordered_with): Use __partially_ordered_with
to simplify definition (LWG 3331).
* libsupc++/compare (__detail::__partially_ordered_with): Move to
<concepts>.

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/concepts
libstdc++-v3/libsupc++/compare

index 3941bcbe7ba9b9cd08ea1c64aebd1b76cb940e76..1711a35925625cd1aa20e39991079e8ab48ab082 100644 (file)
@@ -1,5 +1,12 @@
 2020-02-19  Jonathan Wakely  <jwakely@redhat.com>
 
+       * include/std/concepts (__detail::__partially_ordered_with): Move here
+       from <compare>.
+       (totally_ordered, totally_ordered_with): Use __partially_ordered_with
+       to simplify definition (LWG 3331).
+       * libsupc++/compare (__detail::__partially_ordered_with): Move to
+       <concepts>.
+
        * include/std/concepts (totally_ordered_with): Remove redundant
        requirement (LWG 3329).
 
index be125c636a14feb39ebe3ec4d2af047713cdde5c..ba232e953ecaefd77a20efd098ec732179f75e20 100644 (file)
@@ -297,16 +297,28 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                                                __detail::__cref<_Up>>>
       && __detail::__weakly_eq_cmp_with<_Tp, _Up>;
 
+  namespace __detail
+  {
+    template<typename _Tp, typename _Up>
+      concept __partially_ordered_with
+       = requires(const remove_reference_t<_Tp>& __t,
+                  const remove_reference_t<_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;
+       };
+  } // namespace __detail
+
   // [concept.totallyordered], concept totally_ordered
   template<typename _Tp>
     concept totally_ordered
       = equality_comparable<_Tp>
-      && requires(__detail::__cref<_Tp> __a, __detail::__cref<_Tp> __b) {
-       { __a <  __b } -> __detail::__boolean_testable;
-       { __a >  __b } -> __detail::__boolean_testable;
-       { __a <= __b } -> __detail::__boolean_testable;
-       { __a >= __b } -> __detail::__boolean_testable;
-      };
+      && __detail::__partially_ordered_with<_Tp, _Tp>;
 
   template<typename _Tp, typename _Up>
     concept totally_ordered_with
@@ -314,16 +326,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       && equality_comparable_with<_Tp, _Up>
       && totally_ordered<common_reference_t<__detail::__cref<_Tp>,
                                            __detail::__cref<_Up>>>
-      && requires(__detail::__cref<_Tp> __t, __detail::__cref<_Up> __u) {
-       { __t <  __u } -> __detail::__boolean_testable;
-       { __t >  __u } -> __detail::__boolean_testable;
-       { __t <= __u } -> __detail::__boolean_testable;
-       { __t >= __u } -> __detail::__boolean_testable;
-       { __u <  __t } -> __detail::__boolean_testable;
-       { __u >  __t } -> __detail::__boolean_testable;
-       { __u <= __t } -> __detail::__boolean_testable;
-       { __u >= __t } -> __detail::__boolean_testable;
-      };
+      && __detail::__partially_ordered_with<_Tp, _Up>;
 
   template<typename _Tp>
     concept regular = semiregular<_Tp> && equality_comparable<_Tp>;
index ba7db316486894826be77cc80da6a63e4532b109..a74ebc845bf8e8b9c55ea6c1ab1b0b6c631f3596 100644 (file)
@@ -411,20 +411,6 @@ namespace std
     template<typename _Tp, typename _Cat>
       concept __compares_as
        = same_as<common_comparison_category_t<_Tp, _Cat>, _Cat>;
-
-    template<typename _Tp, typename _Up>
-      concept __partially_ordered_with
-       = requires(const remove_reference_t<_Tp>& __t,
-                  const remove_reference_t<_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;
-       };
   } // namespace __detail
 
   // [cmp.concept], concept three_way_comparable