diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2020-02-26 15:19:44 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2020-02-26 15:19:44 +0000 |
commit | 113f0a639dbdd78048373a253ec64145ead7d29d (patch) | |
tree | 9aef310f7e7e4d1c7b6c58925926538e190b4e5b | |
parent | 8017d95c7f55b98bcee1caf0216fdfd7fd613849 (diff) | |
download | gcc-113f0a639dbdd78048373a253ec64145ead7d29d.zip gcc-113f0a639dbdd78048373a253ec64145ead7d29d.tar.gz gcc-113f0a639dbdd78048373a253ec64145ead7d29d.tar.bz2 |
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.
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/ranges_algo.h | 10 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_algobase.h | 21 |
3 files changed, 19 insertions, 19 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index c13d6fc..d545526 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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. diff --git a/libstdc++-v3/include/bits/ranges_algo.h b/libstdc++-v3/include/bits/ranges_algo.h index 7d7dbf0..05c0851 100644 --- a/libstdc++-v3/include/bits/ranges_algo.h +++ b/libstdc++-v3/include/bits/ranges_algo.h @@ -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; } } diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h index 2685693..e4f7fa4 100644 --- a/libstdc++-v3/include/bits/stl_algobase.h +++ b/libstdc++-v3/include/bits/stl_algobase.h @@ -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> { |