// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. // Copyright (c) 2009-2012 Mateusz Loskot, London, UK. // Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland. // This file was modified by Oracle on 2020-2021. // Modifications copyright (c) 2020-2021 Oracle and/or its affiliates. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_GEOMETRY_ALGORITHMS_REVERSE_HPP #define BOOST_GEOMETRY_ALGORITHMS_REVERSE_HPP #include #include #include #include #include #include #include #include #include #include // For backward compatibility #include #include namespace boost { namespace geometry { #ifndef DOXYGEN_NO_DETAIL namespace detail { namespace reverse { struct range_reverse { template static inline void apply(Range& range) { std::reverse(boost::begin(range), boost::end(range)); } }; struct polygon_reverse: private range_reverse { template static inline void apply(Polygon& polygon) { range_reverse::apply(exterior_ring(polygon)); auto&& rings = interior_rings(polygon); auto const end = boost::end(rings); for (auto it = boost::begin(rings); it != end; ++it) { range_reverse::apply(*it); } } }; }} // namespace detail::reverse #endif // DOXYGEN_NO_DETAIL #ifndef DOXYGEN_NO_DISPATCH namespace dispatch { template ::type> struct reverse { static inline void apply(Geometry&) {} }; template struct reverse : detail::reverse::range_reverse {}; template struct reverse : detail::reverse::range_reverse {}; template struct reverse : detail::reverse::polygon_reverse {}; template struct reverse : detail::multi_modify {}; template struct reverse : detail::multi_modify {}; } // namespace dispatch #endif namespace resolve_dynamic { template ::type> struct reverse { static void apply(Geometry& geometry) { concepts::check(); dispatch::reverse::apply(geometry); } }; template struct reverse { static void apply(Geometry& geometry) { traits::visit::apply([](auto & g) { reverse>::apply(g); }, geometry); } }; template struct reverse { static void apply(Geometry& geometry) { detail::visit_breadth_first([](auto & g) { reverse>::apply(g); return true; }, geometry); } }; } // namespace resolve_dynamic /*! \brief Reverses the points within a geometry \details Generic function to reverse a geometry. It resembles the std::reverse functionality, but it takes the geometry type into account. Only for a ring or for a linestring it is the same as the std::reverse. \ingroup reverse \tparam Geometry \tparam_geometry \param geometry \param_geometry which will be reversed \qbk{[include reference/algorithms/reverse.qbk]} */ template inline void reverse(Geometry& geometry) { resolve_dynamic::reverse::apply(geometry); } }} // namespace boost::geometry #endif // BOOST_GEOMETRY_ALGORITHMS_REVERSE_HPP