point.hpp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
  6. // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
  7. // Use, modification and distribution is subject to the Boost Software License,
  8. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  9. // http://www.boost.org/LICENSE_1_0.txt)
  10. #ifndef BOOST_GEOMETRY_GEOMETRIES_REGISTER_POINT_HPP
  11. #define BOOST_GEOMETRY_GEOMETRIES_REGISTER_POINT_HPP
  12. #include <cstddef>
  13. #ifndef DOXYGEN_NO_SPECIALIZATIONS
  14. // Starting point, specialize basic traits necessary to register a point
  15. #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, Dim, CoordinateType, CoordinateSystem) \
  16. template<> struct tag<Point> { typedef point_tag type; }; \
  17. template<> struct dimension<Point> : boost::mpl::int_<Dim> {}; \
  18. template<> struct coordinate_type<Point> { typedef CoordinateType type; }; \
  19. template<> struct coordinate_system<Point> { typedef CoordinateSystem type; };
  20. // Specialize access class per dimension
  21. #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, Dim, CoordinateType, Get, Set) \
  22. template<> struct access<Point, Dim> \
  23. { \
  24. static inline CoordinateType get(Point const& p) { return p. Get; } \
  25. static inline void set(Point& p, CoordinateType const& value) { p. Set = value; } \
  26. };
  27. // Const version
  28. #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, Dim, CoordinateType, Get) \
  29. template<> struct access<Point, Dim> \
  30. { \
  31. static inline CoordinateType get(Point const& p) { return p. Get; } \
  32. };
  33. // Getter/setter version
  34. #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, Dim, CoordinateType, Get, Set) \
  35. template<> struct access<Point, Dim> \
  36. { \
  37. static inline CoordinateType get(Point const& p) \
  38. { return p. Get (); } \
  39. static inline void set(Point& p, CoordinateType const& value) \
  40. { p. Set ( value ); } \
  41. };
  42. #endif // DOXYGEN_NO_SPECIALIZATIONS
  43. /*!
  44. \brief \brief_macro{2D point type}
  45. \ingroup register
  46. \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_2D, two-dimensional point type}
  47. \param Point \param_macro_type{Point}
  48. \param CoordinateType \param_macro_coortype{point}
  49. \param CoordinateSystem \param_macro_coorsystem
  50. \param Field0 \param_macro_member{\macro_x}
  51. \param Field1 \param_macro_member{\macro_y}
  52. \qbk{[include reference/geometries/register/point.qbk]}
  53. */
  54. #define BOOST_GEOMETRY_REGISTER_POINT_2D(Point, CoordinateType, CoordinateSystem, Field0, Field1) \
  55. namespace boost { namespace geometry { namespace traits { \
  56. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 2, CoordinateType, CoordinateSystem) \
  57. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 0, CoordinateType, Field0, Field0) \
  58. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 1, CoordinateType, Field1, Field1) \
  59. }}}
  60. /*!
  61. \brief \brief_macro{3D point type}
  62. \ingroup register
  63. \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_3D, three-dimensional point type}
  64. \param Point \param_macro_type{Point}
  65. \param CoordinateType \param_macro_coortype{point}
  66. \param CoordinateSystem \param_macro_coorsystem
  67. \param Field0 \param_macro_member{\macro_x}
  68. \param Field1 \param_macro_member{\macro_y}
  69. \param Field2 \param_macro_member{\macro_z}
  70. */
  71. #define BOOST_GEOMETRY_REGISTER_POINT_3D(Point, CoordinateType, CoordinateSystem, Field0, Field1, Field2) \
  72. namespace boost { namespace geometry { namespace traits { \
  73. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 3, CoordinateType, CoordinateSystem) \
  74. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 0, CoordinateType, Field0, Field0) \
  75. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 1, CoordinateType, Field1, Field1) \
  76. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 2, CoordinateType, Field2, Field2) \
  77. }}}
  78. /*!
  79. \brief \brief_macro{2D point type} \brief_macro_const
  80. \ingroup register
  81. \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_2D_CONST, two-dimensional point type}. \details_macro_const
  82. \param Point \param_macro_type{Point}
  83. \param CoordinateType \param_macro_coortype{point}
  84. \param CoordinateSystem \param_macro_coorsystem
  85. \param Field0 \param_macro_member{\macro_x}
  86. \param Field1 \param_macro_member{\macro_y}
  87. */
  88. #define BOOST_GEOMETRY_REGISTER_POINT_2D_CONST(Point, CoordinateType, CoordinateSystem, Field0, Field1) \
  89. namespace boost { namespace geometry { namespace traits { \
  90. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 2, CoordinateType, CoordinateSystem) \
  91. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 0, CoordinateType, Field0) \
  92. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 1, CoordinateType, Field1) \
  93. }}}
  94. /*!
  95. \brief \brief_macro{3D point type} \brief_macro_const
  96. \ingroup register
  97. \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_3D_CONST, three-dimensional point type}. \details_macro_const
  98. \param Point \param_macro_type{Point}
  99. \param CoordinateType \param_macro_coortype{point}
  100. \param CoordinateSystem \param_macro_coorsystem
  101. \param Field0 \param_macro_member{\macro_x}
  102. \param Field1 \param_macro_member{\macro_y}
  103. \param Field2 \param_macro_member{\macro_z}
  104. */
  105. #define BOOST_GEOMETRY_REGISTER_POINT_3D_CONST(Point, CoordinateType, CoordinateSystem, Field0, Field1, Field2) \
  106. namespace boost { namespace geometry { namespace traits { \
  107. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 3, CoordinateType, CoordinateSystem) \
  108. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 0, CoordinateType, Field0) \
  109. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 1, CoordinateType, Field1) \
  110. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 2, CoordinateType, Field2) \
  111. }}}
  112. /*!
  113. \brief \brief_macro{2D point type} \brief_macro_getset
  114. \ingroup register
  115. \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET, two-dimensional point type}. \details_macro_getset
  116. \param Point \param_macro_type{Point}
  117. \param CoordinateType \param_macro_coortype{point}
  118. \param CoordinateSystem \param_macro_coorsystem
  119. \param Get0 \param_macro_getset{get, \macro_x}
  120. \param Get1 \param_macro_getset{get, \macro_y}
  121. \param Set0 \param_macro_getset{set, \macro_x}
  122. \param Set1 \param_macro_getset{set, \macro_y}
  123. */
  124. #define BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(Point, CoordinateType, CoordinateSystem, Get0, Get1, Set0, Set1) \
  125. namespace boost { namespace geometry { namespace traits { \
  126. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 2, CoordinateType, CoordinateSystem) \
  127. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 0, CoordinateType, Get0, Set0) \
  128. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 1, CoordinateType, Get1, Set1) \
  129. }}}
  130. /*!
  131. \brief \brief_macro{3D point type} \brief_macro_getset
  132. \ingroup register
  133. \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_3D_GET_SET, three-dimensional point type}. \details_macro_getset
  134. \param Point \param_macro_type{Point}
  135. \param CoordinateType \param_macro_coortype{point}
  136. \param CoordinateSystem \param_macro_coorsystem
  137. \param Get0 \param_macro_getset{get, \macro_x}
  138. \param Get1 \param_macro_getset{get, \macro_y}
  139. \param Get2 \param_macro_getset{get, \macro_z}
  140. \param Set0 \param_macro_getset{set, \macro_x}
  141. \param Set1 \param_macro_getset{set, \macro_y}
  142. \param Set2 \param_macro_getset{set, \macro_z}
  143. */
  144. #define BOOST_GEOMETRY_REGISTER_POINT_3D_GET_SET(Point, CoordinateType, CoordinateSystem, Get0, Get1, Get2, Set0, Set1, Set2) \
  145. namespace boost { namespace geometry { namespace traits { \
  146. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 3, CoordinateType, CoordinateSystem) \
  147. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 0, CoordinateType, Get0, Set0) \
  148. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 1, CoordinateType, Get1, Set1) \
  149. BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 2, CoordinateType, Get2, Set2) \
  150. }}}
  151. #endif // BOOST_GEOMETRY_GEOMETRIES_REGISTER_POINT_HPP