1 // Boost.Geometry (aka GGL, Generic Geometry Library)
3 // Copyright (c) 2015, Oracle and/or its affiliates.
5 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
7 // Licensed under the Boost Software License version 1.0.
8 // http://www.boost.org/users/license.html
10 #ifndef BOOST_GEOMETRY_VIEWS_DETAIL_TWO_DIMENSIONAL_VIEW_HPP
11 #define BOOST_GEOMETRY_VIEWS_DETAIL_TWO_DIMENSIONAL_VIEW_HPP
15 #include <boost/mpl/assert.hpp>
16 #include <boost/mpl/int.hpp>
18 #include <boost/geometry/core/access.hpp>
19 #include <boost/geometry/core/coordinate_type.hpp>
20 #include <boost/geometry/core/coordinate_system.hpp>
21 #include <boost/geometry/core/coordinate_dimension.hpp>
22 #include <boost/geometry/core/point_type.hpp>
23 #include <boost/geometry/core/tag.hpp>
24 #include <boost/geometry/core/tags.hpp>
26 #include <boost/geometry/algorithms/not_implemented.hpp>
29 namespace boost { namespace geometry
32 #ifndef DOXYGEN_NO_DETAIL
39 std::size_t Dimension1 = 0,
40 std::size_t Dimension2 = 1,
41 typename Tag = typename tag<Geometry>::type
43 struct two_dimensional_view
44 : not_implemented<Tag>
48 // View that enables to choose two dimensions of a point and see it as
49 // a two-dimensional point
50 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
51 struct two_dimensional_view<Point, Dimension1, Dimension2, point_tag>
54 (Dimension1 < static_cast<std::size_t>(dimension<Point>::value)),
55 COORDINATE_DIMENSION1_IS_LARGER_THAN_POINT_DIMENSION,
56 (boost::mpl::int_<Dimension1>));
59 (Dimension2 < static_cast<std::size_t>(dimension<Point>::value)),
60 COORDINATE_DIMENSION2_IS_LARGER_THAN_POINT_DIMENSION,
61 (boost::mpl::int_<Dimension2>));
63 two_dimensional_view(Point& point)
72 #endif // DOXYGEN_NO_DETAIL
75 #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
80 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
83 geometry::detail::two_dimensional_view
85 Point, Dimension1, Dimension2, point_tag
89 typedef point_tag type;
92 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
93 struct coordinate_system
95 geometry::detail::two_dimensional_view
97 Point, Dimension1, Dimension2, point_tag
99 > : coordinate_system<typename geometry::point_type<Point>::type>
102 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
103 struct coordinate_type
105 geometry::detail::two_dimensional_view
107 Point, Dimension1, Dimension2, point_tag
109 > : coordinate_type<typename geometry::point_type<Point>::type>
112 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
115 geometry::detail::two_dimensional_view
117 Point, Dimension1, Dimension2, point_tag
119 > : boost::mpl::int_<2>
122 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
125 geometry::detail::two_dimensional_view
127 Point, Dimension1, Dimension2, point_tag
131 typedef typename geometry::point_type<Point>::type type;
135 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
138 geometry::detail::two_dimensional_view
140 Point, Dimension1, Dimension2, point_tag
145 typedef typename geometry::coordinate_type<Point>::type coordinate_type;
146 typedef geometry::detail::two_dimensional_view
148 Point, Dimension1, Dimension2, point_tag
151 static inline coordinate_type get(view_type const& view)
153 return geometry::get<Dimension1>(view.m_point);
156 static inline void set(view_type& view, coordinate_type const& value)
158 geometry::set<Dimension1>(view.m_point, value);
162 template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
165 geometry::detail::two_dimensional_view
167 Point, Dimension1, Dimension2, point_tag
172 typedef typename geometry::coordinate_type<Point>::type coordinate_type;
173 typedef geometry::detail::two_dimensional_view
175 Point, Dimension1, Dimension2, point_tag
178 static inline coordinate_type get(view_type const& view)
180 return geometry::get<Dimension2>(view.m_point);
183 static inline void set(view_type& view, coordinate_type const& value)
185 geometry::set<Dimension2>(view.m_point, value);
190 } // namespace traits
191 #endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
193 }} // namespace boost::geometry
196 #endif // BOOST_GEOMETRY_VIEWS_DETAIL_TWO_DIMENSIONAL_VIEW_HPP