Chris@16: // Boost.Geometry (aka GGL, Generic Geometry Library) Chris@16: Chris@16: // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. Chris@16: // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. Chris@16: // Copyright (c) 2009-2012 Mateusz Loskot, London, UK. Chris@101: // Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland. Chris@16: Chris@16: // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library Chris@16: // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. Chris@16: Chris@16: // Use, modification and distribution is subject to the Boost Software License, Chris@16: // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_GEOMETRY_ALGORITHMS_REVERSE_HPP Chris@16: #define BOOST_GEOMETRY_ALGORITHMS_REVERSE_HPP Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@101: #include Chris@16: Chris@101: #include Chris@101: #include Chris@101: #include Chris@101: Chris@101: #include Chris@101: #include Chris@16: #include Chris@101: #include Chris@16: #include Chris@16: Chris@16: Chris@16: namespace boost { namespace geometry Chris@16: { Chris@16: Chris@16: Chris@16: #ifndef DOXYGEN_NO_DETAIL Chris@16: namespace detail { namespace reverse Chris@16: { Chris@16: Chris@16: Chris@16: struct range_reverse Chris@16: { Chris@16: template Chris@16: static inline void apply(Range& range) Chris@16: { Chris@16: std::reverse(boost::begin(range), boost::end(range)); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: struct polygon_reverse: private range_reverse Chris@16: { Chris@16: template Chris@16: static inline void apply(Polygon& polygon) Chris@16: { Chris@16: range_reverse::apply(exterior_ring(polygon)); Chris@16: Chris@101: typename interior_return_type::type Chris@101: rings = interior_rings(polygon); Chris@101: Chris@101: for (typename detail::interior_iterator::type Chris@101: it = boost::begin(rings); it != boost::end(rings); ++it) Chris@16: { Chris@16: range_reverse::apply(*it); Chris@16: } Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: }} // namespace detail::reverse Chris@16: #endif // DOXYGEN_NO_DETAIL Chris@16: Chris@16: Chris@16: #ifndef DOXYGEN_NO_DISPATCH Chris@16: namespace dispatch Chris@16: { Chris@16: Chris@16: Chris@16: template ::type> Chris@16: struct reverse Chris@16: { Chris@16: static inline void apply(Geometry&) Chris@16: {} Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@16: struct reverse Chris@16: : detail::reverse::range_reverse Chris@16: {}; Chris@16: Chris@16: Chris@16: template Chris@16: struct reverse Chris@16: : detail::reverse::range_reverse Chris@16: {}; Chris@16: Chris@16: Chris@16: template Chris@16: struct reverse Chris@16: : detail::reverse::polygon_reverse Chris@16: {}; Chris@16: Chris@16: Chris@101: template Chris@101: struct reverse Chris@101: : detail::multi_modify Chris@101: < Chris@101: Geometry, Chris@101: detail::reverse::range_reverse Chris@101: > Chris@101: {}; Chris@101: Chris@101: Chris@101: template Chris@101: struct reverse Chris@101: : detail::multi_modify Chris@101: < Chris@101: Geometry, Chris@101: detail::reverse::polygon_reverse Chris@101: > Chris@101: {}; Chris@101: Chris@101: Chris@101: Chris@16: } // namespace dispatch Chris@16: #endif Chris@16: Chris@16: Chris@101: namespace resolve_variant Chris@101: { Chris@101: Chris@101: template Chris@101: struct reverse Chris@101: { Chris@101: static void apply(Geometry& geometry) Chris@101: { Chris@101: concept::check(); Chris@101: dispatch::reverse::apply(geometry); Chris@101: } Chris@101: }; Chris@101: Chris@101: template Chris@101: struct reverse > Chris@101: { Chris@101: struct visitor: boost::static_visitor Chris@101: { Chris@101: template Chris@101: void operator()(Geometry& geometry) const Chris@101: { Chris@101: reverse::apply(geometry); Chris@101: } Chris@101: }; Chris@101: Chris@101: static inline void apply(boost::variant& geometry) Chris@101: { Chris@101: boost::apply_visitor(visitor(), geometry); Chris@101: } Chris@101: }; Chris@101: Chris@101: } // namespace resolve_variant Chris@101: Chris@101: Chris@16: /*! Chris@16: \brief Reverses the points within a geometry Chris@16: \details Generic function to reverse a geometry. It resembles the std::reverse Chris@16: functionality, but it takes the geometry type into account. Only for a ring Chris@16: or for a linestring it is the same as the std::reverse. Chris@16: \ingroup reverse Chris@16: \tparam Geometry \tparam_geometry Chris@16: \param geometry \param_geometry which will be reversed Chris@16: Chris@16: \qbk{[include reference/algorithms/reverse.qbk]} Chris@16: */ Chris@16: template Chris@16: inline void reverse(Geometry& geometry) Chris@16: { Chris@101: resolve_variant::reverse::apply(geometry); Chris@16: } Chris@16: Chris@16: }} // namespace boost::geometry Chris@16: Chris@16: Chris@16: #endif // BOOST_GEOMETRY_ALGORITHMS_REVERSE_HPP