From ee4d1bb7ebafdce8cd10bc391298998d407ac6b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Fri, 13 Mar 2026 23:17:46 +0100 Subject: [PATCH] Implement segmented_remove_if as segmented_find_if + segmented_remove_copy_if --- .../experimental/segmented_remove_if.hpp | 87 +++---------------- 1 file changed, 10 insertions(+), 77 deletions(-) diff --git a/include/boost/container/experimental/segmented_remove_if.hpp b/include/boost/container/experimental/segmented_remove_if.hpp index 113f2af..acb069e 100644 --- a/include/boost/container/experimental/segmented_remove_if.hpp +++ b/include/boost/container/experimental/segmented_remove_if.hpp @@ -22,93 +22,26 @@ #include #include #include +#include + #include namespace boost { namespace container { -template -FwdIt segmented_remove_if(FwdIt first, Sent last, Predicate pred); - -namespace detail_algo { - -template -void remove_if_scan(FwdIt first, FwdIt last, OutIter& result, Predicate& pred, non_segmented_iterator_tag) -{ - for(; first != last; ++first) { - if(!pred(*first)) { - *result = boost::move(*first); - ++result; - } - } -} - -template -void remove_if_scan(SegIt first, SegIt last, OutIter& result, Predicate& pred, segmented_iterator_tag) -{ - typedef segmented_iterator_traits traits; - typedef typename traits::local_iterator local_iterator; - typedef typename segmented_iterator_traits::is_segmented_iterator is_local_seg_t; - typename traits::segment_iterator scur = traits::segment(first); - typename traits::segment_iterator slast = traits::segment(last); - local_iterator lcur = traits::local(first); - if(scur == slast) { - remove_if_scan(lcur, traits::local(last), result, pred, is_local_seg_t()); - } - else { - remove_if_scan(lcur, traits::end(scur), result, pred, - is_local_seg_t()); - for(++scur; scur != slast; ++scur) - remove_if_scan(traits::begin(scur), traits::end(scur), result, pred, - is_local_seg_t()); - remove_if_scan(traits::begin(scur), traits::local(last), result, pred, - is_local_seg_t()); - } -} - -template -SegIter segmented_remove_if_dispatch - (SegIter first, SegIter last, Predicate pred, segmented_iterator_tag) -{ - SegIter result = first; - remove_if_scan(first, last, result, pred, segmented_iterator_tag()); - return result; -} - -template -typename algo_enable_if_c< - !Tag::value || is_sentinel::value, FwdIt>::type -segmented_remove_if_dispatch - (FwdIt first, Sent last, Predicate pred, Tag) -{ - FwdIt result = first; - for(; first != last; ++first) { - if(!pred(*first)) { - if(result != first) - *result = boost::move(*first); - ++result; - } - } - return result; -} - -} // namespace detail_algo //! Removes all elements for which \c pred returns true from [first, last), //! moving retained elements forward. Returns iterator to new end. template inline FwdIt segmented_remove_if(FwdIt first, Sent last, Predicate pred) -{/* - typedef segmented_iterator_traits traits; - return detail_algo::segmented_remove_if_dispatch(first, last, pred, - typename traits::is_segmented_iterator()); - */ - first = segmented_find_if(first, last, pred); - if (first != last) - for (FwdIt i = first; ++i != last;) - if (!pred(*i)) - *first++ = std::move(*i); - return first; +{ + first = segmented_find_if(first, last, pred); + if (first == last) + return last; + + FwdIt next = first; + ++next; + return segmented_remove_copy_if(next, last, first, pred); } } // namespace container