Merge single-segment case with the final segment case to reduce code size.

This commit is contained in:
Ion Gaztañaga
2026-07-26 00:47:17 +02:00
parent dcae4895f1
commit b27f426cea
6 changed files with 66 additions and 68 deletions
@@ -66,18 +66,19 @@ typename boost::container::iterator_traits<SegIter>::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<SegIter>::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<SegIter>::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
@@ -65,18 +65,19 @@ typename boost::container::iterator_traits<SegIter>::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<SegIter>::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<SegIter>::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
@@ -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 <class FwdIt, class Sent, class T, class Cat>
@@ -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;
}
@@ -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;
}
@@ -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