]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/geometry/geometries/register/point.hpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / boost / geometry / geometries / register / point.hpp
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 // This file was modified by Oracle on 2020.
8 // Modifications copyright (c) 2020, Oracle and/or its affiliates.
9 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
10
11 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
12 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
13
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)
17
18 #ifndef BOOST_GEOMETRY_GEOMETRIES_REGISTER_POINT_HPP
19 #define BOOST_GEOMETRY_GEOMETRIES_REGISTER_POINT_HPP
20
21
22 #include <cstddef>
23 #include <type_traits>
24
25
26 #ifndef DOXYGEN_NO_SPECIALIZATIONS
27
28 // Starting point, specialize basic traits necessary to register a point
29 #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, Dim, CoordinateType, CoordinateSystem) \
30 template<> struct tag<Point> { typedef point_tag type; }; \
31 template<> struct dimension<Point> : std::integral_constant<std::size_t, Dim> {}; \
32 template<> struct coordinate_type<Point> { typedef CoordinateType type; }; \
33 template<> struct coordinate_system<Point> { typedef CoordinateSystem type; };
34
35 // Specialize access class per dimension
36 #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, Dim, CoordinateType, Get, Set) \
37 template<> struct access<Point, Dim> \
38 { \
39 static inline CoordinateType get(Point const& p) { return p. Get; } \
40 static inline void set(Point& p, CoordinateType const& value) { p. Set = value; } \
41 };
42
43 // Const version
44 #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, Dim, CoordinateType, Get) \
45 template<> struct access<Point, Dim> \
46 { \
47 static inline CoordinateType get(Point const& p) { return p. Get; } \
48 };
49
50
51 // Getter/setter version
52 #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, Dim, CoordinateType, Get, Set) \
53 template<> struct access<Point, Dim> \
54 { \
55 static inline CoordinateType get(Point const& p) \
56 { return p. Get (); } \
57 static inline void set(Point& p, CoordinateType const& value) \
58 { p. Set ( value ); } \
59 };
60
61 #endif // DOXYGEN_NO_SPECIALIZATIONS
62
63
64 /*!
65 \brief \brief_macro{2D point type}
66 \ingroup register
67 \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_2D, two-dimensional point type}
68 \param Point \param_macro_type{Point}
69 \param CoordinateType \param_macro_coortype{point}
70 \param CoordinateSystem \param_macro_coorsystem
71 \param Field0 \param_macro_member{\macro_x}
72 \param Field1 \param_macro_member{\macro_y}
73
74 \qbk{[include reference/geometries/register/point.qbk]}
75 */
76 #define BOOST_GEOMETRY_REGISTER_POINT_2D(Point, CoordinateType, CoordinateSystem, Field0, Field1) \
77 namespace boost { namespace geometry { namespace traits { \
78 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 2, CoordinateType, CoordinateSystem) \
79 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 0, CoordinateType, Field0, Field0) \
80 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 1, CoordinateType, Field1, Field1) \
81 }}}
82
83 /*!
84 \brief \brief_macro{3D point type}
85 \ingroup register
86 \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_3D, three-dimensional point type}
87 \param Point \param_macro_type{Point}
88 \param CoordinateType \param_macro_coortype{point}
89 \param CoordinateSystem \param_macro_coorsystem
90 \param Field0 \param_macro_member{\macro_x}
91 \param Field1 \param_macro_member{\macro_y}
92 \param Field2 \param_macro_member{\macro_z}
93 */
94 #define BOOST_GEOMETRY_REGISTER_POINT_3D(Point, CoordinateType, CoordinateSystem, Field0, Field1, Field2) \
95 namespace boost { namespace geometry { namespace traits { \
96 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 3, CoordinateType, CoordinateSystem) \
97 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 0, CoordinateType, Field0, Field0) \
98 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 1, CoordinateType, Field1, Field1) \
99 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 2, CoordinateType, Field2, Field2) \
100 }}}
101
102 /*!
103 \brief \brief_macro{2D point type} \brief_macro_const
104 \ingroup register
105 \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_2D_CONST, two-dimensional point type}. \details_macro_const
106 \param Point \param_macro_type{Point}
107 \param CoordinateType \param_macro_coortype{point}
108 \param CoordinateSystem \param_macro_coorsystem
109 \param Field0 \param_macro_member{\macro_x}
110 \param Field1 \param_macro_member{\macro_y}
111 */
112 #define BOOST_GEOMETRY_REGISTER_POINT_2D_CONST(Point, CoordinateType, CoordinateSystem, Field0, Field1) \
113 namespace boost { namespace geometry { namespace traits { \
114 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 2, CoordinateType, CoordinateSystem) \
115 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 0, CoordinateType, Field0) \
116 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 1, CoordinateType, Field1) \
117 }}}
118
119 /*!
120 \brief \brief_macro{3D point type} \brief_macro_const
121 \ingroup register
122 \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_3D_CONST, three-dimensional point type}. \details_macro_const
123 \param Point \param_macro_type{Point}
124 \param CoordinateType \param_macro_coortype{point}
125 \param CoordinateSystem \param_macro_coorsystem
126 \param Field0 \param_macro_member{\macro_x}
127 \param Field1 \param_macro_member{\macro_y}
128 \param Field2 \param_macro_member{\macro_z}
129 */
130 #define BOOST_GEOMETRY_REGISTER_POINT_3D_CONST(Point, CoordinateType, CoordinateSystem, Field0, Field1, Field2) \
131 namespace boost { namespace geometry { namespace traits { \
132 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 3, CoordinateType, CoordinateSystem) \
133 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 0, CoordinateType, Field0) \
134 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 1, CoordinateType, Field1) \
135 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 2, CoordinateType, Field2) \
136 }}}
137
138 /*!
139 \brief \brief_macro{2D point type} \brief_macro_getset
140 \ingroup register
141 \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET, two-dimensional point type}. \details_macro_getset
142 \param Point \param_macro_type{Point}
143 \param CoordinateType \param_macro_coortype{point}
144 \param CoordinateSystem \param_macro_coorsystem
145 \param Get0 \param_macro_getset{get, \macro_x}
146 \param Get1 \param_macro_getset{get, \macro_y}
147 \param Set0 \param_macro_getset{set, \macro_x}
148 \param Set1 \param_macro_getset{set, \macro_y}
149 */
150 #define BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(Point, CoordinateType, CoordinateSystem, Get0, Get1, Set0, Set1) \
151 namespace boost { namespace geometry { namespace traits { \
152 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 2, CoordinateType, CoordinateSystem) \
153 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 0, CoordinateType, Get0, Set0) \
154 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 1, CoordinateType, Get1, Set1) \
155 }}}
156
157 /*!
158 \brief \brief_macro{3D point type} \brief_macro_getset
159 \ingroup register
160 \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_3D_GET_SET, three-dimensional point type}. \details_macro_getset
161 \param Point \param_macro_type{Point}
162 \param CoordinateType \param_macro_coortype{point}
163 \param CoordinateSystem \param_macro_coorsystem
164 \param Get0 \param_macro_getset{get, \macro_x}
165 \param Get1 \param_macro_getset{get, \macro_y}
166 \param Get2 \param_macro_getset{get, \macro_z}
167 \param Set0 \param_macro_getset{set, \macro_x}
168 \param Set1 \param_macro_getset{set, \macro_y}
169 \param Set2 \param_macro_getset{set, \macro_z}
170 */
171 #define BOOST_GEOMETRY_REGISTER_POINT_3D_GET_SET(Point, CoordinateType, CoordinateSystem, Get0, Get1, Get2, Set0, Set1, Set2) \
172 namespace boost { namespace geometry { namespace traits { \
173 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 3, CoordinateType, CoordinateSystem) \
174 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 0, CoordinateType, Get0, Set0) \
175 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 1, CoordinateType, Get1, Set1) \
176 BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 2, CoordinateType, Get2, Set2) \
177 }}}
178
179 #endif // BOOST_GEOMETRY_GEOMETRIES_REGISTER_POINT_HPP