// 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. // 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 #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)); typename interior_return_type::type rings = interior_rings(polygon); for (typename detail::interior_iterator::type it = boost::begin(rings); it != boost::end(rings); ++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 < Geometry, detail::reverse::range_reverse > {}; template struct reverse : detail::multi_modify < Geometry, detail::reverse::polygon_reverse > {}; } // namespace dispatch #endif namespace resolve_variant { template struct reverse { static void apply(Geometry& geometry) { concepts::check(); dispatch::reverse::apply(geometry); } }; template struct reverse > { struct visitor: boost::static_visitor { template void operator()(Geometry& geometry) const { reverse::apply(geometry); } }; static inline void apply(boost::variant& geometry) { boost::apply_visitor(visitor(), geometry); } }; } // namespace resolve_variant /*! \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_variant::reverse::apply(geometry); } }} // namespace boost::geometry #endif // BOOST_GEOMETRY_ALGORITHMS_REVERSE_HPP