1 // Boost.Geometry (aka GGL, Generic Geometry Library)
3 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
4 // Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
5 // Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
7 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
8 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
10 // This file was modified by Oracle on 2013-2020.
11 // Modifications copyright (c) 2013-2020, Oracle and/or its affiliates.
12 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
14 // Use, modification and distribution is subject to the Boost Software License,
15 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
16 // http://www.boost.org/LICENSE_1_0.txt)
18 #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_SECTIONS_RANGE_BY_SECTION_HPP
19 #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_SECTIONS_RANGE_BY_SECTION_HPP
21 #include <boost/range/size.hpp>
22 #include <boost/range/value_type.hpp>
24 #include <boost/geometry/core/access.hpp>
25 #include <boost/geometry/core/assert.hpp>
26 #include <boost/geometry/core/closure.hpp>
27 #include <boost/geometry/core/exterior_ring.hpp>
28 #include <boost/geometry/core/interior_rings.hpp>
29 #include <boost/geometry/core/ring_type.hpp>
30 #include <boost/geometry/core/static_assert.hpp>
31 #include <boost/geometry/core/tags.hpp>
32 #include <boost/geometry/geometries/concepts/check.hpp>
33 #include <boost/geometry/util/range.hpp>
36 namespace boost { namespace geometry
39 #ifndef DOXYGEN_NO_DETAIL
40 namespace detail { namespace section
44 template <typename Range, typename Section>
45 struct full_section_range
47 static inline Range const& apply(Range const& range, Section const& )
54 template <typename Polygon, typename Section>
55 struct full_section_polygon
57 static inline typename ring_return_type<Polygon const>::type apply(Polygon const& polygon, Section const& section)
59 return section.ring_id.ring_index < 0
60 ? geometry::exterior_ring(polygon)
61 : range::at(geometry::interior_rings(polygon),
62 static_cast<std::size_t>(section.ring_id.ring_index));
69 typename MultiGeometry,
73 struct full_section_multi
75 static inline typename ring_return_type<MultiGeometry const>::type apply(
76 MultiGeometry const& multi, Section const& section)
78 typedef typename boost::range_size<MultiGeometry>::type size_type;
82 section.ring_id.multi_index >= 0
83 && size_type(section.ring_id.multi_index) < boost::size(multi)
86 return Policy::apply(range::at(multi, size_type(section.ring_id.multi_index)), section);
91 }} // namespace detail::section
95 #ifndef DOXYGEN_NO_DISPATCH
106 struct range_by_section
108 BOOST_GEOMETRY_STATIC_ASSERT_FALSE(
109 "Not or not yet implemented for this Geometry type.",
110 Tag, Geometry, Section);
114 template <typename LineString, typename Section>
115 struct range_by_section<linestring_tag, LineString, Section>
116 : detail::section::full_section_range<LineString, Section>
120 template <typename Ring, typename Section>
121 struct range_by_section<ring_tag, Ring, Section>
122 : detail::section::full_section_range<Ring, Section>
126 template <typename Polygon, typename Section>
127 struct range_by_section<polygon_tag, Polygon, Section>
128 : detail::section::full_section_polygon<Polygon, Section>
132 template <typename MultiPolygon, typename Section>
133 struct range_by_section<multi_polygon_tag, MultiPolygon, Section>
134 : detail::section::full_section_multi
138 detail::section::full_section_polygon
140 typename boost::range_value<MultiPolygon>::type,
146 template <typename MultiLinestring, typename Section>
147 struct range_by_section<multi_linestring_tag, MultiLinestring, Section>
148 : detail::section::full_section_multi
152 detail::section::full_section_range
154 typename boost::range_value<MultiLinestring>::type,
161 } // namespace dispatch
166 \brief Get full ring (exterior, one of interiors, one from multi)
167 indicated by the specified section
168 \ingroup sectionalize
169 \tparam Geometry type
170 \tparam Section type of section to get from
171 \param geometry geometry to take section of
172 \param section structure with section
174 template <typename Geometry, typename Section>
175 inline typename ring_return_type<Geometry const>::type
176 range_by_section(Geometry const& geometry, Section const& section)
178 concepts::check<Geometry const>();
180 return dispatch::range_by_section
182 typename tag<Geometry>::type,
185 >::apply(geometry, section);
189 }} // namespace boost::geometry
191 #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_SECTIONS_RANGE_BY_SECTION_HPP