summaryrefslogtreecommitdiff
path: root/boost/geometry/algorithms/reverse.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/algorithms/reverse.hpp')
-rw-r--r--boost/geometry/algorithms/reverse.hpp68
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