summaryrefslogtreecommitdiff
path: root/boost/geometry/algorithms/detail/is_valid/ring.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/algorithms/detail/is_valid/ring.hpp')
-rw-r--r--boost/geometry/algorithms/detail/is_valid/ring.hpp47
1 files changed, 23 insertions, 24 deletions
diff --git a/boost/geometry/algorithms/detail/is_valid/ring.hpp b/boost/geometry/algorithms/detail/is_valid/ring.hpp
index 925c03a472..9ab68fdc48 100644
--- a/boost/geometry/algorithms/detail/is_valid/ring.hpp
+++ b/boost/geometry/algorithms/detail/is_valid/ring.hpp
@@ -1,6 +1,6 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+// Copyright (c) 2014-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
@@ -101,26 +101,21 @@ struct ring_area_predicate<ResultType, true>
template <typename Ring, bool IsInteriorRing>
struct is_properly_oriented
{
- typedef typename point_type<Ring>::type point_type;
-
- typedef typename strategy::area::services::default_strategy
- <
- typename cs_tag<point_type>::type,
- point_type
- >::type strategy_type;
+ template <typename VisitPolicy, typename Strategy>
+ static inline bool apply(Ring const& ring, VisitPolicy& visitor,
+ Strategy const& strategy)
+ {
+ boost::ignore_unused(visitor);
- typedef detail::area::ring_area
- <
- order_as_direction<geometry::point_order<Ring>::value>::value,
- geometry::closure<Ring>::value
- > ring_area_type;
+ typedef typename point_type<Ring>::type point_type;
- typedef typename default_area_result<Ring>::type area_result_type;
+ typedef detail::area::ring_area
+ <
+ order_as_direction<geometry::point_order<Ring>::value>::value,
+ geometry::closure<Ring>::value
+ > ring_area_type;
- template <typename VisitPolicy>
- static inline bool apply(Ring const& ring, VisitPolicy& visitor)
- {
- boost::ignore_unused(visitor);
+ typedef typename default_area_result<Ring>::type area_result_type;
typename ring_area_predicate
<
@@ -128,8 +123,11 @@ struct is_properly_oriented
>::type predicate;
// Check area
- area_result_type const zero = area_result_type();
- if (predicate(ring_area_type::apply(ring, strategy_type()), zero))
+ area_result_type const zero = 0;
+ area_result_type const area
+ = ring_area_type::apply(ring,
+ strategy.template get_area_strategy<point_type>());
+ if (predicate(area, zero))
{
return visitor.template apply<no_failure>();
}
@@ -150,8 +148,9 @@ template
>
struct is_valid_ring
{
- template <typename VisitPolicy>
- static inline bool apply(Ring const& ring, VisitPolicy& visitor)
+ template <typename VisitPolicy, typename Strategy>
+ static inline bool apply(Ring const& ring, VisitPolicy& visitor,
+ Strategy const& strategy)
{
// return invalid if any of the following condition holds:
// (a) the ring's point coordinates are not invalid (e.g., NaN)
@@ -198,8 +197,8 @@ struct is_valid_ring
&& ! has_duplicates<Ring, closure>::apply(ring, visitor)
&& ! has_spikes<Ring, closure>::apply(ring, visitor)
&& (! CheckSelfIntersections
- || has_valid_self_turns<Ring>::apply(ring, visitor))
- && is_properly_oriented<Ring, IsInteriorRing>::apply(ring, visitor);
+ || has_valid_self_turns<Ring>::apply(ring, visitor, strategy))
+ && is_properly_oriented<Ring, IsInteriorRing>::apply(ring, visitor, strategy);
}
};