mirror of
https://github.com/boostorg/container.git
synced 2026-08-04 03:34:11 +02:00
Merge single-segment case with the final segment case to reduce code size.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user