two_dimensional_view.hpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Copyright (c) 2015, Oracle and/or its affiliates.
  3. // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
  4. // Licensed under the Boost Software License version 1.0.
  5. // http://www.boost.org/users/license.html
  6. #ifndef BOOST_GEOMETRY_VIEWS_DETAIL_TWO_DIMENSIONAL_VIEW_HPP
  7. #define BOOST_GEOMETRY_VIEWS_DETAIL_TWO_DIMENSIONAL_VIEW_HPP
  8. #include <cstddef>
  9. #include <boost/mpl/assert.hpp>
  10. #include <boost/mpl/int.hpp>
  11. #include <boost/geometry/core/access.hpp>
  12. #include <boost/geometry/core/coordinate_type.hpp>
  13. #include <boost/geometry/core/coordinate_system.hpp>
  14. #include <boost/geometry/core/coordinate_dimension.hpp>
  15. #include <boost/geometry/core/point_type.hpp>
  16. #include <boost/geometry/core/tag.hpp>
  17. #include <boost/geometry/core/tags.hpp>
  18. #include <boost/geometry/algorithms/not_implemented.hpp>
  19. namespace boost { namespace geometry
  20. {
  21. #ifndef DOXYGEN_NO_DETAIL
  22. namespace detail
  23. {
  24. template
  25. <
  26. typename Geometry,
  27. std::size_t Dimension1 = 0,
  28. std::size_t Dimension2 = 1,
  29. typename Tag = typename tag<Geometry>::type
  30. >
  31. struct two_dimensional_view
  32. : not_implemented<Tag>
  33. {};
  34. // View that enables to choose two dimensions of a point and see it as
  35. // a two-dimensional point
  36. template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
  37. struct two_dimensional_view<Point, Dimension1, Dimension2, point_tag>
  38. {
  39. BOOST_MPL_ASSERT_MSG(
  40. (Dimension1 < static_cast<std::size_t>(dimension<Point>::value)),
  41. COORDINATE_DIMENSION1_IS_LARGER_THAN_POINT_DIMENSION,
  42. (boost::mpl::int_<Dimension1>));
  43. BOOST_MPL_ASSERT_MSG(
  44. (Dimension2 < static_cast<std::size_t>(dimension<Point>::value)),
  45. COORDINATE_DIMENSION2_IS_LARGER_THAN_POINT_DIMENSION,
  46. (boost::mpl::int_<Dimension2>));
  47. two_dimensional_view(Point& point)
  48. : m_point(point)
  49. {}
  50. Point& m_point;
  51. };
  52. } // namespace detail
  53. #endif // DOXYGEN_NO_DETAIL
  54. #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
  55. namespace traits
  56. {
  57. template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
  58. struct tag
  59. <
  60. geometry::detail::two_dimensional_view
  61. <
  62. Point, Dimension1, Dimension2, point_tag
  63. >
  64. >
  65. {
  66. typedef point_tag type;
  67. };
  68. template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
  69. struct coordinate_system
  70. <
  71. geometry::detail::two_dimensional_view
  72. <
  73. Point, Dimension1, Dimension2, point_tag
  74. >
  75. > : coordinate_system<typename geometry::point_type<Point>::type>
  76. {};
  77. template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
  78. struct coordinate_type
  79. <
  80. geometry::detail::two_dimensional_view
  81. <
  82. Point, Dimension1, Dimension2, point_tag
  83. >
  84. > : coordinate_type<typename geometry::point_type<Point>::type>
  85. {};
  86. template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
  87. struct dimension
  88. <
  89. geometry::detail::two_dimensional_view
  90. <
  91. Point, Dimension1, Dimension2, point_tag
  92. >
  93. > : boost::mpl::int_<2>
  94. {};
  95. template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
  96. struct point_type
  97. <
  98. geometry::detail::two_dimensional_view
  99. <
  100. Point, Dimension1, Dimension2, point_tag
  101. >
  102. >
  103. {
  104. typedef typename geometry::point_type<Point>::type type;
  105. };
  106. template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
  107. struct access
  108. <
  109. geometry::detail::two_dimensional_view
  110. <
  111. Point, Dimension1, Dimension2, point_tag
  112. >,
  113. 0
  114. >
  115. {
  116. typedef typename geometry::coordinate_type<Point>::type coordinate_type;
  117. typedef geometry::detail::two_dimensional_view
  118. <
  119. Point, Dimension1, Dimension2, point_tag
  120. > view_type;
  121. static inline coordinate_type get(view_type const& view)
  122. {
  123. return geometry::get<Dimension1>(view.m_point);
  124. }
  125. static inline void set(view_type& view, coordinate_type const& value)
  126. {
  127. geometry::set<Dimension1>(view.m_point, value);
  128. }
  129. };
  130. template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
  131. struct access
  132. <
  133. geometry::detail::two_dimensional_view
  134. <
  135. Point, Dimension1, Dimension2, point_tag
  136. >,
  137. 1
  138. >
  139. {
  140. typedef typename geometry::coordinate_type<Point>::type coordinate_type;
  141. typedef geometry::detail::two_dimensional_view
  142. <
  143. Point, Dimension1, Dimension2, point_tag
  144. > view_type;
  145. static inline coordinate_type get(view_type const& view)
  146. {
  147. return geometry::get<Dimension2>(view.m_point);
  148. }
  149. static inline void set(view_type& view, coordinate_type const& value)
  150. {
  151. geometry::set<Dimension2>(view.m_point, value);
  152. }
  153. };
  154. } // namespace traits
  155. #endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
  156. }} // namespace boost::geometry
  157. #endif // BOOST_GEOMETRY_VIEWS_DETAIL_TWO_DIMENSIONAL_VIEW_HPP