mirror of
https://github.com/boostorg/container.git
synced 2026-08-04 01:04:15 +02:00
Remove BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user