Re: [PATCH 1/3] libstdc++: Fold some ranges algo subroutines into their only caller

2020-02-15 Thread Patrick Palka
On Sat, 15 Feb 2020, Jonathan Wakely wrote:

> On 14/02/20 10:35 -0500, Patrick Palka wrote:
> > 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.
> 
> OK for master, but please note the two comments below.
> 
> 
> > libstdc++-v3/include/bits/ranges_algo.h | 104 
> > libstdc++-v3/include/bits/ranges_algobase.h |  33 +++
> > 2 files changed, 55 insertions(+), 82 deletions(-)
> > 
> > diff --git a/libstdc++-v3/include/bits/ranges_algo.h
> > b/libstdc++-v3/include/bits/ranges_algo.h
> > index 84a02cabb80..6b6f4defdf5 100644
> > --- a/libstdc++-v3/include/bits/ranges_algo.h
> > +++ b/libstdc++-v3/include/bits/ranges_algo.h
> > @@ -513,40 +513,7 @@ namespace ranges
> >   std::move(__pred), std::move(__proj));
> > }
> > 
> > -  template _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 _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 > @@ -2908,14 +2897,26 @@ namespace ranges
> > 
> >   template _Sent1,
> >input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
> > -  typename _Proj1, typename _Proj2,
> > +  typename _Proj1 = identity, typename _Proj2 = identity,
> >indirect_strict_weak_order,
> > - 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 

Re: [PATCH 1/3] libstdc++: Fold some ranges algo subroutines into their only caller

2020-02-14 Thread Jonathan Wakely

On 14/02/20 10:35 -0500, Patrick Palka wrote:

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.


OK for master, but please note the two comments below.



libstdc++-v3/include/bits/ranges_algo.h | 104 
libstdc++-v3/include/bits/ranges_algobase.h |  33 +++
2 files changed, 55 insertions(+), 82 deletions(-)

diff --git a/libstdc++-v3/include/bits/ranges_algo.h 
b/libstdc++-v3/include/bits/ranges_algo.h
index 84a02cabb80..6b6f4defdf5 100644
--- a/libstdc++-v3/include/bits/ranges_algo.h
+++ b/libstdc++-v3/include/bits/ranges_algo.h
@@ -513,40 +513,7 @@ namespace ranges
  std::move(__pred), std::move(__proj));
}

-  template _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 _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 _Sent1,
   input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
-  typename _Proj1, typename _Proj2,
+  typename _Proj1 = identity, typename _Proj2 = identity,
   indirect_strict_weak_order,
- 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)),
+ 

[PATCH 1/3] libstdc++: Fold some ranges algo subroutines into their only caller

2020-02-14 Thread Patrick Palka
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/include/bits/ranges_algo.h | 104 
 libstdc++-v3/include/bits/ranges_algobase.h |  33 +++
 2 files changed, 55 insertions(+), 82 deletions(-)

diff --git a/libstdc++-v3/include/bits/ranges_algo.h 
b/libstdc++-v3/include/bits/ranges_algo.h
index 84a02cabb80..6b6f4defdf5 100644
--- a/libstdc++-v3/include/bits/ranges_algo.h
+++ b/libstdc++-v3/include/bits/ranges_algo.h
@@ -513,40 +513,7 @@ namespace ranges
  std::move(__pred), std::move(__proj));
 }
 
-  template _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 _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 _Sent1,
   input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
-  typename _Proj1, typename _Proj2,
+  typename _Proj1 = identity, typename _Proj2 = identity,
   indirect_strict_weak_order,
- 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)),
+