summaryrefslogtreecommitdiff
path: root/boost/geometry/algorithms/detail/partition.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/algorithms/detail/partition.hpp')
-rw-r--r--boost/geometry/algorithms/detail/partition.hpp499
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
{