diff options
Diffstat (limited to 'boost/geometry/algorithms/detail/is_valid/multipolygon.hpp')
-rw-r--r-- | boost/geometry/algorithms/detail/is_valid/multipolygon.hpp | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/boost/geometry/algorithms/detail/is_valid/multipolygon.hpp b/boost/geometry/algorithms/detail/is_valid/multipolygon.hpp index 0b3b4c4a74..5af933de85 100644 --- a/boost/geometry/algorithms/detail/is_valid/multipolygon.hpp +++ b/boost/geometry/algorithms/detail/is_valid/multipolygon.hpp @@ -1,7 +1,9 @@ // Boost.Geometry (aka GGL, Generic Geometry Library) -// Copyright (c) 2014-2020, Oracle and/or its affiliates. +// Copyright (c) 2023 Adam Wulkiewicz, Lodz, Poland. +// Copyright (c) 2014-2021, Oracle and/or its affiliates. +// Contributed and/or modified by Vissarion Fysikopoulos, on behalf of Oracle // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle @@ -26,7 +28,7 @@ #include <boost/geometry/core/ring_type.hpp> #include <boost/geometry/core/tags.hpp> -#include <boost/geometry/util/condition.hpp> +#include <boost/geometry/util/constexpr.hpp> #include <boost/geometry/util/range.hpp> #include <boost/geometry/geometries/box.hpp> @@ -34,7 +36,6 @@ #include <boost/geometry/algorithms/validity_failure_type.hpp> #include <boost/geometry/algorithms/within.hpp> -#include <boost/geometry/algorithms/detail/check_iterator_range.hpp> #include <boost/geometry/algorithms/detail/partition.hpp> #include <boost/geometry/algorithms/detail/is_valid/has_valid_self_turns.hpp> @@ -257,55 +258,56 @@ private: template <typename VisitPolicy, typename Strategy> - struct per_polygon + struct is_invalid_polygon { - per_polygon(VisitPolicy& policy, Strategy const& strategy) + is_invalid_polygon(VisitPolicy& policy, Strategy const& strategy) : m_policy(policy) , m_strategy(strategy) {} template <typename Polygon> - inline bool apply(Polygon const& polygon) const + inline bool operator()(Polygon const& polygon) const { - return base::apply(polygon, m_policy, m_strategy); + return ! base::apply(polygon, m_policy, m_strategy); } VisitPolicy& m_policy; Strategy const& m_strategy; }; + public: template <typename VisitPolicy, typename Strategy> static inline bool apply(MultiPolygon const& multipolygon, VisitPolicy& visitor, Strategy const& strategy) { - typedef debug_validity_phase<MultiPolygon> debug_phase; + using debug_phase = debug_validity_phase<MultiPolygon>; - if (BOOST_GEOMETRY_CONDITION(AllowEmptyMultiGeometries) - && boost::empty(multipolygon)) + if BOOST_GEOMETRY_CONSTEXPR (AllowEmptyMultiGeometries) { - return visitor.template apply<no_failure>(); + if (boost::empty(multipolygon)) + { + return visitor.template apply<no_failure>(); + } } // check validity of all polygons ring debug_phase::apply(1); - if (! detail::check_iterator_range - < - per_polygon<VisitPolicy, Strategy>, - false // do not check for empty multipolygon (done above) - >::apply(boost::begin(multipolygon), - boost::end(multipolygon), - per_polygon<VisitPolicy, Strategy>(visitor, strategy))) + if (std::any_of(boost::begin(multipolygon), boost::end(multipolygon), + is_invalid_polygon<VisitPolicy, Strategy>(visitor, strategy))) { return false; } - // compute turns and check if all are acceptable debug_phase::apply(2); - typedef has_valid_self_turns<MultiPolygon, typename Strategy::cs_tag> has_valid_turns; + using has_valid_turns = has_valid_self_turns + < + MultiPolygon, + typename Strategy::cs_tag + >; std::deque<typename has_valid_turns::turn_type> turns; bool has_invalid_turns = |