diff options
Diffstat (limited to 'boost/geometry/algorithms/reverse.hpp')
-rw-r--r-- | boost/geometry/algorithms/reverse.hpp | 68 |
1 files changed, 32 insertions, 36 deletions
diff --git a/boost/geometry/algorithms/reverse.hpp b/boost/geometry/algorithms/reverse.hpp index f124ee615c..307f8294fa 100644 --- a/boost/geometry/algorithms/reverse.hpp +++ b/boost/geometry/algorithms/reverse.hpp @@ -5,8 +5,9 @@ // Copyright (c) 2009-2012 Mateusz Loskot, London, UK. // Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland. -// This file was modified by Oracle on 2020. -// Modifications copyright (c) 2020 Oracle and/or its affiliates. +// This file was modified by Oracle on 2020-2023. +// Modifications copyright (c) 2020-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 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library @@ -24,14 +25,12 @@ #include <boost/range/begin.hpp> #include <boost/range/end.hpp> -#include <boost/variant/apply_visitor.hpp> -#include <boost/variant/static_visitor.hpp> -#include <boost/variant/variant_fwd.hpp> - -#include <boost/geometry/algorithms/detail/interior_iterator.hpp> #include <boost/geometry/algorithms/detail/multi_modify.hpp> +#include <boost/geometry/algorithms/detail/visit.hpp> #include <boost/geometry/core/interior_rings.hpp> #include <boost/geometry/core/tags.hpp> +#include <boost/geometry/core/visit.hpp> +#include <boost/geometry/geometries/adapted/boost_variant.hpp> // For backward compatibility #include <boost/geometry/geometries/concepts/check.hpp> @@ -61,11 +60,9 @@ struct polygon_reverse: private range_reverse { range_reverse::apply(exterior_ring(polygon)); - typename interior_return_type<Polygon>::type - rings = interior_rings(polygon); - - for (typename detail::interior_iterator<Polygon>::type - it = boost::begin(rings); it != boost::end(rings); ++it) + auto&& rings = interior_rings(polygon); + auto const end = boost::end(rings); + for (auto it = boost::begin(rings); it != end; ++it) { range_reverse::apply(*it); } @@ -110,21 +107,13 @@ struct reverse<Polygon, polygon_tag> template <typename Geometry> struct reverse<Geometry, multi_linestring_tag> - : detail::multi_modify - < - Geometry, - detail::reverse::range_reverse - > + : detail::multi_modify<detail::reverse::range_reverse> {}; template <typename Geometry> struct reverse<Geometry, multi_polygon_tag> - : detail::multi_modify - < - Geometry, - detail::reverse::polygon_reverse - > + : detail::multi_modify<detail::reverse::polygon_reverse> {}; @@ -133,10 +122,10 @@ struct reverse<Geometry, multi_polygon_tag> #endif -namespace resolve_variant +namespace resolve_dynamic { -template <typename Geometry> +template <typename Geometry, typename Tag = typename tag<Geometry>::type> struct reverse { static void apply(Geometry& geometry) @@ -146,25 +135,32 @@ struct reverse } }; -template <BOOST_VARIANT_ENUM_PARAMS(typename T)> -struct reverse<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> > +template <typename Geometry> +struct reverse<Geometry, dynamic_geometry_tag> { - struct visitor: boost::static_visitor<void> + static void apply(Geometry& geometry) { - template <typename Geometry> - void operator()(Geometry& geometry) const + traits::visit<Geometry>::apply([](auto & g) { - reverse<Geometry>::apply(geometry); - } - }; + reverse<util::remove_cref_t<decltype(g)>>::apply(g); + }, geometry); + } +}; - static inline void apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>& geometry) +template <typename Geometry> +struct reverse<Geometry, geometry_collection_tag> +{ + static void apply(Geometry& geometry) { - boost::apply_visitor(visitor(), geometry); + detail::visit_breadth_first([](auto & g) + { + reverse<util::remove_cref_t<decltype(g)>>::apply(g); + return true; + }, geometry); } }; -} // namespace resolve_variant +} // namespace resolve_dynamic /*! @@ -181,7 +177,7 @@ struct reverse<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> > template <typename Geometry> inline void reverse(Geometry& geometry) { - resolve_variant::reverse<Geometry>::apply(geometry); + resolve_dynamic::reverse<Geometry>::apply(geometry); } }} // namespace boost::geometry |