| // Boost.Geometry (aka GGL, Generic Geometry Library) |
| |
| // Copyright (c) 2007-2011 Barend Gehrels, Amsterdam, the Netherlands. |
| // Copyright (c) 2008-2011 Bruno Lalande, Paris, France. |
| // Copyright (c) 2009-2011 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_DETAIL_SECTIONS_RANGE_BY_SECTION_HPP |
| #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_SECTIONS_RANGE_BY_SECTION_HPP |
| |
| |
| #include <boost/mpl/assert.hpp> |
| #include <boost/range.hpp> |
| |
| #include <boost/geometry/core/access.hpp> |
| #include <boost/geometry/core/closure.hpp> |
| #include <boost/geometry/core/exterior_ring.hpp> |
| #include <boost/geometry/core/interior_rings.hpp> |
| |
| |
| |
| namespace boost { namespace geometry |
| { |
| |
| #ifndef DOXYGEN_NO_DETAIL |
| namespace detail { namespace section |
| { |
| |
| |
| template <typename Range, typename Section> |
| struct full_section_range |
| { |
| static inline Range const& apply(Range const& range, Section const& section) |
| { |
| return range; |
| } |
| }; |
| |
| |
| template <typename Polygon, typename Section> |
| struct full_section_polygon |
| { |
| static inline typename ring_return_type<Polygon const>::type apply(Polygon const& polygon, Section const& section) |
| { |
| return section.ring_id.ring_index < 0 |
| ? geometry::exterior_ring(polygon) |
| : geometry::interior_rings(polygon)[section.ring_id.ring_index]; |
| } |
| }; |
| |
| |
| }} // namespace detail::section |
| #endif |
| |
| |
| #ifndef DOXYGEN_NO_DISPATCH |
| namespace dispatch |
| { |
| |
| |
| template |
| < |
| typename Tag, |
| typename Geometry, |
| typename Section |
| > |
| struct range_by_section |
| { |
| BOOST_MPL_ASSERT_MSG |
| ( |
| false, NOT_OR_NOT_YET_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE |
| , (types<Geometry>) |
| ); |
| }; |
| |
| |
| template <typename LineString, typename Section> |
| struct range_by_section<linestring_tag, LineString, Section> |
| : detail::section::full_section_range<LineString, Section> |
| {}; |
| |
| |
| template <typename Ring, typename Section> |
| struct range_by_section<ring_tag, Ring, Section> |
| : detail::section::full_section_range<Ring, Section> |
| {}; |
| |
| |
| template <typename Polygon, typename Section> |
| struct range_by_section<polygon_tag, Polygon, Section> |
| : detail::section::full_section_polygon<Polygon, Section> |
| {}; |
| |
| |
| } // namespace dispatch |
| #endif |
| |
| |
| /*! |
| \brief Get full ring (exterior, one of interiors, one from multi) |
| indicated by the specified section |
| \ingroup sectionalize |
| \tparam Geometry type |
| \tparam Section type of section to get from |
| \param geometry geometry to take section of |
| \param section structure with section |
| */ |
| template <typename Geometry, typename Section> |
| inline typename ring_return_type<Geometry const>::type |
| range_by_section(Geometry const& geometry, Section const& section) |
| { |
| concept::check<Geometry const>(); |
| |
| return dispatch::range_by_section |
| < |
| typename tag<Geometry>::type, |
| Geometry, |
| Section |
| >::apply(geometry, section); |
| } |
| |
| |
| }} // namespace boost::geometry |
| |
| #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_SECTIONS_RANGE_BY_SECTION_HPP |