From b27f426cea50700412a9386c9eeed0ccdb510c8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Sun, 26 Jul 2026 00:47:17 +0200 Subject: [PATCH] Merge single-segment case with the final segment case to reduce code size. --- .../experimental/segmented_count.hpp | 15 +++---- .../experimental/segmented_count_if.hpp | 15 +++---- .../container/experimental/segmented_fill.hpp | 13 ++++--- .../container/experimental/segmented_find.hpp | 39 +++++++++---------- .../experimental/segmented_find_if.hpp | 39 +++++++++---------- .../experimental/segmented_for_each.hpp | 13 ++++--- 6 files changed, 66 insertions(+), 68 deletions(-) diff --git a/include/boost/container/experimental/segmented_count.hpp b/include/boost/container/experimental/segmented_count.hpp index b99e589..efb224b 100644 --- a/include/boost/container/experimental/segmented_count.hpp +++ b/include/boost/container/experimental/segmented_count.hpp @@ -66,18 +66,19 @@ typename boost::container::iterator_traits::difference_type segment_iterator sfirst = traits::segment(first); segment_iterator slast = traits::segment(last); - if(sfirst == slast) { - return (segmented_count_dispatch)(traits::local(first), traits::local(last), value, is_local_seg_t(), local_cat_t()); - } - else { - typename boost::container::iterator_traits::difference_type result = 0; - result += (segmented_count_dispatch)(traits::local(first), traits::end(sfirst), value, is_local_seg_t(), local_cat_t()); + typename boost::container::iterator_traits::difference_type result = 0; + local_iterator lb = traits::local(first); + + if(BOOST_LIKELY(sfirst != slast)) { + result += (segmented_count_dispatch)(lb, traits::end(sfirst), value, is_local_seg_t(), local_cat_t()); for(++sfirst; sfirst != slast; ++sfirst) result += (segmented_count_dispatch)(traits::begin(sfirst), traits::end(sfirst), value, is_local_seg_t(), local_cat_t()); - return result += (segmented_count_dispatch)(traits::begin(sfirst), traits::local(last), value, is_local_seg_t(), local_cat_t()); + lb = traits::begin(slast); } + //Last segment, shared with the single-segment case above + return result += (segmented_count_dispatch)(lb, traits::local(last), value, is_local_seg_t(), local_cat_t()); } } // namespace detail_algo diff --git a/include/boost/container/experimental/segmented_count_if.hpp b/include/boost/container/experimental/segmented_count_if.hpp index a8430a6..6c67487 100644 --- a/include/boost/container/experimental/segmented_count_if.hpp +++ b/include/boost/container/experimental/segmented_count_if.hpp @@ -65,18 +65,19 @@ typename boost::container::iterator_traits::difference_type segment_iterator sfirst = traits::segment(first); segment_iterator slast = traits::segment(last); - if(sfirst == slast) { - return (segmented_count_if_dispatch)(traits::local(first), traits::local(last), pred, is_local_seg_t(), local_cat_t()); - } - else { - typename boost::container::iterator_traits::difference_type result = 0; - result += (segmented_count_if_dispatch)(traits::local(first), traits::end(sfirst), pred, is_local_seg_t(), local_cat_t()); + typename boost::container::iterator_traits::difference_type result = 0; + local_iterator lb = traits::local(first); + + if(BOOST_LIKELY(sfirst != slast)) { + result += (segmented_count_if_dispatch)(lb, traits::end(sfirst), pred, is_local_seg_t(), local_cat_t()); for(++sfirst; sfirst != slast; ++sfirst) result += (segmented_count_if_dispatch)(traits::begin(sfirst), traits::end(sfirst), pred, is_local_seg_t(), local_cat_t()); - return result += (segmented_count_if_dispatch)(traits::begin(sfirst), traits::local(last), pred, is_local_seg_t(), local_cat_t()); + lb = traits::begin(slast); } + //Last segment, shared with the single-segment case above + return result += (segmented_count_if_dispatch)(lb, traits::local(last), pred, is_local_seg_t(), local_cat_t()); } } // namespace detail_algo diff --git a/include/boost/container/experimental/segmented_fill.hpp b/include/boost/container/experimental/segmented_fill.hpp index c60a773..7f5c17b 100644 --- a/include/boost/container/experimental/segmented_fill.hpp +++ b/include/boost/container/experimental/segmented_fill.hpp @@ -55,17 +55,18 @@ void segmented_fill_range segment_iterator sfirst = traits::segment(first); segment_iterator slast = traits::segment(last); - if(sfirst == slast) { - (segmented_fill_range)(traits::local(first), traits::local(last), value, is_local_seg_t(), local_cat_t()); - } - else { - (segmented_fill_range)(traits::local(first), traits::end(sfirst), value, is_local_seg_t(), local_cat_t()); + local_iterator lb = traits::local(first); + + if(BOOST_LIKELY(sfirst != slast)) { + (segmented_fill_range)(lb, traits::end(sfirst), value, is_local_seg_t(), local_cat_t()); for(++sfirst; sfirst != slast; ++sfirst) (segmented_fill_range)(traits::begin(sfirst), traits::end(sfirst), value, is_local_seg_t(), local_cat_t()); - (segmented_fill_range)(traits::begin(sfirst), traits::local(last), value, is_local_seg_t(), local_cat_t()); + lb = traits::begin(slast); } + //Last segment, shared with the single-segment case above + (segmented_fill_range)(lb, traits::local(last), value, is_local_seg_t(), local_cat_t()); } template diff --git a/include/boost/container/experimental/segmented_find.hpp b/include/boost/container/experimental/segmented_find.hpp index a40a685..c5cdbbe 100644 --- a/include/boost/container/experimental/segmented_find.hpp +++ b/include/boost/container/experimental/segmented_find.hpp @@ -57,34 +57,31 @@ SegIter segmented_find_dispatch segment_iterator sfirst = traits::segment(first); const segment_iterator slast = traits::segment(last); - if(sfirst == slast) { - const local_iterator ll = traits::local(last); - const local_iterator r = (segmented_find_dispatch)(traits::local(first), ll, value, is_local_seg_t(), local_cat_t()); - if (r != ll) - return traits::compose(sfirst, r); - } - else { + local_iterator lb = traits::local(first); + + if(BOOST_LIKELY(sfirst != slast)) { //First segment { - const local_iterator le = traits::end(sfirst); - const local_iterator r = (segmented_find_dispatch)(traits::local(first), le, value, is_local_seg_t(), local_cat_t()); - if (r != le) + const local_iterator fe = traits::end(sfirst); + const local_iterator r = (segmented_find_dispatch)(lb, fe, value, is_local_seg_t(), local_cat_t()); + if (r != fe) return traits::compose(sfirst, r); } //Middle segments for (++sfirst; sfirst != slast; ++sfirst) { - const local_iterator le = traits::end(sfirst); - const local_iterator r = (segmented_find_dispatch)(traits::begin(sfirst), le, value, is_local_seg_t(), local_cat_t()); - if (r != le) - return traits::compose(sfirst, r); - } - //Last segment - { - const local_iterator ll = traits::local(last); - const local_iterator r = (segmented_find_dispatch)(traits::begin(slast), traits::local(last), value, is_local_seg_t(), local_cat_t()); - if (r != ll) - return traits::compose(sfirst, r); + const local_iterator me = traits::end(sfirst); + const local_iterator mr = (segmented_find_dispatch)(traits::begin(sfirst), me, value, is_local_seg_t(), local_cat_t()); + if (mr != me) + return traits::compose(sfirst, mr); } + lb = traits::begin(slast); + } + //Last segment, shared with the single-segment case above + { + const local_iterator le = traits::local(last); + const local_iterator r = (segmented_find_dispatch)(lb, le, value, is_local_seg_t(), local_cat_t()); + if (r != le) + return traits::compose(sfirst, r); } return last; } diff --git a/include/boost/container/experimental/segmented_find_if.hpp b/include/boost/container/experimental/segmented_find_if.hpp index c218820..c17db94 100644 --- a/include/boost/container/experimental/segmented_find_if.hpp +++ b/include/boost/container/experimental/segmented_find_if.hpp @@ -57,34 +57,31 @@ SegIter segmented_find_if_dispatch segment_iterator sfirst = traits::segment(first); const segment_iterator slast = traits::segment(last); - if(sfirst == slast) { - const local_iterator ll = traits::local(last); - const local_iterator r = (segmented_find_if_dispatch)(traits::local(first), ll, pred, is_local_seg_t(), local_cat_t()); - if (r != ll) - return traits::compose(sfirst, r); - } - else { + local_iterator lb = traits::local(first); + + if(BOOST_LIKELY(sfirst != slast)) { //First segment { - const local_iterator le = traits::end(sfirst); - const local_iterator r = (segmented_find_if_dispatch)(traits::local(first), le, pred, is_local_seg_t(), local_cat_t()); - if (r != le) + const local_iterator fe = traits::end(sfirst); + const local_iterator r = (segmented_find_if_dispatch)(lb, fe, pred, is_local_seg_t(), local_cat_t()); + if (r != fe) return traits::compose(sfirst, r); } //Middle segments for (++sfirst; sfirst != slast; ++sfirst) { - const local_iterator le = traits::end(sfirst); - const local_iterator r = (segmented_find_if_dispatch)(traits::begin(sfirst), le, pred, is_local_seg_t(), local_cat_t()); - if (r != le) - return traits::compose(sfirst, r); - } - //Last segment - { - const local_iterator ll = traits::local(last); - const local_iterator r = (segmented_find_if_dispatch)(traits::begin(slast), traits::local(last), pred, is_local_seg_t(), local_cat_t()); - if (r != ll) - return traits::compose(sfirst, r); + const local_iterator me = traits::end(sfirst); + const local_iterator mr = (segmented_find_if_dispatch)(traits::begin(sfirst), me, pred, is_local_seg_t(), local_cat_t()); + if (mr != me) + return traits::compose(sfirst, mr); } + lb = traits::begin(slast); + } + //Last segment, shared with the single-segment case above + { + const local_iterator le = traits::local(last); + const local_iterator r = (segmented_find_if_dispatch)(lb, le, pred, is_local_seg_t(), local_cat_t()); + if (r != le) + return traits::compose(sfirst, r); } return last; } diff --git a/include/boost/container/experimental/segmented_for_each.hpp b/include/boost/container/experimental/segmented_for_each.hpp index 4ac5b18..769f9aa 100644 --- a/include/boost/container/experimental/segmented_for_each.hpp +++ b/include/boost/container/experimental/segmented_for_each.hpp @@ -58,15 +58,16 @@ F segmented_for_each_dispatch segment_iterator sfirst = traits::segment(first); segment_iterator slast = traits::segment(last); - if(sfirst == slast) { - return (segmented_for_each_dispatch)(traits::local(first), traits::local(last), boost::move(f), is_local_seg_t(), local_cat_t()); - } - else { - f = (segmented_for_each_dispatch)(traits::local(first), traits::end(sfirst), boost::move(f), is_local_seg_t(), local_cat_t()); + local_iterator lb = traits::local(first); + + if(BOOST_LIKELY(sfirst != slast)) { + f = (segmented_for_each_dispatch)(lb, traits::end(sfirst), boost::move(f), is_local_seg_t(), local_cat_t()); for(++sfirst; sfirst != slast; ++sfirst) f = (segmented_for_each_dispatch)(traits::begin(sfirst), traits::end(sfirst), boost::move(f), is_local_seg_t(), local_cat_t()); - return (segmented_for_each_dispatch)(traits::begin(sfirst), traits::local(last), boost::move(f), is_local_seg_t(), local_cat_t()); + lb = traits::begin(slast); } + //Last segment, shared with the single-segment case above + return (segmented_for_each_dispatch)(lb, traits::local(last), boost::move(f), is_local_seg_t(), local_cat_t()); } } // namespace detail_algo