diff options
Diffstat (limited to 'boost/geometry/algorithms/detail/is_valid/ring.hpp')
-rw-r--r-- | boost/geometry/algorithms/detail/is_valid/ring.hpp | 31 |
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); } }; |