// 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. // 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 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) { typedef typename geometry::ring_type::type ring_type; range_reverse::apply(exterior_ring(polygon)); typename interior_return_type::type rings = interior_rings(polygon); for (BOOST_AUTO_TPL(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 {}; } // namespace dispatch #endif /*! \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) { concept::check(); dispatch::reverse::apply(geometry); } }} // namespace boost::geometry #endif // BOOST_GEOMETRY_ALGORITHMS_REVERSE_HPP