From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2136) id A18D3395305D; Wed, 17 Jun 2020 18:54:27 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A18D3395305D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1592420067; bh=+c+276cIb+vQeUGtut9vK779iKgho48i+d4hzC6l2J4=; h=From:To:Subject:Date:From; b=C9uNIHUZKhozhh668alw7CN+0R+4tSw84CHzvw9HGrsXtMKk6VySo2iX24/MFXRIo eqy3A8cgvrUxN9u2S8XRkktWRKGqs7Tu31MpcxMOhugYR8xtIjm5OKOwdMCTZHJCD9 Hse6WbYwM3BUltqs6SMF0iEDXe6whcfjgeqM4Hzc= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Aldy Hernandez To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc/devel/ranger] libstdc++: Fold some ranges algo subroutines into their only caller X-Act-Checkin: gcc X-Git-Author: Patrick Palka X-Git-Refname: refs/heads/devel/ranger X-Git-Oldrev: acff02ef1f4bc951ab7b4e3fdc117e0646d5d8f5 X-Git-Newrev: 90b7eb6539b6cb23ddb63521a38cef8c42b55f9a Message-Id: <20200617185427.A18D3395305D@sourceware.org> Date: Wed, 17 Jun 2020 18:54:27 +0000 (GMT) X-BeenThere: libstdc++-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 Jun 2020 18:54:27 -0000 https://gcc.gnu.org/g:90b7eb6539b6cb23ddb63521a38cef8c42b55f9a commit 90b7eb6539b6cb23ddb63521a38cef8c42b55f9a Author: Patrick Palka Date: Thu Feb 13 10:55:10 2020 -0500 libstdc++: Fold some ranges algo subroutines into their only caller 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. Diff: --- libstdc++-v3/ChangeLog | 9 +++ libstdc++-v3/include/bits/ranges_algo.h | 104 +++++++++++----------------- libstdc++-v3/include/bits/ranges_algobase.h | 33 ++++----- 3 files changed, 64 insertions(+), 82 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 3c7720579c4..624c0c2f7c9 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2020-02-15 Patrick Palka + + * 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 * include/bits/erase_if.h (__cpp_lib_erase_if): Define to 202002L. 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)), + 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 _Sent1, - input_iterator _Iter2, sentinel_for<_Iter2> _Sent2, - typename _Proj1 = identity, typename _Proj2 = identity, - indirect_strict_weak_order, - 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, _Proj1>, diff --git a/libstdc++-v3/include/bits/ranges_algobase.h b/libstdc++-v3/include/bits/ranges_algobase.h index f63c032cf0b..813a5096ae0 100644 --- a/libstdc++-v3/include/bits/ranges_algobase.h +++ b/libstdc++-v3/include/bits/ranges_algobase.h @@ -73,14 +73,24 @@ namespace ranges template _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 _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