1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 
3 // Copyright (c) 2010-2012 Barend Gehrels, Amsterdam, the Netherlands.
4 
5 // Use, modification and distribution is subject to the Boost Software License,
6 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8 
9 #ifndef BOOST_GEOMETRY_GEOMETRIES_ADAPTED_BOOST_POLYGON_BOX_HPP
10 #define BOOST_GEOMETRY_GEOMETRIES_ADAPTED_BOOST_POLYGON_BOX_HPP
11 
12 // Adapts Geometries from Boost.Polygon for usage in Boost.Geometry
13 // boost::polygon::rectangle_data -> boost::geometry::box
14 
15 
16 #include <boost/polygon/polygon.hpp>
17 
18 #include <boost/geometry/core/access.hpp>
19 #include <boost/geometry/core/cs.hpp>
20 #include <boost/geometry/core/coordinate_dimension.hpp>
21 #include <boost/geometry/core/coordinate_type.hpp>
22 #include <boost/geometry/core/tags.hpp>
23 
24 
25 namespace boost { namespace geometry
26 {
27 
28 
29 #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
30 namespace traits
31 {
32 
33 
34 template <typename CoordinateType>
35 struct tag<boost::polygon::rectangle_data<CoordinateType> >
36 {
37     typedef box_tag type;
38 };
39 
40 
41 template <typename CoordinateType>
42 struct point_type<boost::polygon::rectangle_data<CoordinateType> >
43 {
44     // Not sure what to do here. Boost.Polygon's rectangle does NOT define its
45     // point_type (but uses it...)
46     typedef boost::polygon::point_data<CoordinateType> type;
47 };
48 
49 
50 template <typename CoordinateType>
51 struct indexed_access
52 <
53     boost::polygon::rectangle_data<CoordinateType>,
54     min_corner, 0
55 >
56 {
57     typedef boost::polygon::rectangle_data<CoordinateType> box_type;
58 
getboost::geometry::traits::indexed_access59     static inline CoordinateType get(box_type const& b)
60     {
61         return boost::polygon::xl(b);
62     }
63 
setboost::geometry::traits::indexed_access64     static inline void set(box_type& b, CoordinateType const& value)
65     {
66         boost::polygon::xl(b, value);
67     }
68 };
69 
70 
71 template <typename CoordinateType>
72 struct indexed_access
73 <
74     boost::polygon::rectangle_data<CoordinateType>,
75     min_corner, 1
76 >
77 {
78     typedef boost::polygon::rectangle_data<CoordinateType> box_type;
79 
getboost::geometry::traits::indexed_access80     static inline CoordinateType get(box_type const& b)
81     {
82         return boost::polygon::yl(b);
83     }
84 
setboost::geometry::traits::indexed_access85     static inline void set(box_type& b, CoordinateType const& value)
86     {
87         boost::polygon::yl(b, value);
88     }
89 };
90 
91 
92 template <typename CoordinateType>
93 struct indexed_access
94 <
95     boost::polygon::rectangle_data<CoordinateType>,
96     max_corner, 0
97 >
98 {
99     typedef boost::polygon::rectangle_data<CoordinateType> box_type;
100 
getboost::geometry::traits::indexed_access101     static inline CoordinateType get(box_type const& b)
102     {
103         return boost::polygon::xh(b);
104     }
105 
setboost::geometry::traits::indexed_access106     static inline void set(box_type& b, CoordinateType const& value)
107     {
108         boost::polygon::xh(b, value);
109     }
110 };
111 
112 
113 template <typename CoordinateType>
114 struct indexed_access
115 <
116     boost::polygon::rectangle_data<CoordinateType>,
117     max_corner, 1
118 >
119 {
120     typedef boost::polygon::rectangle_data<CoordinateType> box_type;
121 
getboost::geometry::traits::indexed_access122     static inline CoordinateType get(box_type const& b)
123     {
124         return boost::polygon::yh(b);
125     }
126 
setboost::geometry::traits::indexed_access127     static inline void set(box_type& b, CoordinateType const& value)
128     {
129         boost::polygon::yh(b, value);
130     }
131 };
132 
133 
134 } // namespace traits
135 #endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
136 
137 
138 }} // namespace boost::geometry
139 
140 
141 #endif // BOOST_GEOMETRY_GEOMETRIES_ADAPTED_BOOST_POLYGON_BOX_HPP
142