diff options
Diffstat (limited to 'boost/geometry/algorithms/detail/partition.hpp')
-rw-r--r-- | boost/geometry/algorithms/detail/partition.hpp | 499 |
1 files changed, 327 insertions, 172 deletions
diff --git a/boost/geometry/algorithms/detail/partition.hpp b/boost/geometry/algorithms/detail/partition.hpp index 8b19add479..12c6a54661 100644 --- a/boost/geometry/algorithms/detail/partition.hpp +++ b/boost/geometry/algorithms/detail/partition.hpp @@ -2,10 +2,11 @@ // Copyright (c) 2011-2015 Barend Gehrels, Amsterdam, the Netherlands. -// This file was modified by Oracle on 2015. -// Modifications copyright (c) 2015 Oracle and/or its affiliates. +// This file was modified by Oracle on 2015, 2017. +// Modifications copyright (c) 2015-2017 Oracle and/or its affiliates. // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle +// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at @@ -47,13 +48,14 @@ inline void divide_box(Box const& box, Box& lower_box, Box& upper_box) // Divide forward_range into three subsets: lower, upper and oversized // (not-fitting) // (lower == left or bottom, upper == right or top) -template <typename OverlapsPolicy, typename Box, typename IteratorVector> +template <typename Box, typename IteratorVector, typename OverlapsPolicy> inline void divide_into_subsets(Box const& lower_box, - Box const& upper_box, - IteratorVector const& input, - IteratorVector& lower, - IteratorVector& upper, - IteratorVector& exceeding) + Box const& upper_box, + IteratorVector const& input, + IteratorVector& lower, + IteratorVector& upper, + IteratorVector& exceeding, + OverlapsPolicy const& overlaps_policy) { typedef typename boost::range_iterator < @@ -62,8 +64,8 @@ inline void divide_into_subsets(Box const& lower_box, for(it_type it = boost::begin(input); it != boost::end(input); ++it) { - bool const lower_overlapping = OverlapsPolicy::apply(lower_box, **it); - bool const upper_overlapping = OverlapsPolicy::apply(upper_box, **it); + bool const lower_overlapping = overlaps_policy.apply(lower_box, **it); + bool const upper_overlapping = overlaps_policy.apply(upper_box, **it); if (lower_overlapping && upper_overlapping) { @@ -87,23 +89,24 @@ inline void divide_into_subsets(Box const& lower_box, template < - typename ExpandPolicy, typename Box, - typename IteratorVector + typename IteratorVector, + typename ExpandPolicy > -inline void expand_with_elements(Box& total, IteratorVector const& input) +inline void expand_with_elements(Box& total, IteratorVector const& input, + ExpandPolicy const& expand_policy) { typedef typename boost::range_iterator<IteratorVector const>::type it_type; for(it_type it = boost::begin(input); it != boost::end(input); ++it) { - ExpandPolicy::apply(total, **it); + expand_policy.apply(total, **it); } } // Match forward_range with itself -template <typename Policy, typename IteratorVector> -inline void handle_one(IteratorVector const& input, Policy& policy) +template <typename IteratorVector, typename VisitPolicy> +inline void handle_one(IteratorVector const& input, VisitPolicy& visitor) { if (boost::size(input) == 0) { @@ -118,7 +121,7 @@ inline void handle_one(IteratorVector const& input, Policy& policy) it_type it2 = it1; for (++it2; it2 != boost::end(input); ++it2) { - policy.apply(**it1, **it2); + visitor.apply(**it1, **it2); } } } @@ -126,13 +129,13 @@ inline void handle_one(IteratorVector const& input, Policy& policy) // Match forward range 1 with forward range 2 template < - typename Policy, typename IteratorVector1, - typename IteratorVector2 + typename IteratorVector2, + typename VisitPolicy > inline void handle_two(IteratorVector1 const& input1, - IteratorVector2 const& input2, - Policy& policy) + IteratorVector2 const& input2, + VisitPolicy& visitor) { typedef typename boost::range_iterator < @@ -157,14 +160,14 @@ inline void handle_two(IteratorVector1 const& input1, it2 != boost::end(input2); ++it2) { - policy.apply(**it1, **it2); + visitor.apply(**it1, **it2); } } } template <typename IteratorVector> inline bool recurse_ok(IteratorVector const& input, - std::size_t min_elements, std::size_t level) + std::size_t min_elements, std::size_t level) { return boost::size(input) >= min_elements && level < 100; @@ -172,8 +175,8 @@ inline bool recurse_ok(IteratorVector const& input, template <typename IteratorVector1, typename IteratorVector2> inline bool recurse_ok(IteratorVector1 const& input1, - IteratorVector2 const& input2, - std::size_t min_elements, std::size_t level) + IteratorVector2 const& input2, + std::size_t min_elements, std::size_t level) { return boost::size(input1) >= min_elements && recurse_ok(input2, min_elements, level); @@ -186,103 +189,114 @@ template typename IteratorVector3 > inline bool recurse_ok(IteratorVector1 const& input1, - IteratorVector2 const& input2, - IteratorVector3 const& input3, - std::size_t min_elements, std::size_t level) + IteratorVector2 const& input2, + IteratorVector3 const& input3, + std::size_t min_elements, std::size_t level) { return boost::size(input1) >= min_elements && recurse_ok(input2, input3, min_elements, level); } -template -< - int Dimension, - typename Box, - typename OverlapsPolicy1, - typename OverlapsPolicy2, - typename ExpandPolicy1, - typename ExpandPolicy2, - typename VisitBoxPolicy -> + +template <int Dimension, typename Box> class partition_two_ranges; -template -< - int Dimension, - typename Box, - typename OverlapsPolicy, - typename ExpandPolicy, - typename VisitBoxPolicy -> +template <int Dimension, typename Box> class partition_one_range { - template <typename IteratorVector> - static inline Box get_new_box(IteratorVector const& input) + template <typename IteratorVector, typename ExpandPolicy> + static inline Box get_new_box(IteratorVector const& input, + ExpandPolicy const& expand_policy) { Box box; geometry::assign_inverse(box); - expand_with_elements<ExpandPolicy>(box, input); + expand_with_elements(box, input, expand_policy); return box; } - template <typename Policy, typename IteratorVector> + template + < + typename IteratorVector, + typename VisitPolicy, + typename ExpandPolicy, + typename OverlapsPolicy, + typename VisitBoxPolicy + > static inline void next_level(Box const& box, - IteratorVector const& input, - std::size_t level, std::size_t min_elements, - Policy& policy, VisitBoxPolicy& box_policy) + IteratorVector const& input, + std::size_t level, std::size_t min_elements, + VisitPolicy& visitor, + ExpandPolicy const& expand_policy, + OverlapsPolicy const& overlaps_policy, + VisitBoxPolicy& box_policy) { if (recurse_ok(input, min_elements, level)) { partition_one_range - < - 1 - Dimension, - Box, - OverlapsPolicy, - ExpandPolicy, - VisitBoxPolicy - >::apply(box, input, level + 1, min_elements, policy, box_policy); + < + 1 - Dimension, + Box + >::apply(box, input, level + 1, min_elements, + visitor, expand_policy, overlaps_policy, box_policy); } else { - handle_one(input, policy); + handle_one(input, visitor); } } // Function to switch to two forward ranges if there are // geometries exceeding the separation line - template <typename Policy, typename IteratorVector> + template + < + typename IteratorVector, + typename VisitPolicy, + typename ExpandPolicy, + typename OverlapsPolicy, + typename VisitBoxPolicy + > static inline void next_level2(Box const& box, IteratorVector const& input1, IteratorVector const& input2, std::size_t level, std::size_t min_elements, - Policy& policy, VisitBoxPolicy& box_policy) + VisitPolicy& visitor, + ExpandPolicy const& expand_policy, + OverlapsPolicy const& overlaps_policy, + VisitBoxPolicy& box_policy) { if (recurse_ok(input1, input2, min_elements, level)) { partition_two_ranges - < - 1 - Dimension, - Box, - OverlapsPolicy, OverlapsPolicy, - ExpandPolicy, ExpandPolicy, - VisitBoxPolicy - >::apply(box, input1, input2, level + 1, min_elements, - policy, box_policy); + < + 1 - Dimension, Box + >::apply(box, input1, input2, level + 1, min_elements, + visitor, expand_policy, overlaps_policy, + expand_policy, overlaps_policy, box_policy); } else { - handle_two(input1, input2, policy); + handle_two(input1, input2, visitor); } } public : - template <typename Policy, typename IteratorVector> + template + < + typename IteratorVector, + typename VisitPolicy, + typename ExpandPolicy, + typename OverlapsPolicy, + typename VisitBoxPolicy + > static inline void apply(Box const& box, - IteratorVector const& input, - std::size_t level, - std::size_t min_elements, - Policy& policy, VisitBoxPolicy& box_policy) + IteratorVector const& input, + std::size_t level, + std::size_t min_elements, + VisitPolicy& visitor, + ExpandPolicy const& expand_policy, + OverlapsPolicy const& overlaps_policy, + VisitBoxPolicy& box_policy) { box_policy.apply(box, level); @@ -290,101 +304,121 @@ public : divide_box<Dimension>(box, lower_box, upper_box); IteratorVector lower, upper, exceeding; - divide_into_subsets<OverlapsPolicy>(lower_box, upper_box, - input, lower, upper, exceeding); + divide_into_subsets(lower_box, upper_box, + input, lower, upper, exceeding, + overlaps_policy); if (boost::size(exceeding) > 0) { // Get the box of exceeding-only - Box exceeding_box = get_new_box(exceeding); + Box exceeding_box = get_new_box(exceeding, expand_policy); // Recursively do exceeding elements only, in next dimension they // will probably be less exceeding within the new box next_level(exceeding_box, exceeding, level, min_elements, - policy, box_policy); + visitor, expand_policy, overlaps_policy, box_policy); // Switch to two forward ranges, combine exceeding with // lower resp upper, but not lower/lower, upper/upper next_level2(exceeding_box, exceeding, lower, level, min_elements, - policy, box_policy); + visitor, expand_policy, overlaps_policy, box_policy); next_level2(exceeding_box, exceeding, upper, level, min_elements, - policy, box_policy); + visitor, expand_policy, overlaps_policy, box_policy); } // Recursively call operation both parts - next_level(lower_box, lower, level, min_elements, policy, box_policy); - next_level(upper_box, upper, level, min_elements, policy, box_policy); + next_level(lower_box, lower, level, min_elements, + visitor, expand_policy, overlaps_policy, box_policy); + next_level(upper_box, upper, level, min_elements, + visitor, expand_policy, overlaps_policy, box_policy); } }; template < int Dimension, - typename Box, - typename OverlapsPolicy1, - typename OverlapsPolicy2, - typename ExpandPolicy1, - typename ExpandPolicy2, - typename VisitBoxPolicy + typename Box > class partition_two_ranges { template < - typename Policy, typename IteratorVector1, - typename IteratorVector2 + typename IteratorVector2, + typename VisitPolicy, + typename ExpandPolicy1, + typename OverlapsPolicy1, + typename ExpandPolicy2, + typename OverlapsPolicy2, + typename VisitBoxPolicy > static inline void next_level(Box const& box, IteratorVector1 const& input1, IteratorVector2 const& input2, std::size_t level, std::size_t min_elements, - Policy& policy, VisitBoxPolicy& box_policy) + VisitPolicy& visitor, + ExpandPolicy1 const& expand_policy1, + OverlapsPolicy1 const& overlaps_policy1, + ExpandPolicy2 const& expand_policy2, + OverlapsPolicy2 const& overlaps_policy2, + VisitBoxPolicy& box_policy) { partition_two_ranges < - 1 - Dimension, - Box, - OverlapsPolicy1, - OverlapsPolicy2, - ExpandPolicy1, - ExpandPolicy2, - VisitBoxPolicy + 1 - Dimension, Box >::apply(box, input1, input2, level + 1, min_elements, - policy, box_policy); + visitor, expand_policy1, overlaps_policy1, + expand_policy2, overlaps_policy2, box_policy); } - template <typename ExpandPolicy, typename IteratorVector> - static inline Box get_new_box(IteratorVector const& input) + template <typename IteratorVector, typename ExpandPolicy> + static inline Box get_new_box(IteratorVector const& input, + ExpandPolicy const& expand_policy) { Box box; geometry::assign_inverse(box); - expand_with_elements<ExpandPolicy>(box, input); + expand_with_elements(box, input, expand_policy); return box; } - template <typename IteratorVector1, typename IteratorVector2> + template + < + typename IteratorVector1, typename IteratorVector2, + typename ExpandPolicy1, typename ExpandPolicy2 + > static inline Box get_new_box(IteratorVector1 const& input1, - IteratorVector2 const& input2) + IteratorVector2 const& input2, + ExpandPolicy1 const& expand_policy1, + ExpandPolicy2 const& expand_policy2) { - Box box = get_new_box<ExpandPolicy1>(input1); - expand_with_elements<ExpandPolicy2>(box, input2); + Box box = get_new_box(input1, expand_policy1); + expand_with_elements(box, input2, expand_policy2); return box; } public : template < - typename Policy, typename IteratorVector1, - typename IteratorVector2 + typename IteratorVector2, + typename VisitPolicy, + typename ExpandPolicy1, + typename OverlapsPolicy1, + typename ExpandPolicy2, + typename OverlapsPolicy2, + typename VisitBoxPolicy > static inline void apply(Box const& box, IteratorVector1 const& input1, IteratorVector2 const& input2, std::size_t level, std::size_t min_elements, - Policy& policy, VisitBoxPolicy& box_policy) + VisitPolicy& visitor, + ExpandPolicy1 const& expand_policy1, + OverlapsPolicy1 const& overlaps_policy1, + ExpandPolicy2 const& expand_policy2, + OverlapsPolicy2 const& overlaps_policy2, + VisitBoxPolicy& box_policy) { box_policy.apply(box, level); @@ -393,10 +427,12 @@ public : IteratorVector1 lower1, upper1, exceeding1; IteratorVector2 lower2, upper2, exceeding2; - divide_into_subsets<OverlapsPolicy1>(lower_box, upper_box, - input1, lower1, upper1, exceeding1); - divide_into_subsets<OverlapsPolicy2>(lower_box, upper_box, - input2, lower2, upper2, exceeding2); + divide_into_subsets(lower_box, upper_box, + input1, lower1, upper1, exceeding1, + overlaps_policy1); + divide_into_subsets(lower_box, upper_box, + input2, lower2, upper2, exceeding2, + overlaps_policy2); if (boost::size(exceeding1) > 0) { @@ -404,13 +440,15 @@ public : if (recurse_ok(exceeding1, exceeding2, min_elements, level)) { - Box exceeding_box = get_new_box(exceeding1, exceeding2); + Box exceeding_box = get_new_box(exceeding1, exceeding2, + expand_policy1, expand_policy2); next_level(exceeding_box, exceeding1, exceeding2, level, - min_elements, policy, box_policy); + min_elements, visitor, expand_policy1, overlaps_policy1, + expand_policy2, overlaps_policy2, box_policy); } else { - handle_two(exceeding1, exceeding2, policy); + handle_two(exceeding1, exceeding2, visitor); } // All exceeding from 1 with lower and upper of 2: @@ -419,16 +457,18 @@ public : // the same combinations again and again) if (recurse_ok(lower2, upper2, exceeding1, min_elements, level)) { - Box exceeding_box = get_new_box<ExpandPolicy1>(exceeding1); + Box exceeding_box = get_new_box(exceeding1, expand_policy1); next_level(exceeding_box, exceeding1, lower2, level, - min_elements, policy, box_policy); + min_elements, visitor, expand_policy1, overlaps_policy1, + expand_policy2, overlaps_policy2, box_policy); next_level(exceeding_box, exceeding1, upper2, level, - min_elements, policy, box_policy); + min_elements, visitor, expand_policy1, overlaps_policy1, + expand_policy2, overlaps_policy2, box_policy); } else { - handle_two(exceeding1, lower2, policy); - handle_two(exceeding1, upper2, policy); + handle_two(exceeding1, lower2, visitor); + handle_two(exceeding1, upper2, visitor); } } @@ -437,36 +477,40 @@ public : // All exceeding from 2 with lower and upper of 1: if (recurse_ok(lower1, upper1, exceeding2, min_elements, level)) { - Box exceeding_box = get_new_box<ExpandPolicy2>(exceeding2); + Box exceeding_box = get_new_box(exceeding2, expand_policy2); next_level(exceeding_box, lower1, exceeding2, level, - min_elements, policy, box_policy); + min_elements, visitor, expand_policy1, overlaps_policy1, + expand_policy2, overlaps_policy2, box_policy); next_level(exceeding_box, upper1, exceeding2, level, - min_elements, policy, box_policy); + min_elements, visitor, expand_policy1, overlaps_policy1, + expand_policy2, overlaps_policy2, box_policy); } else { - handle_two(lower1, exceeding2, policy); - handle_two(upper1, exceeding2, policy); + handle_two(lower1, exceeding2, visitor); + handle_two(upper1, exceeding2, visitor); } } if (recurse_ok(lower1, lower2, min_elements, level)) { next_level(lower_box, lower1, lower2, level, - min_elements, policy, box_policy); + min_elements, visitor, expand_policy1, overlaps_policy1, + expand_policy2, overlaps_policy2, box_policy); } else { - handle_two(lower1, lower2, policy); + handle_two(lower1, lower2, visitor); } if (recurse_ok(upper1, upper2, min_elements, level)) { next_level(upper_box, upper1, upper2, level, - min_elements, policy, box_policy); + min_elements, visitor, expand_policy1, overlaps_policy1, + expand_policy2, overlaps_policy2, box_policy); } else { - handle_two(upper1, upper2, policy); + handle_two(upper1, upper2, visitor); } } }; @@ -493,46 +537,86 @@ struct include_all_policy template < typename Box, - typename ExpandPolicy1, - typename OverlapsPolicy1, - typename ExpandPolicy2 = ExpandPolicy1, - typename OverlapsPolicy2 = OverlapsPolicy1, typename IncludePolicy1 = detail::partition::include_all_policy, - typename IncludePolicy2 = detail::partition::include_all_policy, - typename VisitBoxPolicy = detail::partition::visit_no_policy + typename IncludePolicy2 = detail::partition::include_all_policy > class partition { + static const std::size_t default_min_elements = 16; + template < - typename ExpandPolicy, typename IncludePolicy, typename ForwardRange, - typename IteratorVector + typename IteratorVector, + typename ExpandPolicy > static inline void expand_to_range(ForwardRange const& forward_range, - Box& total, IteratorVector& iterator_vector) + Box& total, + IteratorVector& iterator_vector, + ExpandPolicy const& expand_policy) { - for(typename boost::range_iterator<ForwardRange const>::type it - = boost::begin(forward_range); + for(typename boost::range_iterator<ForwardRange const>::type + it = boost::begin(forward_range); it != boost::end(forward_range); ++it) { if (IncludePolicy::apply(*it)) { - ExpandPolicy::apply(total, *it); + expand_policy.apply(total, *it); iterator_vector.push_back(it); } } } -public : - template <typename ForwardRange, typename VisitPolicy> +public: + template + < + typename ForwardRange, + typename VisitPolicy, + typename ExpandPolicy, + typename OverlapsPolicy + > static inline void apply(ForwardRange const& forward_range, - VisitPolicy& visitor, - std::size_t min_elements = 16, - VisitBoxPolicy box_visitor = detail::partition::visit_no_policy() - ) + VisitPolicy& visitor, + ExpandPolicy const& expand_policy, + OverlapsPolicy const& overlaps_policy) + { + apply(forward_range, visitor, expand_policy, overlaps_policy, + default_min_elements, detail::partition::visit_no_policy()); + } + + template + < + typename ForwardRange, + typename VisitPolicy, + typename ExpandPolicy, + typename OverlapsPolicy + > + static inline void apply(ForwardRange const& forward_range, + VisitPolicy& visitor, + ExpandPolicy const& expand_policy, + OverlapsPolicy const& overlaps_policy, + std::size_t min_elements) + { + apply(forward_range, visitor, expand_policy, overlaps_policy, + min_elements, detail::partition::visit_no_policy()); + } + + template + < + typename ForwardRange, + typename VisitPolicy, + typename ExpandPolicy, + typename OverlapsPolicy, + typename VisitBoxPolicy + > + static inline void apply(ForwardRange const& forward_range, + VisitPolicy& visitor, + ExpandPolicy const& expand_policy, + OverlapsPolicy const& overlaps_policy, + std::size_t min_elements, + VisitBoxPolicy box_visitor) { typedef typename boost::range_iterator < @@ -544,17 +628,14 @@ public : std::vector<iterator_type> iterator_vector; Box total; assign_inverse(total); - expand_to_range<ExpandPolicy1, IncludePolicy1>(forward_range, - total, iterator_vector); + expand_to_range<IncludePolicy1>(forward_range, total, + iterator_vector, expand_policy); detail::partition::partition_one_range < - 0, Box, - OverlapsPolicy1, - ExpandPolicy1, - VisitBoxPolicy + 0, Box >::apply(total, iterator_vector, 0, min_elements, - visitor, box_visitor); + visitor, expand_policy, overlaps_policy, box_visitor); } else { @@ -575,15 +656,88 @@ public : < typename ForwardRange1, typename ForwardRange2, - typename VisitPolicy + typename VisitPolicy, + typename ExpandPolicy1, + typename OverlapsPolicy1 + > + static inline void apply(ForwardRange1 const& forward_range1, + ForwardRange2 const& forward_range2, + VisitPolicy& visitor, + ExpandPolicy1 const& expand_policy1, + OverlapsPolicy1 const& overlaps_policy1) + { + apply(forward_range1, forward_range2, visitor, + expand_policy1, overlaps_policy1, expand_policy1, overlaps_policy1, + default_min_elements, detail::partition::visit_no_policy()); + } + + template + < + typename ForwardRange1, + typename ForwardRange2, + typename VisitPolicy, + typename ExpandPolicy1, + typename OverlapsPolicy1, + typename ExpandPolicy2, + typename OverlapsPolicy2 + > + static inline void apply(ForwardRange1 const& forward_range1, + ForwardRange2 const& forward_range2, + VisitPolicy& visitor, + ExpandPolicy1 const& expand_policy1, + OverlapsPolicy1 const& overlaps_policy1, + ExpandPolicy2 const& expand_policy2, + OverlapsPolicy2 const& overlaps_policy2) + { + apply(forward_range1, forward_range2, visitor, + expand_policy1, overlaps_policy1, expand_policy2, overlaps_policy2, + default_min_elements, detail::partition::visit_no_policy()); + } + + template + < + typename ForwardRange1, + typename ForwardRange2, + typename VisitPolicy, + typename ExpandPolicy1, + typename OverlapsPolicy1, + typename ExpandPolicy2, + typename OverlapsPolicy2 + > + static inline void apply(ForwardRange1 const& forward_range1, + ForwardRange2 const& forward_range2, + VisitPolicy& visitor, + ExpandPolicy1 const& expand_policy1, + OverlapsPolicy1 const& overlaps_policy1, + ExpandPolicy2 const& expand_policy2, + OverlapsPolicy2 const& overlaps_policy2, + std::size_t min_elements) + { + apply(forward_range1, forward_range2, visitor, + expand_policy1, overlaps_policy1, expand_policy2, overlaps_policy1, + min_elements, detail::partition::visit_no_policy()); + } + + template + < + typename ForwardRange1, + typename ForwardRange2, + typename VisitPolicy, + typename ExpandPolicy1, + typename OverlapsPolicy1, + typename ExpandPolicy2, + typename OverlapsPolicy2, + typename VisitBoxPolicy > static inline void apply(ForwardRange1 const& forward_range1, - ForwardRange2 const& forward_range2, - VisitPolicy& visitor, - std::size_t min_elements = 16, - VisitBoxPolicy box_visitor - = detail::partition::visit_no_policy() - ) + ForwardRange2 const& forward_range2, + VisitPolicy& visitor, + ExpandPolicy1 const& expand_policy1, + OverlapsPolicy1 const& overlaps_policy1, + ExpandPolicy2 const& expand_policy2, + OverlapsPolicy2 const& overlaps_policy2, + std::size_t min_elements, + VisitBoxPolicy box_visitor) { typedef typename boost::range_iterator < @@ -602,17 +756,18 @@ public : std::vector<iterator_type2> iterator_vector2; Box total; assign_inverse(total); - expand_to_range<ExpandPolicy1, IncludePolicy1>(forward_range1, - total, iterator_vector1); - expand_to_range<ExpandPolicy2, IncludePolicy2>(forward_range2, - total, iterator_vector2); + expand_to_range<IncludePolicy1>(forward_range1, total, + iterator_vector1, expand_policy1); + expand_to_range<IncludePolicy2>(forward_range2, total, + iterator_vector2, expand_policy2); detail::partition::partition_two_ranges < - 0, Box, OverlapsPolicy1, OverlapsPolicy2, - ExpandPolicy1, ExpandPolicy2, VisitBoxPolicy + 0, Box >::apply(total, iterator_vector1, iterator_vector2, - 0, min_elements, visitor, box_visitor); + 0, min_elements, visitor, expand_policy1, + overlaps_policy1, expand_policy2, overlaps_policy2, + box_visitor); } else { |