Remove BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO

This commit is contained in:
Ion Gaztañaga
2026-07-12 21:28:19 +02:00
parent 792e2a4bde
commit 4cbffe3b44
14 changed files with 6 additions and 131 deletions
@@ -169,14 +169,9 @@ typename algo_enable_if_c<
!Tag::value || is_sentinel<Sent, SrcIter>::value, OutIter>::type
segmented_copy_dispatch(SrcIter first, Sent last, OutIter result, Tag, Cat)
{
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef segmented_iterator_traits<OutIter> dst_traits;
return (segmented_copy_dst_dispatch)
(first, last, result, typename dst_traits::is_segmented_iterator(), Cat());
#else
return (segmented_copy_dst_dispatch)
(first, last, result, non_segmented_iterator_tag(), Cat());
#endif
}
template <class SegIter, class OutIter, class Cat>
@@ -208,14 +208,9 @@ typename algo_enable_if_c<
!Tag::value || is_sentinel<Sent, SrcIter>::value, OutIter>::type
segmented_copy_if_dispatch(SrcIter first, Sent last, OutIter result, Pred pred, Tag, Cat)
{
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef segmented_iterator_traits<OutIter> dst_traits;
return (segmented_copy_if_dst_dispatch)
(first, last, result, pred, typename dst_traits::is_segmented_iterator(), Cat());
#else
return (segmented_copy_if_dst_dispatch)
(first, last, result, pred, non_segmented_iterator_tag(), Cat());
#endif
}
template <class SegIter, class OutIter, class Pred, class Cat>
@@ -185,14 +185,9 @@ OutIter copy_n_scan
const Size range_sz = Size(last - first);
Size min_count = count <= range_sz ? count : range_sz;
count -= min_count;
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef segmented_iterator_traits<OutIter> dst_traits;
return (segmented_copy_n_dst_dispatch)
(first, unreachable_sentinel_t(), min_count, result, typename dst_traits::is_segmented_iterator());
#else
return (segmented_copy_n_src_dst_bounded)
(first, unreachable_sentinel_t(), min_count, result, unreachable_sentinel_t()).second;
#endif
typedef segmented_iterator_traits<OutIter> dst_traits;
return (segmented_copy_n_dst_dispatch)
(first, unreachable_sentinel_t(), min_count, result, typename dst_traits::is_segmented_iterator());
}
template <class InIter, class Size, class OutIter, class Cat>
@@ -200,14 +195,9 @@ BOOST_CONTAINER_FORCEINLINE
OutIter copy_n_scan
(InIter first, InIter last, Size& BOOST_RESTRICT count, OutIter result, non_segmented_iterator_tag, const Cat &)
{
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef segmented_iterator_traits<OutIter> dst_traits;
return (segmented_copy_n_dst_dispatch)
(first, last, count, result, typename dst_traits::is_segmented_iterator());
#else
return (segmented_copy_n_dst_dispatch)
(first, last, count, result, non_segmented_iterator_tag());
#endif
typedef segmented_iterator_traits<OutIter> dst_traits;
return (segmented_copy_n_dst_dispatch)
(first, last, count, result, typename dst_traits::is_segmented_iterator());
}
template <class SegIt, class Size, class OutIter, class Cat>
@@ -276,14 +266,9 @@ template <class InIter, class Size, class OutIter, class Cat>
BOOST_CONTAINER_FORCEINLINE OutIter segmented_copy_n_dispatch
(InIter first, Size count, OutIter result, const non_segmented_iterator_tag &, const Cat&)
{
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef segmented_iterator_traits<OutIter> dst_traits;
return (segmented_copy_n_dst_dispatch)
(first, unreachable_sentinel_t(), count, result, typename dst_traits::is_segmented_iterator());
#else
return (segmented_copy_n_src_dst_bounded)
(first, unreachable_sentinel_t(), count, result, unreachable_sentinel_t()).second;
#endif
}
} // namespace detail_algo
@@ -192,14 +192,9 @@ typename algo_enable_if_c
>::type
segmented_equal_dispatch(SrcIter first1, Sent last1, InpIter2 first2, BinaryPred pred, Tag, Cat)
{
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef segmented_iterator_traits<InpIter2> iter2_traits;
return (segmented_equal_iter2_dispatch)
(first1, last1, first2, pred, typename iter2_traits::is_segmented_iterator(), Cat());
#else
return (segmented_equal_iter2_dispatch)
(first1, last1, first2, pred, non_segmented_iterator_tag(), Cat());
#endif
}
template <class SegIter, class InpIter2, class BinaryPred, class Cat>
@@ -326,20 +326,6 @@ struct deepest_local_iterator
#include <boost/container/detail/config_end.hpp>
//////////////////////////////////////////////////////////////////////////////
// BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO
//
// When defined, segmented algorithms that write to an output iterator will
// NOT exploit segmentation on the output side. Only input (source) iterator
// segmentation is used. This is useful for benchmarking the advantage of
// the segmented output optimisation in isolation.
//
// Define BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO before including any
// segmented algorithm header to disable the optimisation.
//////////////////////////////////////////////////////////////////////////////
//#define BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO
// When defined, segmented algorithms that count elements (e.g. segmented_count,
// segmented_count_if) will use a branchless counting strategy in their
// innermost loops, incrementing the count by the boolean result of the
@@ -228,16 +228,10 @@ BOOST_CONTAINER_FORCEINLINE segtrio<Iter1, Iter2, OutIter> merge_seg2_dispatch
(Iter1 first1, Sent1 last1, Iter2 first2, Sent2 last2, OutIter result, Comp comp,
non_segmented_iterator_tag, const Cat& src1_cat)
{
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef segmented_iterator_traits<OutIter> out_traits;
typedef typename out_traits::is_segmented_iterator is_out_seg_t;
return (merge_until_exhausts)
(first1, last1, first2, last2, result, comp, is_out_seg_t(), src1_cat);
#else
return (merge_dst_bounded)
(first1, last1, first2, last2, result, unreachable_sentinel_t(),
comp, non_segmented_iterator_tag(), src1_cat);
#endif
}
template <class Iter1, class Sent1, class SegIter2, class OutIter, class Comp, class Cat>
@@ -317,18 +311,12 @@ BOOST_CONTAINER_FORCEINLINE segtrio<FwdIt, InIter2, OutIter> merge_scan
non_segmented_iterator_tag)
{
typedef sent_filter<FwdIt, Sent> sf1;
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef sent_filter<InIter2, Sent2> sf2;
return (merge_seg2_dispatch)
(first1, last1, first2, last2, result, comp,
typename sf2::seg_t(),
typename sf1::cat_t());
#else
return (merge_until_exhausts)
(first1, last1, first2, last2, result, comp,
non_segmented_iterator_tag(), typename sf1::cat_t());
#endif
}
template <class SegIt, class InIter2, class Sent2, class OutIter, class Comp>
@@ -218,16 +218,10 @@ typename algo_enable_if_c<
segmented_mismatch_bounded_dispatch
(SrcIter first1, Sent last1, InpIter2 first2, Sent2 last2, BinaryPred pred, Tag, Cat)
{
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef segmented_iterator_traits<InpIter2> iter2_traits;
return (segmented_mismatch_iter2_bounded)
(first1, last1, first2, last2, pred,
typename iter2_traits::is_segmented_iterator(), Cat());
#else
return (segmented_mismatch_iter2_bounded)
(first1, last1, first2, last2, pred,
non_segmented_iterator_tag(), Cat());
#endif
}
template <class SegIter, class InpIter2, class Sent2, class BinaryPred, class Cat>
@@ -198,14 +198,9 @@ typename algo_enable_if_c<
segmented_remove_copy_dispatch
(SrcIter first, Sent last, OutIter result, const T& value, Tag, Cat)
{
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef segmented_iterator_traits<OutIter> dst_traits;
return (segmented_remove_copy_dst_dispatch<Move>)
(first, last, result, value, typename dst_traits::is_segmented_iterator(), Cat());
#else
return (segmented_remove_copy_dst_dispatch<Move>)
(first, last, result, value, non_segmented_iterator_tag(), Cat());
#endif
}
template <bool Move, class SegIter, class OutIter, class T, class Cat>
@@ -214,14 +214,9 @@ typename algo_enable_if_c<
segmented_remove_copy_if_dispatch
(SrcIter first, Sent last, OutIter result, Pred pred, Tag, Cat)
{
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef segmented_iterator_traits<OutIter> dst_traits;
return (segmented_remove_copy_if_dst_dispatch<Move>)
(first, last, result, pred, typename dst_traits::is_segmented_iterator(), Cat());
#else
return (segmented_remove_copy_if_dst_dispatch<Move>)
(first, last, result, pred, non_segmented_iterator_tag(), Cat());
#endif
}
template <bool Move, class SegIter, class OutIter, class Pred, class Cat>
@@ -167,14 +167,9 @@ BOOST_CONTAINER_FORCEINLINE
typename algo_enable_if_c<!Tag::value, OutIter>::type
segmented_reverse_copy_dispatch(BidirIter first, BidirIter last, OutIter result, Tag, Cat)
{
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef segmented_iterator_traits<OutIter> dst_traits;
return (segmented_reverse_copy_dst_dispatch)
(first, last, result, typename dst_traits::is_segmented_iterator(), Cat());
#else
return (segmented_reverse_copy_dst_dispatch)
(first, last, result, non_segmented_iterator_tag(), Cat());
#endif
}
template <class SegIter, class OutIter, class Cat>
@@ -137,16 +137,10 @@ BOOST_CONTAINER_FORCEINLINE segtrio<Iter1, Iter2, OutIter> set_difference_seg2_d
(Iter1 first1, Sent1 last1, Iter2 first2, Sent2 last2, OutIter result, Comp comp,
non_segmented_iterator_tag, const Cat& src1_cat)
{
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef segmented_iterator_traits<OutIter> out_traits;
typedef typename out_traits::is_segmented_iterator is_out_seg_t;
return (set_difference_until_exhausts)
(first1, last1, first2, last2, result, comp, is_out_seg_t(), src1_cat);
#else
return (set_difference_dst_bounded)
(first1, last1, first2, last2, result, unreachable_sentinel_t(),
comp, non_segmented_iterator_tag(), src1_cat);
#endif
}
template <class Iter1, class Sent1, class SegIter2, class OutIter, class Comp, class Cat>
@@ -211,18 +205,12 @@ BOOST_CONTAINER_FORCEINLINE segtrio<FwdIt, InIter2, OutIter> set_difference_scan
non_segmented_iterator_tag)
{
typedef sent_filter<FwdIt, Sent> sf1;
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef sent_filter<InIter2, Sent2> sf2;
return (set_difference_seg2_dispatch)
(first1, last1, first2, last2, result, comp,
typename sf2::seg_t(),
typename sf1::cat_t());
#else
return (set_difference_until_exhausts)
(first1, last1, first2, last2, result, comp,
non_segmented_iterator_tag(), typename sf1::cat_t());
#endif
}
template <class SegIt, class InIter2, class Sent2, class OutIter, class Comp>
@@ -127,16 +127,10 @@ BOOST_CONTAINER_FORCEINLINE segtrio<Iter1, Iter2, OutIter> set_intersection_seg2
(Iter1 first1, Sent1 last1, Iter2 first2, Sent2 last2, OutIter result, Comp comp,
non_segmented_iterator_tag, const Cat& src1_cat)
{
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef segmented_iterator_traits<OutIter> out_traits;
typedef typename out_traits::is_segmented_iterator is_out_seg_t;
return (set_intersection_until_exhausts)
(first1, last1, first2, last2, result, comp, is_out_seg_t(), src1_cat);
#else
return (set_intersection_dst_bounded)
(first1, last1, first2, last2, result, unreachable_sentinel_t(),
comp, non_segmented_iterator_tag(), src1_cat);
#endif
}
template <class Iter1, class Sent1, class SegIter2, class OutIter, class Comp, class Cat>
@@ -201,18 +195,12 @@ BOOST_CONTAINER_FORCEINLINE segtrio<FwdIt, InIter2, OutIter> set_intersection_sc
non_segmented_iterator_tag)
{
typedef sent_filter<FwdIt, Sent> sf1;
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef sent_filter<InIter2, Sent2> sf2;
return (set_intersection_seg2_dispatch)
(first1, last1, first2, last2, result, comp,
typename sf2::seg_t(),
typename sf1::cat_t());
#else
return (set_intersection_until_exhausts)
(first1, last1, first2, last2, result, comp,
non_segmented_iterator_tag(), typename sf1::cat_t());
#endif
}
template <class SegIt, class InIter2, class Sent2, class OutIter, class Comp>
@@ -142,16 +142,10 @@ BOOST_CONTAINER_FORCEINLINE segtrio<Iter1, Iter2, OutIter> set_symmetric_differe
(Iter1 first1, Sent1 last1, Iter2 first2, Sent2 last2, OutIter result, Comp comp,
non_segmented_iterator_tag, const Cat& src1_cat)
{
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef segmented_iterator_traits<OutIter> out_traits;
typedef typename out_traits::is_segmented_iterator is_out_seg_t;
return (set_symmetric_difference_until_exhausts)
(first1, last1, first2, last2, result, comp, is_out_seg_t(), src1_cat);
#else
return (set_symmetric_difference_dst_bounded)
(first1, last1, first2, last2, result, unreachable_sentinel_t(),
comp, non_segmented_iterator_tag(), src1_cat);
#endif
}
template <class Iter1, class Sent1, class SegIter2, class OutIter, class Comp, class Cat>
@@ -216,18 +210,12 @@ BOOST_CONTAINER_FORCEINLINE segtrio<FwdIt, InIter2, OutIter> set_symmetric_diffe
non_segmented_iterator_tag)
{
typedef sent_filter<FwdIt, Sent> sf1;
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef sent_filter<InIter2, Sent2> sf2;
return (set_symmetric_difference_seg2_dispatch)
(first1, last1, first2, last2, result, comp,
typename sf2::seg_t(),
typename sf1::cat_t());
#else
return (set_symmetric_difference_until_exhausts)
(first1, last1, first2, last2, result, comp,
non_segmented_iterator_tag(), typename sf1::cat_t());
#endif
}
template <class SegIt, class InIter2, class Sent2, class OutIter, class Comp>
@@ -130,16 +130,10 @@ BOOST_CONTAINER_FORCEINLINE segtrio<Iter1, Iter2, OutIter> set_union_seg2_dispat
(Iter1 first1, Sent1 last1, Iter2 first2, Sent2 last2, OutIter result, Comp comp,
non_segmented_iterator_tag, const Cat& src1_cat)
{
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef segmented_iterator_traits<OutIter> out_traits;
typedef typename out_traits::is_segmented_iterator is_out_seg_t;
return (set_union_until_exhausts)
(first1, last1, first2, last2, result, comp, is_out_seg_t(), src1_cat);
#else
return (set_union_dst_bounded)
(first1, last1, first2, last2, result, unreachable_sentinel_t(),
comp, non_segmented_iterator_tag(), src1_cat);
#endif
}
template <class Iter1, class Sent1, class SegIter2, class OutIter, class Comp, class Cat>
@@ -204,18 +198,12 @@ BOOST_CONTAINER_FORCEINLINE segtrio<FwdIt, InIter2, OutIter> set_union_scan
non_segmented_iterator_tag)
{
typedef sent_filter<FwdIt, Sent> sf1;
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
typedef sent_filter<InIter2, Sent2> sf2;
return (set_union_seg2_dispatch)
(first1, last1, first2, last2, result, comp,
typename sf2::seg_t(),
typename sf1::cat_t());
#else
return (set_union_until_exhausts)
(first1, last1, first2, last2, result, comp,
non_segmented_iterator_tag(), typename sf1::cat_t());
#endif
}
template <class SegIt, class InIter2, class Sent2, class OutIter, class Comp>