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.hpp31
1 files changed, 19 insertions, 12 deletions
diff --git a/boost/geometry/algorithms/detail/is_valid/ring.hpp b/boost/geometry/algorithms/detail/is_valid/ring.hpp
index 5a55d998e4..2a377ee8cc 100644
--- a/boost/geometry/algorithms/detail/is_valid/ring.hpp
+++ b/boost/geometry/algorithms/detail/is_valid/ring.hpp
@@ -2,7 +2,7 @@
// Copyright (c) 2017 Adam Wulkiewicz, Lodz, Poland.
-// Copyright (c) 2014-2018, Oracle and/or its affiliates.
+// Copyright (c) 2014-2019, 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
@@ -25,13 +25,12 @@
#include <boost/geometry/util/order_as_direction.hpp>
#include <boost/geometry/util/range.hpp>
-#include <boost/geometry/algorithms/equals.hpp>
-
#include <boost/geometry/views/closeable_view.hpp>
#include <boost/geometry/algorithms/area.hpp>
#include <boost/geometry/algorithms/intersects.hpp>
#include <boost/geometry/algorithms/validity_failure_type.hpp>
+#include <boost/geometry/algorithms/detail/equals/point_point.hpp>
#include <boost/geometry/algorithms/detail/num_distinct_consecutive_points.hpp>
#include <boost/geometry/algorithms/detail/is_valid/has_duplicates.hpp>
#include <boost/geometry/algorithms/detail/is_valid/has_invalid_coordinate.hpp>
@@ -58,8 +57,8 @@ namespace detail { namespace is_valid
template <typename Ring, closure_selector Closure /* open */>
struct is_topologically_closed
{
- template <typename VisitPolicy>
- static inline bool apply(Ring const&, VisitPolicy& visitor)
+ template <typename VisitPolicy, typename EqPPStrategy>
+ static inline bool apply(Ring const&, VisitPolicy& visitor, EqPPStrategy const&)
{
boost::ignore_unused(visitor);
@@ -70,12 +69,14 @@ struct is_topologically_closed
template <typename Ring>
struct is_topologically_closed<Ring, closed>
{
- template <typename VisitPolicy>
- static inline bool apply(Ring const& ring, VisitPolicy& visitor)
+ template <typename VisitPolicy, typename EqPPStrategy>
+ static inline bool apply(Ring const& ring, VisitPolicy& visitor, EqPPStrategy const&)
{
boost::ignore_unused(visitor);
- if (geometry::equals(range::front(ring), range::back(ring)))
+ if (geometry::detail::equals::equals_point_point(range::front(ring),
+ range::back(ring),
+ EqPPStrategy()))
{
return visitor.template apply<no_failure>();
}
@@ -157,6 +158,8 @@ struct is_valid_ring
static inline bool apply(Ring const& ring, VisitPolicy& visitor,
Strategy const& strategy)
{
+ typedef typename Strategy::cs_tag cs_tag;
+
// return invalid if any of the following condition holds:
// (a) the ring's point coordinates are not invalid (e.g., NaN)
// (b) the ring's size is below the minimal one
@@ -189,7 +192,11 @@ struct is_valid_ring
if (detail::num_distinct_consecutive_points
<
view_type, 4u, true,
- not_equal_to<typename point_type<Ring>::type>
+ not_equal_to
+ <
+ typename point_type<Ring>::type,
+ typename Strategy::equals_point_point_strategy_type
+ >
>::apply(view)
< 4u)
{
@@ -198,11 +205,11 @@ struct is_valid_ring
}
return
- is_topologically_closed<Ring, closure>::apply(ring, visitor)
- && ! has_duplicates<Ring, closure>::apply(ring, visitor)
+ is_topologically_closed<Ring, closure>::apply(ring, visitor, strategy.get_equals_point_point_strategy())
+ && ! has_duplicates<Ring, closure, cs_tag>::apply(ring, visitor)
&& ! has_spikes<Ring, closure>::apply(ring, visitor, strategy.get_side_strategy())
&& (! CheckSelfIntersections
- || has_valid_self_turns<Ring>::apply(ring, visitor, strategy))
+ || has_valid_self_turns<Ring, typename Strategy::cs_tag>::apply(ring, visitor, strategy))
&& is_properly_oriented<Ring, IsInteriorRing>::apply(ring, visitor, strategy);
}
};