point.hpp 8.6 KB

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