libstdc++ Two simplifications for lexicographical_compare
* include/bits/ranges_algo.h (__lexicographical_compare_fn): Declare variables in smaller scope and avoid calling ranges::distance when we know they are pointers. Remove statically-unreachable use of __builtin_unreachable(). * include/bits/stl_algobase.h (__lexicographical_compare::__lc): Define inline.
This commit is contained in:
parent
8017d95c7f
commit
113f0a639d
3 changed files with 19 additions and 19 deletions
|
@ -1,5 +1,12 @@
|
|||
2020-02-26 Jonathan Wakely <jwakely@redhat.com>
|
||||
|
||||
* include/bits/ranges_algo.h (__lexicographical_compare_fn): Declare
|
||||
variables in smaller scope and avoid calling ranges::distance when we
|
||||
know they are pointers. Remove statically-unreachable use of
|
||||
__builtin_unreachable().
|
||||
* include/bits/stl_algobase.h (__lexicographical_compare::__lc):
|
||||
Define inline.
|
||||
|
||||
* include/std/ranges (__detail::__maybe_empty_t): Define new helper
|
||||
alias.
|
||||
(__detail::__maybe_const_t): Likewise.
|
||||
|
|
|
@ -3464,9 +3464,6 @@ namespace ranges
|
|||
&& sized_sentinel_for<_Sent2, _Iter2>);
|
||||
if constexpr (__sized_iters)
|
||||
{
|
||||
auto __d1 = ranges::distance(__first1, __last1);
|
||||
auto __d2 = ranges::distance(__first2, __last2);
|
||||
|
||||
using _ValueType1 = iter_value_t<_Iter1>;
|
||||
using _ValueType2 = iter_value_t<_Iter2>;
|
||||
constexpr bool __use_memcmp
|
||||
|
@ -3480,6 +3477,9 @@ namespace ranges
|
|||
&& is_same_v<_Proj2, identity>);
|
||||
if constexpr (__use_memcmp)
|
||||
{
|
||||
const auto __d1 = __last1 - __first1;
|
||||
const auto __d2 = __last2 - __first2;
|
||||
|
||||
if (const auto __len = std::min(__d1, __d2))
|
||||
{
|
||||
const auto __c
|
||||
|
@ -3498,10 +3498,8 @@ namespace ranges
|
|||
if (__c < 0)
|
||||
return false;
|
||||
}
|
||||
else
|
||||
__builtin_unreachable();
|
||||
}
|
||||
return (__last1 - __first1 < __last2 - __first2);
|
||||
return __d1 < __d2;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1254,21 +1254,16 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
|
|||
{
|
||||
template<typename _II1, typename _II2>
|
||||
_GLIBCXX20_CONSTEXPR
|
||||
static bool __lc(_II1, _II1, _II2, _II2);
|
||||
static bool
|
||||
__lc(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
|
||||
{
|
||||
using __gnu_cxx::__ops::__iter_less_iter;
|
||||
return std::__lexicographical_compare_impl(__first1, __last1,
|
||||
__first2, __last2,
|
||||
__iter_less_iter());
|
||||
}
|
||||
};
|
||||
|
||||
template<bool _BoolType>
|
||||
template<typename _II1, typename _II2>
|
||||
_GLIBCXX20_CONSTEXPR
|
||||
bool
|
||||
__lexicographical_compare<_BoolType>::
|
||||
__lc(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
|
||||
{
|
||||
return std::__lexicographical_compare_impl(__first1, __last1,
|
||||
__first2, __last2,
|
||||
__gnu_cxx::__ops::__iter_less_iter());
|
||||
}
|
||||
|
||||
template<>
|
||||
struct __lexicographical_compare<true>
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue