libstdc++: Fold some ranges algo subroutines into their only caller
authorPatrick Palka <ppalka@redhat.com>
Thu, 13 Feb 2020 15:55:10 +0000 (10:55 -0500)
committerPatrick Palka <ppalka@redhat.com>
Sat, 15 Feb 2020 15:55:25 +0000 (10:55 -0500)
These subroutines have only a single call site, so it might be best and simplest
to eliminate them before we convert the algos into function objects.

libstdc++-v3/ChangeLog:

* include/bits/ranges_algo.h (ranges::__find_end): Fold into ...
(ranges::find_end): ... here.
(ranges::__lexicographical_compare): Fold into ...
(ranges::lexicographical_compare): ... here.
* include/bits/ranges_algobase.h (ranges::__equal): Fold into ...
(ranges::equal): ... here.

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/ranges_algo.h
libstdc++-v3/include/bits/ranges_algobase.h

index 3c7720579c4925e67843ef0219c8963e80d2fc37..624c0c2f7c984f5baab93ce7487aa33a9556eebc 100644 (file)
@@ -1,3 +1,12 @@
+2020-02-15  Patrick Palka  <ppalka@redhat.com>
+
+       * include/bits/ranges_algo.h (ranges::__find_end): Fold into ...
+       (ranges::find_end): ... here.
+       (ranges::__lexicographical_compare): Fold into ...
+       (ranges::lexicographical_compare): ... here.
+       * include/bits/ranges_algobase.h (ranges::__equal): Fold into ...
+       (ranges::equal): ... here.
+
 2020-02-15  Jonathan Wakely  <jwakely@redhat.com>
 
        * include/bits/erase_if.h (__cpp_lib_erase_if): Define to 202002L.
index 84a02cabb80d031c7cc5058709428d1fca7b5f27..6b6f4defdf5ef991bf23c497b4dd665a5b8af431 100644 (file)
@@ -513,40 +513,7 @@ namespace ranges
                              std::move(__pred), std::move(__proj));
     }
 
-  template<forward_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
-          forward_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
-          typename _Pred = ranges::equal_to,
-          typename _Proj1 = identity, typename _Proj2 = identity>
-    requires indirectly_comparable<_Iter1, _Iter2, _Pred, _Proj1, _Proj2>
-    constexpr subrange<_Iter1>
-    __find_end(_Iter1 __first1, _Sent1 __last1,
-              _Iter2 __first2, _Sent2 __last2,
-              _Pred __pred, _Proj1 __proj1, _Proj2 __proj2)
-    {
-      auto __i = ranges::next(__first1, __last1);
-      if (__first2 == __last2)
-       return {__i, __i};
 
-      auto __result_begin = __i;
-      auto __result_end = __i;
-      for (;;)
-       {
-         auto __new_range = ranges::search(__first1, __last1,
-                                           __first2, __last2,
-                                           __pred, __proj1, __proj2);
-         auto __new_result_begin = ranges::begin(__new_range);
-         auto __new_result_end = ranges::end(__new_range);
-         if (__new_result_begin == __last1)
-           return {__result_begin, __result_end};
-         else
-           {
-             __result_begin = __new_result_begin;
-             __result_end = __new_result_end;
-             __first1 = __result_begin;
-             ++__first1;
-           }
-       }
-    }
 
   template<forward_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
           forward_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
@@ -578,9 +545,31 @@ namespace ranges
            return {__result_first, __result_last};
        }
       else
-       return ranges::__find_end(__first1, __last1, __first2, __last2,
-                                 std::move(__pred),
-                                 std::move(__proj1), std::move(__proj2));
+       {
+         auto __i = ranges::next(__first1, __last1);
+         if (__first2 == __last2)
+           return {__i, __i};
+
+         auto __result_begin = __i;
+         auto __result_end = __i;
+         for (;;)
+           {
+             auto __new_range = ranges::search(__first1, __last1,
+                                               __first2, __last2,
+                                               __pred, __proj1, __proj2);
+             auto __new_result_begin = ranges::begin(__new_range);
+             auto __new_result_end = ranges::end(__new_range);
+             if (__new_result_begin == __last1)
+               return {__result_begin, __result_end};
+             else
+               {
+                 __result_begin = __new_result_begin;
+                 __result_end = __new_result_end;
+                 __first1 = __result_begin;
+                 ++__first1;
+               }
+           }
+       }
     }
 
   template<forward_range _Range1, forward_range _Range2,
@@ -2908,14 +2897,26 @@ namespace ranges
 
   template<input_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
           input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
-          typename _Proj1, typename _Proj2,
+          typename _Proj1 = identity, typename _Proj2 = identity,
           indirect_strict_weak_order<projected<_Iter1, _Proj1>,
-                                     projected<_Iter2, _Proj2>> _Comp>
+                                     projected<_Iter2, _Proj2>>
+            _Comp = ranges::less>
     constexpr bool
-    __lexicographical_compare(_Iter1 __first1, _Sent1 __last1,
-                             _Iter2 __first2, _Sent2 __last2,
-                             _Comp __comp, _Proj1 __proj1, _Proj2 __proj2)
+    lexicographical_compare(_Iter1 __first1, _Sent1 __last1,
+                           _Iter2 __first2, _Sent2 __last2,
+                           _Comp __comp = {},
+                           _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
     {
+      if constexpr (__detail::__is_normal_iterator<_Iter1>
+                   || __detail::__is_normal_iterator<_Iter2>)
+       return ranges::lexicographical_compare
+                (std::__niter_base(std::move(__first1)),
+                 std::__niter_base(std::move(__last1)),
+                 std::__niter_base(std::move(__first2)),
+                 std::__niter_base(std::move(__last2)),
+                 std::move(__comp),
+                 std::move(__proj1), std::move(__proj2));
+
       constexpr bool __sized_iters
        = (sized_sentinel_for<_Sent1, _Iter1>
           && sized_sentinel_for<_Sent2, _Iter2>);
@@ -2976,27 +2977,6 @@ namespace ranges
       return __first1 == __last1 && __first2 != __last2;
     }
 
-  template<input_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
-          input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
-          typename _Proj1 = identity, typename _Proj2 = identity,
-          indirect_strict_weak_order<projected<_Iter1, _Proj1>,
-                                     projected<_Iter2, _Proj2>>
-            _Comp = ranges::less>
-    constexpr bool
-    lexicographical_compare(_Iter1 __first1, _Sent1 __last1,
-                           _Iter2 __first2, _Sent2 __last2,
-                           _Comp __comp = {},
-                           _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
-    {
-      return (ranges::__lexicographical_compare
-             (std::__niter_base(std::move(__first1)),
-              std::__niter_base(std::move(__last1)),
-              std::__niter_base(std::move(__first2)),
-              std::__niter_base(std::move(__last2)),
-              std::move(__comp),
-              std::move(__proj1), std::move(__proj2)));
-    }
-
   template<input_range _Range1, input_range _Range2, typename _Proj1 = identity,
           typename _Proj2 = identity,
           indirect_strict_weak_order<projected<iterator_t<_Range1>, _Proj1>,
index f63c032cf0bb937ede7dc5b87dda18d5a0c07127..813a5096ae00384fd7a1aed83ef8965f91a72f27 100644 (file)
@@ -73,14 +73,24 @@ namespace ranges
 
   template<input_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
           input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
-          typename _Pred, typename _Proj1, typename _Proj2>
+          typename _Pred = ranges::equal_to,
+          typename _Proj1 = identity, typename _Proj2 = identity>
     requires indirectly_comparable<_Iter1, _Iter2, _Pred, _Proj1, _Proj2>
     constexpr bool
-    __equal(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2,
-           _Pred __pred, _Proj1 __proj1, _Proj2 __proj2)
+    equal(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2,
+         _Pred __pred = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
     {
       // TODO: implement more specializations to at least have parity with
       // std::equal.
+      if constexpr (__detail::__is_normal_iterator<_Iter1>
+                   || __detail::__is_normal_iterator<_Iter2>)
+       return ranges::equal(std::__niter_base(std::move(__first1)),
+                            std::__niter_base(std::move(__last1)),
+                            std::__niter_base(std::move(__first2)),
+                            std::__niter_base(std::move(__last2)),
+                            std::move(__pred),
+                            std::move(__proj1), std::move(__proj2));
+
       constexpr bool __sized_iters
        = (sized_sentinel_for<_Sent1, _Iter1>
           && sized_sentinel_for<_Sent2, _Iter2>);
@@ -129,23 +139,6 @@ namespace ranges
        }
     }
 
-  template<input_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
-          input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
-          typename _Pred = ranges::equal_to,
-          typename _Proj1 = identity, typename _Proj2 = identity>
-    requires indirectly_comparable<_Iter1, _Iter2, _Pred, _Proj1, _Proj2>
-    constexpr bool
-    equal(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2,
-         _Pred __pred = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
-    {
-      return ranges::__equal(std::__niter_base(std::move(__first1)),
-                            std::__niter_base(std::move(__last1)),
-                            std::__niter_base(std::move(__first2)),
-                            std::__niter_base(std::move(__last2)),
-                            std::move(__pred),
-                            std::move(__proj1), std::move(__proj2));
-    }
-
   template<input_range _Range1, input_range _Range2,
           typename _Pred = ranges::equal_to,
           typename _Proj1 = identity, typename _Proj2 = identity>