1 | // Boost.Geometry (aka GGL, Generic Geometry Library) |
2 | |
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. |
6 | |
7 | // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library |
8 | // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. |
9 | |
10 | // Use, modification and distribution is subject to the Boost Software License, |
11 | // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
12 | // http://www.boost.org/LICENSE_1_0.txt) |
13 | |
14 | #ifndef BOOST_GEOMETRY_GEOMETRIES_BOX_HPP |
15 | #define BOOST_GEOMETRY_GEOMETRIES_BOX_HPP |
16 | |
17 | #include <cstddef> |
18 | |
19 | #include <boost/concept/assert.hpp> |
20 | #include <boost/config.hpp> |
21 | |
22 | #include <boost/geometry/algorithms/convert.hpp> |
23 | #include <boost/geometry/geometries/concepts/point_concept.hpp> |
24 | |
25 | #if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |
26 | #include <boost/geometry/core/assert.hpp> |
27 | #endif |
28 | |
29 | |
30 | namespace boost { namespace geometry |
31 | { |
32 | |
33 | namespace model |
34 | { |
35 | |
36 | /*! |
37 | \brief Class box: defines a box made of two describing points |
38 | \ingroup geometries |
39 | \details Box is always described by a min_corner() and a max_corner() point. If another |
40 | rectangle is used, use linear_ring or polygon. |
41 | \note Boxes are for selections and for calculating the envelope of geometries. Not all algorithms |
42 | are implemented for box. Boxes are also used in Spatial Indexes. |
43 | \tparam Point point type. The box takes a point type as template parameter. |
44 | The point type can be any point type. |
45 | It can be 2D but can also be 3D or more dimensional. |
46 | The box can also take a latlong point type as template parameter. |
47 | |
48 | \qbk{[include reference/geometries/box.qbk]} |
49 | \qbk{before.synopsis, [heading Model of]} |
50 | \qbk{before.synopsis, [link geometry.reference.concepts.concept_box Box Concept]} |
51 | */ |
52 | |
53 | template<typename Point> |
54 | class box |
55 | { |
56 | BOOST_CONCEPT_ASSERT( (concept::Point<Point>) ); |
57 | |
58 | public: |
59 | |
60 | #if !defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |
61 | #if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) |
62 | /// \constructor_default_no_init |
63 | box() = default; |
64 | #else |
65 | /// \constructor_default_no_init |
66 | inline box() |
67 | {} |
68 | #endif |
69 | #else // defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |
70 | inline box() |
71 | { |
72 | m_created = 1; |
73 | } |
74 | ~box() |
75 | { |
76 | m_created = 0; |
77 | } |
78 | #endif |
79 | |
80 | /*! |
81 | \brief Constructor taking the minimum corner point and the maximum corner point |
82 | */ |
83 | inline box(Point const& min_corner, Point const& max_corner) |
84 | { |
85 | geometry::convert(min_corner, m_min_corner); |
86 | geometry::convert(max_corner, m_max_corner); |
87 | |
88 | #if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |
89 | m_created = 1; |
90 | #endif |
91 | } |
92 | |
93 | inline Point const& min_corner() const |
94 | { |
95 | #if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |
96 | BOOST_GEOMETRY_ASSERT(m_created == 1); |
97 | #endif |
98 | return m_min_corner; |
99 | } |
100 | inline Point const& max_corner() const |
101 | { |
102 | #if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |
103 | BOOST_GEOMETRY_ASSERT(m_created == 1); |
104 | #endif |
105 | return m_max_corner; |
106 | } |
107 | |
108 | inline Point& min_corner() |
109 | { |
110 | #if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |
111 | BOOST_GEOMETRY_ASSERT(m_created == 1); |
112 | #endif |
113 | return m_min_corner; |
114 | } |
115 | inline Point& max_corner() |
116 | { |
117 | #if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |
118 | BOOST_GEOMETRY_ASSERT(m_created == 1); |
119 | #endif |
120 | return m_max_corner; |
121 | } |
122 | |
123 | private: |
124 | |
125 | Point m_min_corner; |
126 | Point m_max_corner; |
127 | |
128 | #if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) |
129 | int m_created; |
130 | #endif |
131 | }; |
132 | |
133 | |
134 | } // namespace model |
135 | |
136 | |
137 | // Traits specializations for box above |
138 | #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS |
139 | namespace traits |
140 | { |
141 | |
142 | template <typename Point> |
143 | struct tag<model::box<Point> > |
144 | { |
145 | typedef box_tag type; |
146 | }; |
147 | |
148 | template <typename Point> |
149 | struct point_type<model::box<Point> > |
150 | { |
151 | typedef Point type; |
152 | }; |
153 | |
154 | template <typename Point, std::size_t Dimension> |
155 | struct indexed_access<model::box<Point>, min_corner, Dimension> |
156 | { |
157 | typedef typename geometry::coordinate_type<Point>::type coordinate_type; |
158 | |
159 | static inline coordinate_type get(model::box<Point> const& b) |
160 | { |
161 | return geometry::get<Dimension>(b.min_corner()); |
162 | } |
163 | |
164 | static inline void set(model::box<Point>& b, coordinate_type const& value) |
165 | { |
166 | geometry::set<Dimension>(b.min_corner(), value); |
167 | } |
168 | }; |
169 | |
170 | template <typename Point, std::size_t Dimension> |
171 | struct indexed_access<model::box<Point>, max_corner, Dimension> |
172 | { |
173 | typedef typename geometry::coordinate_type<Point>::type coordinate_type; |
174 | |
175 | static inline coordinate_type get(model::box<Point> const& b) |
176 | { |
177 | return geometry::get<Dimension>(b.max_corner()); |
178 | } |
179 | |
180 | static inline void set(model::box<Point>& b, coordinate_type const& value) |
181 | { |
182 | geometry::set<Dimension>(b.max_corner(), value); |
183 | } |
184 | }; |
185 | |
186 | } // namespace traits |
187 | #endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS |
188 | |
189 | }} // namespace boost::geometry |
190 | |
191 | #endif // BOOST_GEOMETRY_GEOMETRIES_BOX_HPP |
192 | |