1// Boost.Geometry Index
2//
3// This view makes possible to treat some simple primitives as its bounding geometry
4// e.g. box, nsphere, etc.
5//
6// Copyright (c) 2014-2015 Adam Wulkiewicz, Lodz, Poland.
7//
8// Use, modification and distribution is subject to the Boost Software License,
9// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
10// http://www.boost.org/LICENSE_1_0.txt)
11
12#ifndef BOOST_GEOMETRY_INDEX_DETAIL_BOUNDED_VIEW_HPP
13#define BOOST_GEOMETRY_INDEX_DETAIL_BOUNDED_VIEW_HPP
14
15#include <boost/geometry/algorithms/envelope.hpp>
16
17namespace boost { namespace geometry {
18
19namespace index { namespace detail {
20
21template <typename Geometry,
22 typename BoundingGeometry,
23 typename Tag = typename geometry::tag<Geometry>::type,
24 typename BoundingTag = typename geometry::tag<BoundingGeometry>::type,
25 typename CSystem = typename geometry::coordinate_system<Geometry>::type>
26struct bounded_view
27{
28 BOOST_MPL_ASSERT_MSG(
29 (false),
30 NOT_IMPLEMENTED_FOR_THOSE_GEOMETRIES,
31 (BoundingTag, Tag));
32};
33
34
35// Segment -> Box
36
37template <typename Segment, typename Box>
38struct bounded_view<Segment, Box, segment_tag, box_tag, cs::cartesian>
39{
40public:
41 typedef typename geometry::coordinate_type<Box>::type coordinate_type;
42
43 explicit bounded_view(Segment const& segment)
44 : m_segment(segment)
45 {}
46
47 template <std::size_t Dimension>
48 inline coordinate_type get_min() const
49 {
50 return boost::numeric_cast<coordinate_type>(
51 (std::min)( geometry::get<0, Dimension>(m_segment),
52 geometry::get<1, Dimension>(m_segment) ) );
53 }
54
55 template <std::size_t Dimension>
56 inline coordinate_type get_max() const
57 {
58 return boost::numeric_cast<coordinate_type>(
59 (std::max)( geometry::get<0, Dimension>(m_segment),
60 geometry::get<1, Dimension>(m_segment) ) );
61 }
62
63private:
64 Segment const& m_segment;
65};
66
67template <typename Segment, typename Box, typename CSystem>
68struct bounded_view<Segment, Box, segment_tag, box_tag, CSystem>
69{
70public:
71 typedef typename geometry::coordinate_type<Box>::type coordinate_type;
72
73 explicit bounded_view(Segment const& segment)
74 {
75 geometry::envelope(segment, m_box);
76 }
77
78 template <std::size_t Dimension>
79 inline coordinate_type get_min() const
80 {
81 return geometry::get<min_corner, Dimension>(m_box);
82 }
83
84 template <std::size_t Dimension>
85 inline coordinate_type get_max() const
86 {
87 return geometry::get<max_corner, Dimension>(m_box);
88 }
89
90private:
91 Box m_box;
92};
93
94// Box -> Box
95
96template <typename BoxIn, typename Box, typename CSystem>
97struct bounded_view<BoxIn, Box, box_tag, box_tag, CSystem>
98{
99public:
100 typedef typename geometry::coordinate_type<Box>::type coordinate_type;
101
102 explicit bounded_view(BoxIn const& box)
103 : m_box(box)
104 {}
105
106 template <std::size_t Dimension>
107 inline coordinate_type get_min() const
108 {
109 return boost::numeric_cast<coordinate_type>(
110 geometry::get<min_corner, Dimension>(m_box) );
111 }
112
113 template <std::size_t Dimension>
114 inline coordinate_type get_max() const
115 {
116 return boost::numeric_cast<coordinate_type>(
117 geometry::get<max_corner, Dimension>(m_box) );
118 }
119
120private:
121 BoxIn const& m_box;
122};
123
124// Point -> Box
125
126template <typename Point, typename Box, typename CSystem>
127struct bounded_view<Point, Box, point_tag, box_tag, CSystem>
128{
129public:
130 typedef typename geometry::coordinate_type<Box>::type coordinate_type;
131
132 explicit bounded_view(Point const& point)
133 : m_point(point)
134 {}
135
136 template <std::size_t Dimension>
137 inline coordinate_type get_min() const
138 {
139 return boost::numeric_cast<coordinate_type>(
140 geometry::get<Dimension>(m_point) );
141 }
142
143 template <std::size_t Dimension>
144 inline coordinate_type get_max() const
145 {
146 return boost::numeric_cast<coordinate_type>(
147 geometry::get<Dimension>(m_point) );
148 }
149
150private:
151 Point const& m_point;
152};
153
154}} // namespace index::detail
155
156// XXX -> Box
157
158#ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
159namespace traits
160{
161
162template <typename Geometry, typename Box, typename Tag, typename CSystem>
163struct tag< index::detail::bounded_view<Geometry, Box, Tag, box_tag, CSystem> >
164{
165 typedef box_tag type;
166};
167
168template <typename Geometry, typename Box, typename Tag, typename CSystem>
169struct point_type< index::detail::bounded_view<Geometry, Box, Tag, box_tag, CSystem> >
170{
171 typedef typename point_type<Box>::type type;
172};
173
174template <typename Geometry, typename Box, typename Tag, typename CSystem, std::size_t Dimension>
175struct indexed_access<index::detail::bounded_view<Geometry, Box, Tag, box_tag, CSystem>,
176 min_corner, Dimension>
177{
178 typedef index::detail::bounded_view<Geometry, Box, Tag, box_tag, CSystem> box_type;
179 typedef typename geometry::coordinate_type<Box>::type coordinate_type;
180
181 static inline coordinate_type get(box_type const& b)
182 {
183 return b.template get_min<Dimension>();
184 }
185
186 //static inline void set(box_type & b, coordinate_type const& value)
187 //{
188 // BOOST_GEOMETRY_INDEX_ASSERT(false, "unable to modify a box through view");
189 //}
190};
191
192template <typename Geometry, typename Box, typename Tag, typename CSystem, std::size_t Dimension>
193struct indexed_access<index::detail::bounded_view<Geometry, Box, Tag, box_tag, CSystem>,
194 max_corner, Dimension>
195{
196 typedef index::detail::bounded_view<Geometry, Box, Tag, box_tag, CSystem> box_type;
197 typedef typename geometry::coordinate_type<Box>::type coordinate_type;
198
199 static inline coordinate_type get(box_type const& b)
200 {
201 return b.template get_max<Dimension>();
202 }
203
204 //static inline void set(box_type & b, coordinate_type const& value)
205 //{
206 // BOOST_GEOMETRY_INDEX_ASSERT(false, "unable to modify a box through view");
207 //}
208};
209
210} // namespace traits
211#endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
212
213}} // namespace boost::geometry
214
215#endif // BOOST_GEOMETRY_INDEX_DETAIL_BOUNDED_VIEW_HPP
216

source code of boost/boost/geometry/index/detail/bounded_view.hpp