Commit 9b4f00dd by Jonathan Wakely

libstdc++: Micro-optimisations for lexicographical_compare_three_way

As noted in LWG 3410 the specification in the C++20 draft performs more
iterator comparisons than necessary when the end of either range is
reached. Our implementation followed that specification. This removes
the redundant comparisons so that we do no unnecessary work as soon as
we find that we've reached the end of either range.

The odd-looking return statement is because it generates better code
than the original version that copied the global constants.

	* include/bits/stl_algobase.h (lexicographical_compare_three_way):
	Avoid redundant iterator comparisons (LWG 3410).
parent b07e4e7c
2020-03-03 Jonathan Wakely <jwakely@redhat.com>
* include/bits/stl_algobase.h (lexicographical_compare_three_way):
Avoid redundant iterator comparisons (LWG 3410).
2020-03-02 Jonathan Wakely <jwakely@redhat.com> 2020-03-02 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/93972 PR libstdc++/93972
......
...@@ -1711,15 +1711,16 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO ...@@ -1711,15 +1711,16 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
return __lencmp; return __lencmp;
} }
#endif // is_constant_evaluated #endif // is_constant_evaluated
while (__first1 != __last1 && __first2 != __last2) while (__first1 != __last1)
{ {
if (__first2 == __last2)
return strong_ordering::greater;
if (auto __cmp = __comp(*__first1, *__first2); __cmp != 0) if (auto __cmp = __comp(*__first1, *__first2); __cmp != 0)
return __cmp; return __cmp;
++__first1; ++__first1;
++__first2; ++__first2;
} }
return __first1 != __last1 ? strong_ordering::greater return (__first2 == __last2) <=> true; // See PR 94006
: __first2 != __last2 ? strong_ordering::less : strong_ordering::equal;
} }
template<typename _InputIter1, typename _InputIter2> template<typename _InputIter1, typename _InputIter2>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment