1 // Boost.Geometry (aka GGL, Generic Geometry Library)
3 // Copyright (c) 2015-2020, Oracle and/or its affiliates.
5 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
6 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
8 // Licensed under the Boost Software License version 1.0.
9 // http://www.boost.org/users/license.html
11 #ifndef BOOST_GEOMETRY_VIEWS_DETAIL_TWO_DIMENSIONAL_VIEW_HPP
12 #define BOOST_GEOMETRY_VIEWS_DETAIL_TWO_DIMENSIONAL_VIEW_HPP
16 #include <boost/geometry/core/access.hpp>
17 #include <boost/geometry/core/coordinate_type.hpp>
18 #include <boost/geometry/core/coordinate_system.hpp>
19 #include <boost/geometry/core/coordinate_dimension.hpp>
20 #include <boost/geometry/core/point_type.hpp>
21 #include <boost/geometry/core/static_assert.hpp>
22 #include <boost/geometry/core/tag.hpp>
23 #include <boost/geometry/core/tags.hpp>
25 #include <boost/geometry/algorithms/not_implemented.hpp>
28 namespace boost { namespace geometry
31 #ifndef DOXYGEN_NO_DETAIL
38 std::size_t Dimension1 = 0,
39 std::size_t Dimension2 = 1,
40 typename Tag = typename tag<Geometry>::type
42 struct two_dimensional_view
43 : not_implemented<Tag>
47 // View that enables to choose two dimensions of a point and see it as
48 // a two-dimensional point
49 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
50 struct two_dimensional_view<Point, Dimension1, Dimension2, point_tag>
52 BOOST_GEOMETRY_STATIC_ASSERT(
53 (Dimension1 < dimension<Point>::value),
54 "Coordinate Dimension1 is larger than Point's dimension.",
55 std::integral_constant<std::size_t, Dimension1>);
57 BOOST_GEOMETRY_STATIC_ASSERT(
58 (Dimension2 < dimension<Point>::value),
59 "Coordinate Dimension2 is larger than Point's dimension.",
60 std::integral_constant<std::size_t, Dimension2>);
62 two_dimensional_view(Point& point)
71 #endif // DOXYGEN_NO_DETAIL
74 #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
79 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
82 geometry::detail::two_dimensional_view
84 Point, Dimension1, Dimension2, point_tag
88 typedef point_tag type;
91 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
92 struct coordinate_system
94 geometry::detail::two_dimensional_view
96 Point, Dimension1, Dimension2, point_tag
98 > : coordinate_system<typename geometry::point_type<Point>::type>
101 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
102 struct coordinate_type
104 geometry::detail::two_dimensional_view
106 Point, Dimension1, Dimension2, point_tag
108 > : coordinate_type<typename geometry::point_type<Point>::type>
111 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
114 geometry::detail::two_dimensional_view
116 Point, Dimension1, Dimension2, point_tag
118 > : std::integral_constant<std::size_t, 2>
121 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
124 geometry::detail::two_dimensional_view
126 Point, Dimension1, Dimension2, point_tag
130 typedef typename geometry::point_type<Point>::type type;
134 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
137 geometry::detail::two_dimensional_view
139 Point, Dimension1, Dimension2, point_tag
144 typedef typename geometry::coordinate_type<Point>::type coordinate_type;
145 typedef geometry::detail::two_dimensional_view
147 Point, Dimension1, Dimension2, point_tag
150 static inline coordinate_type get(view_type const& view)
152 return geometry::get<Dimension1>(view.m_point);
155 static inline void set(view_type& view, coordinate_type const& value)
157 geometry::set<Dimension1>(view.m_point, value);
161 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
164 geometry::detail::two_dimensional_view
166 Point, Dimension1, Dimension2, point_tag
171 typedef typename geometry::coordinate_type<Point>::type coordinate_type;
172 typedef geometry::detail::two_dimensional_view
174 Point, Dimension1, Dimension2, point_tag
177 static inline coordinate_type get(view_type const& view)
179 return geometry::get<Dimension2>(view.m_point);
182 static inline void set(view_type& view, coordinate_type const& value)
184 geometry::set<Dimension2>(view.m_point, value);
189 } // namespace traits
190 #endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
192 }} // namespace boost::geometry
195 #endif // BOOST_GEOMETRY_VIEWS_DETAIL_TWO_DIMENSIONAL_VIEW_HPP