diff options
Diffstat (limited to 'boost/geometry/algorithms/detail/relate/multi_point_geometry.hpp')
-rw-r--r-- | boost/geometry/algorithms/detail/relate/multi_point_geometry.hpp | 69 |
1 files changed, 37 insertions, 32 deletions
diff --git a/boost/geometry/algorithms/detail/relate/multi_point_geometry.hpp b/boost/geometry/algorithms/detail/relate/multi_point_geometry.hpp index 7da7f2be5e..204a4fe22d 100644 --- a/boost/geometry/algorithms/detail/relate/multi_point_geometry.hpp +++ b/boost/geometry/algorithms/detail/relate/multi_point_geometry.hpp @@ -1,7 +1,8 @@ // Boost.Geometry -// Copyright (c) 2017-2020 Oracle and/or its affiliates. +// Copyright (c) 2014-2023, Oracle and/or its affiliates. +// Contributed and/or modified by Vissarion Fysikopoulos, on behalf of Oracle // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // Use, modification and distribution is subject to the Boost Software License, @@ -94,9 +95,8 @@ struct multi_point_geometry_eb<Geometry, linestring_tag> template <typename Point, typename Strategy> bool apply(Point const& boundary_point, Strategy const& strategy) { - if ( std::find_if(m_points.begin(), m_points.end(), - find_pred<Point, Strategy>(boundary_point, strategy)) - == m_points.end() ) + if ( std::none_of(m_points.begin(), m_points.end(), + find_pred<Point, Strategy>(boundary_point, strategy))) { m_boundary_found = true; return false; @@ -135,7 +135,7 @@ struct multi_point_geometry_eb<Geometry, multi_linestring_tag> template <typename Point, typename Strategy> bool apply(Point const& boundary_point, Strategy const&) { - typedef geometry::less<void, -1, typename Strategy::cs_tag> less_type; + typedef geometry::less<void, -1, Strategy> less_type; if (! std::binary_search(m_points.begin(), m_points.end(), boundary_point, less_type()) ) @@ -159,9 +159,9 @@ struct multi_point_geometry_eb<Geometry, multi_linestring_tag> { typedef typename boost::range_value<MultiPoint>::type point_type; typedef std::vector<point_type> points_type; - typedef geometry::less<void, -1, typename Strategy::cs_tag> less_type; + typedef geometry::less<void, -1, Strategy> less_type; - points_type points(boost::begin(multi_point), boost::end(multi_point)); + points_type points(boost::begin(multi_point), boost::end(multi_point)); std::sort(points.begin(), points.end(), less_type()); boundary_visitor<points_type> visitor(points); @@ -184,13 +184,12 @@ struct multi_point_single_geometry { typedef typename point_type<SingleGeometry>::type point2_type; typedef model::box<point2_type> box2_type; - + box2_type box2; geometry::envelope(single_geometry, box2, strategy); geometry::detail::expand_by_epsilon(box2); - typedef typename boost::range_const_iterator<MultiPoint>::type iterator; - for ( iterator it = boost::begin(multi_point) ; it != boost::end(multi_point) ; ++it ) + for (auto it = boost::begin(multi_point); it != boost::end(multi_point); ++it) { if (! (relate::may_update<interior, interior, '0', Transpose>(result) || relate::may_update<interior, boundary, '0', Transpose>(result) @@ -202,7 +201,7 @@ struct multi_point_single_geometry // The default strategy is enough for Point/Box if (detail::disjoint::disjoint_point_box(*it, box2, strategy)) { - relate::set<interior, exterior, '0', Transpose>(result); + update<interior, exterior, '0', Transpose>(result); } else { @@ -210,15 +209,15 @@ struct multi_point_single_geometry if (in_val > 0) // within { - relate::set<interior, interior, '0', Transpose>(result); + update<interior, interior, '0', Transpose>(result); } else if (in_val == 0) { - relate::set<interior, boundary, '0', Transpose>(result); + update<interior, boundary, '0', Transpose>(result); } else // in_val < 0 - not within { - relate::set<interior, exterior, '0', Transpose>(result); + update<interior, exterior, '0', Transpose>(result); } } @@ -240,7 +239,7 @@ struct multi_point_single_geometry { // TODO: this is not true if a linestring is degenerated to a point // then the interior has topological dimension = 0, not 1 - relate::set<exterior, interior, tc_t::interior, Transpose>(result); + update<exterior, interior, tc_t::interior, Transpose>(result); } if ( relate::may_update<exterior, boundary, tc_t::boundary, Transpose>(result) @@ -248,12 +247,12 @@ struct multi_point_single_geometry { if (multi_point_geometry_eb<SingleGeometry>::apply(multi_point, tc)) { - relate::set<exterior, boundary, tc_t::boundary, Transpose>(result); + update<exterior, boundary, tc_t::boundary, Transpose>(result); } } } - relate::set<exterior, exterior, result_dimension<MultiPoint>::value, Transpose>(result); + update<exterior, exterior, result_dimension<MultiPoint>::value, Transpose>(result); } }; @@ -365,14 +364,18 @@ class multi_point_multi_geometry_ii_ib if (in_val > 0) // within { - relate::set<interior, interior, '0', Transpose>(m_result); + update<interior, interior, '0', Transpose>(m_result); } else if (in_val == 0) { if (m_tc.check_boundary_point(point)) - relate::set<interior, boundary, '0', Transpose>(m_result); + { + update<interior, boundary, '0', Transpose>(m_result); + } else - relate::set<interior, interior, '0', Transpose>(m_result); + { + update<interior, interior, '0', Transpose>(m_result); + } } } @@ -442,7 +445,6 @@ struct multi_point_multi_geometry_ii_ib_ie typedef model::box<point2_type> box2_type; typedef std::pair<box2_type, std::size_t> box_pair_type; typedef std::vector<box_pair_type> boxes_type; - typedef typename boxes_type::const_iterator boxes_iterator; template <typename Result, typename Strategy> static inline void apply(MultiPoint const& multi_point, @@ -463,8 +465,7 @@ struct multi_point_multi_geometry_ii_ib_ie rtree(boxes.begin(), boxes.end(), index_parameters_type(index::rstar<4>(), strategy)); - typedef typename boost::range_const_iterator<MultiPoint>::type iterator; - for ( iterator it = boost::begin(multi_point) ; it != boost::end(multi_point) ; ++it ) + for (auto it = boost::begin(multi_point); it != boost::end(multi_point); ++it) { if (! (relate::may_update<interior, interior, '0', Transpose>(result) || relate::may_update<interior, boundary, '0', Transpose>(result) @@ -479,24 +480,28 @@ struct multi_point_multi_geometry_ii_ib_ie rtree.query(index::intersects(point), std::back_inserter(boxes_found)); bool found_ii_or_ib = false; - for (boxes_iterator bi = boxes_found.begin() ; bi != boxes_found.end() ; ++bi) + for (auto const& box_found : boxes_found) { typename boost::range_value<MultiGeometry>::type const& - single = range::at(multi_geometry, bi->second); + single = range::at(multi_geometry, box_found.second); int in_val = detail::within::point_in_geometry(point, single, strategy); if (in_val > 0) // within { - relate::set<interior, interior, '0', Transpose>(result); + update<interior, interior, '0', Transpose>(result); found_ii_or_ib = true; } else if (in_val == 0) // on boundary of single { if (tc.check_boundary_point(point)) - relate::set<interior, boundary, '0', Transpose>(result); + { + update<interior, boundary, '0', Transpose>(result); + } else - relate::set<interior, interior, '0', Transpose>(result); + { + update<interior, interior, '0', Transpose>(result); + } found_ii_or_ib = true; } } @@ -504,7 +509,7 @@ struct multi_point_multi_geometry_ii_ib_ie // neither interior nor boundary found -> exterior if (found_ii_or_ib == false) { - relate::set<interior, exterior, '0', Transpose>(result); + update<interior, exterior, '0', Transpose>(result); } if ( BOOST_GEOMETRY_CONDITION(result.interrupt) ) @@ -573,7 +578,7 @@ struct multi_point_multi_geometry { // TODO: this is not true if a linestring is degenerated to a point // then the interior has topological dimension = 0, not 1 - relate::set<exterior, interior, tc_t::interior, Transpose>(result); + update<exterior, interior, tc_t::interior, Transpose>(result); } if ( relate::may_update<exterior, boundary, tc_t::boundary, Transpose>(result) @@ -581,12 +586,12 @@ struct multi_point_multi_geometry { if (multi_point_geometry_eb<MultiGeometry>::apply(multi_point, tc)) { - relate::set<exterior, boundary, tc_t::boundary, Transpose>(result); + update<exterior, boundary, tc_t::boundary, Transpose>(result); } } } - relate::set<exterior, exterior, result_dimension<MultiPoint>::value, Transpose>(result); + update<exterior, exterior, result_dimension<MultiPoint>::value, Transpose>(result); } }; |