// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2007-2011 Barend Gehrels, 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_DETAIL_OVERLAY_GET_RING_HPP #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_RING_HPP #include #include #include #include #include #include namespace boost { namespace geometry { #ifndef DOXYGEN_NO_DETAIL namespace detail { namespace overlay { template struct get_ring {}; // A container of rings (multi-ring but that does not exist) // gets the "void" tag and is dispatched here. template<> struct get_ring { template static inline typename boost::range_value::type const& apply(ring_identifier const& id, Container const& container) { return container[id.multi_index]; } }; template<> struct get_ring { template static inline Ring const& apply(ring_identifier const& , Ring const& ring) { return ring; } }; template<> struct get_ring { template static inline Box const& apply(ring_identifier const& , Box const& box) { return box; } }; template<> struct get_ring { template static inline typename ring_return_type::type const apply( ring_identifier const& id, Polygon const& polygon) { BOOST_ASSERT ( id.ring_index >= -1 && id.ring_index < boost::size(interior_rings(polygon)) ); return id.ring_index < 0 ? exterior_ring(polygon) : interior_rings(polygon)[id.ring_index]; } }; }} // namespace detail::overlay #endif // DOXYGEN_NO_DETAIL }} // namespace boost::geometry #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_RING_HPP