From cf26a274e564b4ef056dcf046cec3f0384e0ff9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Fri, 20 Mar 2026 13:02:34 +0100 Subject: [PATCH] Simplify end condition checking. --- .../experimental/segmented_find_if.hpp | 13 ++--- .../experimental/segmented_find_last_if.hpp | 51 +++++++++---------- 2 files changed, 28 insertions(+), 36 deletions(-) diff --git a/include/boost/container/experimental/segmented_find_if.hpp b/include/boost/container/experimental/segmented_find_if.hpp index 63b8f1b..6613574 100644 --- a/include/boost/container/experimental/segmented_find_if.hpp +++ b/include/boost/container/experimental/segmented_find_if.hpp @@ -38,8 +38,6 @@ SegIter segmented_find_if_dispatch typedef typename traits::local_iterator local_iterator; typedef typename traits::segment_iterator segment_iterator; - if(first == last) return last; - segment_iterator sfirst = traits::segment(first); const segment_iterator slast = traits::segment(last); const local_iterator lf = traits::local(first); @@ -47,8 +45,7 @@ SegIter segmented_find_if_dispatch if(sfirst == slast) { const local_iterator ll = traits::local(last); local_iterator r = (segmented_find_if)(lf, ll, pred); - if (r != ll) - return traits::compose(sfirst, r); + return traits::compose(sfirst, r); } else { //First segment @@ -69,11 +66,9 @@ SegIter segmented_find_if_dispatch { const local_iterator ll = traits::local(last); const local_iterator r = (segmented_find_if)(traits::begin(sfirst), ll, pred); - if (r != ll) - return traits::compose(sfirst, r); + return traits::compose(sfirst, r); } } - return last; } template @@ -83,8 +78,8 @@ segmented_find_if_dispatch(InpIter first, Sent last, Pred pred, Tag) { for(; first != last; ++first) if(pred(*first)) - return first; - return last; + break; + return first; } } // namespace detail_algo diff --git a/include/boost/container/experimental/segmented_find_last_if.hpp b/include/boost/container/experimental/segmented_find_last_if.hpp index 5f69dd3..410c92b 100644 --- a/include/boost/container/experimental/segmented_find_last_if.hpp +++ b/include/boost/container/experimental/segmented_find_last_if.hpp @@ -70,8 +70,6 @@ SegIt find_last_if_scan(SegIt first, SegIt last, Pred pred, typedef typename traits::segment_iterator segment_iterator; typedef typename segmented_iterator_traits::is_segmented_iterator is_local_seg_t; - if (first == last) return last; - SegIt result = last; segment_iterator sfirst = traits::segment(first); const segment_iterator slast = traits::segment(last); @@ -80,34 +78,33 @@ SegIt find_last_if_scan(SegIt first, SegIt last, Pred pred, const local_iterator lf = traits::local(first); const local_iterator ll = traits::local(last); const local_iterator r = find_last_if_scan(lf, ll, pred, is_local_seg_t(), cat); - if (r != ll) - return traits::compose(sfirst, r); - return last; + return traits::compose(sfirst, r); } + else { + // First segment + { + const local_iterator le = traits::end(sfirst); + const local_iterator r = find_last_if_scan(traits::local(first), le, pred, is_local_seg_t(), cat); + if (r != le) + result = traits::compose(sfirst, r); + } + // Middle segments + for (++sfirst; sfirst != slast; ++sfirst) { + const local_iterator le = traits::end(sfirst); + const local_iterator r = find_last_if_scan(traits::begin(sfirst), le, pred, is_local_seg_t(), cat); + if (r != le) + result = traits::compose(sfirst, r); + } + // Last segment + { + const local_iterator ll = traits::local(last); + const local_iterator r = find_last_if_scan(traits::begin(sfirst), ll, pred, is_local_seg_t(), cat); + if (r != ll) + result = traits::compose(sfirst, r); + } - // First segment - { - const local_iterator le = traits::end(sfirst); - const local_iterator r = find_last_if_scan(traits::local(first), le, pred, is_local_seg_t(), cat); - if (r != le) - result = traits::compose(sfirst, r); + return result; } - // Middle segments - for (++sfirst; sfirst != slast; ++sfirst) { - const local_iterator le = traits::end(sfirst); - const local_iterator r = find_last_if_scan(traits::begin(sfirst), le, pred, is_local_seg_t(), cat); - if (r != le) - result = traits::compose(sfirst, r); - } - // Last segment - { - const local_iterator ll = traits::local(last); - const local_iterator r = find_last_if_scan(traits::begin(sfirst), ll, pred, is_local_seg_t(), cat); - if (r != ll) - result = traits::compose(sfirst, r); - } - - return result; } //////////////////////////////////////////////