summaryrefslogtreecommitdiff
path: root/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/algorithms/detail/overlay/get_turn_info.hpp')
-rw-r--r--boost/geometry/algorithms/detail/overlay/get_turn_info.hpp111
1 files changed, 59 insertions, 52 deletions
diff --git a/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp b/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp
index 240b6de036..b3b1a06f68 100644
--- a/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp
+++ b/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp
@@ -2,6 +2,11 @@
// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// This file was modified by Oracle on 2015.
+// Modifications copyright (c) 2015 Oracle and/or its affiliates.
+
+// 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
// http://www.boost.org/LICENSE_1_0.txt)
@@ -11,6 +16,8 @@
#include <boost/assert.hpp>
+#include <boost/core/ignore_unused.hpp>
+
#include <boost/geometry/core/access.hpp>
#include <boost/geometry/strategies/intersection.hpp>
@@ -104,17 +111,19 @@ struct base_turn_handler
template <typename TurnInfo, typename IntersectionInfo>
static inline void assign_point(TurnInfo& ti,
method_type method,
- IntersectionInfo const& info, int index)
+ IntersectionInfo const& info, unsigned int index)
{
ti.method = method;
- BOOST_ASSERT(index >= 0 && unsigned(index) < info.count); // TODO remove this
+
+ BOOST_ASSERT(index < info.count);
+
geometry::convert(info.intersections[index], ti.point);
ti.operations[0].fraction = info.fractions[index].robust_ra;
ti.operations[1].fraction = info.fractions[index].robust_rb;
}
template <typename IntersectionInfo>
- static inline int non_opposite_to_index(IntersectionInfo const& info)
+ static inline unsigned int non_opposite_to_index(IntersectionInfo const& info)
{
return info.fractions[0].robust_rb < info.fractions[1].robust_rb
? 1 : 0;
@@ -132,7 +141,7 @@ struct touch_interior : public base_turn_handler
// Index: 0, P is the interior, Q is touching and vice versa
template
<
- int Index,
+ unsigned int Index,
typename Point1,
typename Point2,
typename IntersectionInfo,
@@ -155,8 +164,9 @@ struct touch_interior : public base_turn_handler
// 2) Important is: if q_k goes to LEFT, RIGHT, COLLINEAR
// and, if LEFT/COLL, if it is lying LEFT or RIGHT w.r.t. q_i
- static int const index_p = Index;
- static int const index_q = 1 - Index;
+ BOOST_STATIC_ASSERT(Index <= 1);
+ static unsigned int const index_p = Index;
+ static unsigned int const index_q = 1 - Index;
int const side_qi_p = dir_info.sides.template get<index_q, 0>();
int const side_qk_p = side.qk_wrt_p1();
@@ -166,7 +176,7 @@ struct touch_interior : public base_turn_handler
// Q crosses P from left->right or from right->left (test "ML1")
// Union: folow P (left->right) or Q (right->left)
// Intersection: other turn
- int index = side_qk_p == -1 ? index_p : index_q;
+ unsigned int index = side_qk_p == -1 ? index_p : index_q;
ti.operations[index].operation = operation_union;
ti.operations[1 - index].operation = operation_intersection;
return;
@@ -193,7 +203,7 @@ struct touch_interior : public base_turn_handler
// or Q turns right on the right side of P (test "MR2")
// Union: take left turn (Q if Q turns left, P if Q turns right)
// Intersection: other turn
- int index = side_qk_q == 1 ? index_q : index_p;
+ unsigned int index = side_qk_q == 1 ? index_q : index_p;
ti.operations[index].operation = operation_union;
ti.operations[1 - index].operation = operation_intersection;
}
@@ -215,10 +225,10 @@ struct touch_interior : public base_turn_handler
// Opposite direction, which is never travelled.
// If Q turns left, P continues for intersection
// If Q turns right, P continues for union
- ti.operations[Index].operation = side_qk_q == 1
+ ti.operations[index_p].operation = side_qk_q == 1
? operation_intersection
: operation_union;
- ti.operations[1 - Index].operation = operation_blocked;
+ ti.operations[index_q].operation = operation_blocked;
}
}
else
@@ -503,27 +513,25 @@ struct equal_opposite : public base_turn_handler
typename Point1,
typename Point2,
typename OutputIterator,
- typename IntersectionInfo,
- typename DirInfo
+ typename IntersectionInfo
>
static inline void apply(Point1 const& pi, Point2 const& qi,
/* by value: */ TurnInfo tp,
OutputIterator& out,
- IntersectionInfo const& intersection_info,
- DirInfo const& dir_info)
+ IntersectionInfo const& intersection_info)
{
// For equal-opposite segments, normally don't do anything.
if (AssignPolicy::include_opposite)
{
tp.method = method_equal;
- for (int i = 0; i < 2; i++)
+ for (unsigned int i = 0; i < 2; i++)
{
tp.operations[i].operation = operation_opposite;
}
- for (unsigned int i = 0; i < intersection_info.count; i++)
+ for (unsigned int i = 0; i < intersection_info.i_info().count; i++)
{
- assign_point(tp, method_none, intersection_info, i);
- AssignPolicy::apply(tp, pi, qi, intersection_info, dir_info);
+ assign_point(tp, method_none, intersection_info.i_info(), i);
+ AssignPolicy::apply(tp, pi, qi, intersection_info);
*out++ = tp;
}
}
@@ -653,7 +661,7 @@ private :
template
<
- int Index,
+ unsigned int Index,
typename Point1,
typename Point2,
typename IntersectionInfo
@@ -663,8 +671,9 @@ private :
Point2 const& , Point2 const& , int side_rk_s,
TurnInfo& tp, IntersectionInfo const& intersection_info)
{
- boost::ignore_unused_variable_warning(handle_robustness);
- boost::ignore_unused_variable_warning(side_rk_s);
+ BOOST_STATIC_ASSERT(Index <= 1);
+
+ boost::ignore_unused(handle_robustness, side_rk_s);
operation_type blocked = operation_blocked;
switch(side_rk_r)
@@ -715,7 +724,6 @@ public:
typename Point2,
typename OutputIterator,
typename IntersectionInfo,
- typename DirInfo,
typename SidePolicy
>
static inline void apply(
@@ -727,10 +735,9 @@ public:
OutputIterator& out,
IntersectionInfo const& intersection_info,
- DirInfo const& dir_info,
SidePolicy const& side)
{
- apply(pi, pj, pk, qi, qj, qk, tp_model, out, intersection_info, dir_info, side, empty_transformer);
+ apply(pi, pj, pk, qi, qj, qk, tp_model, out, intersection_info, side, empty_transformer);
}
public:
@@ -740,7 +747,6 @@ public:
typename Point2,
typename OutputIterator,
typename IntersectionInfo,
- typename DirInfo,
typename SidePolicy,
typename TurnTransformer
>
@@ -752,50 +758,52 @@ public:
TurnInfo const& tp_model,
OutputIterator& out,
- IntersectionInfo const& intersection_info,
- DirInfo const& dir_info,
+ IntersectionInfo const& info,
SidePolicy const& side,
TurnTransformer turn_transformer,
bool const is_pk_valid = true, bool const is_qk_valid = true)
{
TurnInfo tp = tp_model;
+ int const p_arrival = info.d_info().arrival[0];
+ int const q_arrival = info.d_info().arrival[1];
+
// If P arrives within Q, there is a turn dependent on P
- if ( dir_info.arrival[0] == 1
+ if ( p_arrival == 1
&& is_pk_valid
- && set_tp<0>(pi, pj, pk, side.pk_wrt_p1(), true, qi, qj, side.pk_wrt_q1(), tp, intersection_info) )
+ && set_tp<0>(pi, pj, pk, side.pk_wrt_p1(), true, qi, qj, side.pk_wrt_q1(), tp, info.i_info()) )
{
turn_transformer(tp);
- AssignPolicy::apply(tp, pi, qi, intersection_info, dir_info);
+ AssignPolicy::apply(tp, pi, qi, info);
*out++ = tp;
}
// If Q arrives within P, there is a turn dependent on Q
- if ( dir_info.arrival[1] == 1
+ if ( q_arrival == 1
&& is_qk_valid
- && set_tp<1>(qi, qj, qk, side.qk_wrt_q1(), false, pi, pj, side.qk_wrt_p1(), tp, intersection_info) )
+ && set_tp<1>(qi, qj, qk, side.qk_wrt_q1(), false, pi, pj, side.qk_wrt_p1(), tp, info.i_info()) )
{
turn_transformer(tp);
- AssignPolicy::apply(tp, pi, qi, intersection_info, dir_info);
+ AssignPolicy::apply(tp, pi, qi, info);
*out++ = tp;
}
if (AssignPolicy::include_opposite)
{
// Handle cases not yet handled above
- if ((dir_info.arrival[1] == -1 && dir_info.arrival[0] == 0)
- || (dir_info.arrival[0] == -1 && dir_info.arrival[1] == 0))
+ if ((q_arrival == -1 && p_arrival == 0)
+ || (p_arrival == -1 && q_arrival == 0))
{
- for (int i = 0; i < 2; i++)
+ for (unsigned int i = 0; i < 2; i++)
{
tp.operations[i].operation = operation_opposite;
}
- for (unsigned int i = 0; i < intersection_info.count; i++)
+ for (unsigned int i = 0; i < info.i_info().count; i++)
{
- assign_point(tp, method_collinear, intersection_info, i);
- AssignPolicy::apply(tp, pi, qi, intersection_info, dir_info);
+ assign_point(tp, method_collinear, info.i_info(), i);
+ AssignPolicy::apply(tp, pi, qi, info);
*out++ = tp;
}
}
@@ -833,7 +841,7 @@ struct crosses : public base_turn_handler
// Intersection: take Q
// Otherwise: vice versa
int const side_qi_p1 = dir_info.sides.template get<1, 0>();
- int const index = side_qi_p1 == 1 ? 0 : 1;
+ unsigned int const index = side_qi_p1 == 1 ? 0 : 1;
ti.operations[index].operation = operation_union;
ti.operations[1 - index].operation = operation_intersection;
}
@@ -867,10 +875,9 @@ struct assign_null_policy
typename Info,
typename Point1,
typename Point2,
- typename IntersectionInfo,
- typename DirInfo
+ typename IntersectionInfo
>
- static inline void apply(Info& , Point1 const& , Point2 const&, IntersectionInfo const&, DirInfo const&)
+ static inline void apply(Info& , Point1 const& , Point2 const&, IntersectionInfo const&)
{}
};
@@ -933,7 +940,7 @@ struct get_turn_info
&& inters.i_info().count > 0)
{
only_convert::apply(tp, inters.i_info());
- AssignPolicy::apply(tp, pi, qi, inters.i_info(), inters.d_info());
+ AssignPolicy::apply(tp, pi, qi, inters);
*out++ = tp;
}
break;
@@ -968,7 +975,7 @@ struct get_turn_info
tp, inters.i_info(), inters.d_info(),
swapped_side_calc);
}
- AssignPolicy::apply(tp, pi, qi, inters.i_info(), inters.d_info());
+ AssignPolicy::apply(tp, pi, qi, inters);
*out++ = tp;
}
break;
@@ -976,7 +983,7 @@ struct get_turn_info
{
crosses<TurnInfo>::apply(pi, pj, pk, qi, qj, qk,
tp, inters.i_info(), inters.d_info());
- AssignPolicy::apply(tp, pi, qi, inters.i_info(), inters.d_info());
+ AssignPolicy::apply(tp, pi, qi, inters);
*out++ = tp;
}
break;
@@ -985,7 +992,7 @@ struct get_turn_info
// Both touch (both arrive there)
touch<TurnInfo>::apply(pi, pj, pk, qi, qj, qk,
tp, inters.i_info(), inters.d_info(), inters.sides());
- AssignPolicy::apply(tp, pi, qi, inters.i_info(), inters.d_info());
+ AssignPolicy::apply(tp, pi, qi, inters);
*out++ = tp;
}
break;
@@ -997,7 +1004,7 @@ struct get_turn_info
// or collinear-and-ending at intersection point
equal<TurnInfo>::apply(pi, pj, pk, qi, qj, qk,
tp, inters.i_info(), inters.d_info(), inters.sides());
- AssignPolicy::apply(tp, pi, qi, inters.i_info(), inters.d_info());
+ AssignPolicy::apply(tp, pi, qi, inters);
*out++ = tp;
}
else
@@ -1007,7 +1014,7 @@ struct get_turn_info
TurnInfo,
AssignPolicy
>::apply(pi, qi,
- tp, out, inters.i_info(), inters.d_info());
+ tp, out, inters);
}
}
break;
@@ -1032,7 +1039,7 @@ struct get_turn_info
tp, inters.i_info(), inters.d_info(), inters.sides());
}
- AssignPolicy::apply(tp, pi, qi, inters.i_info(), inters.d_info());
+ AssignPolicy::apply(tp, pi, qi, inters);
*out++ = tp;
}
else
@@ -1042,7 +1049,7 @@ struct get_turn_info
TurnInfo,
AssignPolicy
>::apply(pi, pj, pk, qi, qj, qk,
- tp, out, inters.i_info(), inters.d_info(), inters.sides());
+ tp, out, inters, inters.sides());
}
}
break;
@@ -1052,7 +1059,7 @@ struct get_turn_info
if (AssignPolicy::include_degenerate)
{
only_convert::apply(tp, inters.i_info());
- AssignPolicy::apply(tp, pi, qi, inters.i_info(), inters.d_info());
+ AssignPolicy::apply(tp, pi, qi, inters);
*out++ = tp;
}
}