1 // Boost.Geometry (aka GGL, Generic Geometry Library) 2 3 // Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands. 4 // Copyright (c) 2008-2015 Bruno Lalande, Paris, France. 5 // Copyright (c) 2009-2015 Mateusz Loskot, London, UK. 6 // Copyright (c) 2014-2015 Adam Wulkiewicz, Lodz, Poland 7 8 // This file was modified by Oracle on 2015. 9 // Modifications copyright (c) 2015, Oracle and/or its affiliates. 10 11 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle 12 13 // Use, modification and distribution is subject to the Boost Software License, 14 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 15 // http://www.boost.org/LICENSE_1_0.txt) 16 17 #ifndef BOOST_GEOMETRY_VIEWS_DETAIL_INDEXED_POINT_VIEW_HPP 18 #define BOOST_GEOMETRY_VIEWS_DETAIL_INDEXED_POINT_VIEW_HPP 19 20 #include <cstddef> 21 22 #include <boost/geometry/core/access.hpp> 23 #include <boost/geometry/core/coordinate_type.hpp> 24 #include <boost/geometry/core/coordinate_system.hpp> 25 #include <boost/geometry/core/coordinate_dimension.hpp> 26 #include <boost/geometry/util/math.hpp> 27 28 namespace boost { namespace geometry 29 { 30 31 namespace detail 32 { 33 34 template <typename Geometry, std::size_t Index> 35 class indexed_point_view 36 { 37 indexed_point_view & operator=(indexed_point_view const&); 38 39 public: 40 typedef typename geometry::point_type<Geometry>::type point_type; 41 typedef typename geometry::coordinate_type<Geometry>::type coordinate_type; 42 indexed_point_view(Geometry & geometry)43 indexed_point_view(Geometry & geometry) 44 : m_geometry(geometry) 45 {} 46 47 template <std::size_t Dimension> get() const48 inline coordinate_type get() const 49 { 50 return geometry::get<Index, Dimension>(m_geometry); 51 } 52 53 template <std::size_t Dimension> set(coordinate_type const & value)54 inline void set(coordinate_type const& value) 55 { 56 geometry::set<Index, Dimension>(m_geometry, value); 57 } 58 59 private: 60 Geometry & m_geometry; 61 }; 62 63 } 64 65 #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS 66 namespace traits 67 { 68 69 template <typename Geometry, std::size_t Index> 70 struct tag< geometry::detail::indexed_point_view<Geometry, Index> > 71 { 72 typedef point_tag type; 73 }; 74 75 template <typename Geometry, std::size_t Index> 76 struct coordinate_type< geometry::detail::indexed_point_view<Geometry, Index> > 77 { 78 typedef typename geometry::coordinate_type<Geometry>::type type; 79 }; 80 81 template <typename Geometry, std::size_t Index> 82 struct coordinate_system 83 < 84 geometry::detail::indexed_point_view<Geometry, Index> 85 > 86 { 87 typedef typename geometry::coordinate_system<Geometry>::type type; 88 }; 89 90 template <typename Geometry, std::size_t Index> 91 struct dimension< geometry::detail::indexed_point_view<Geometry, Index> > 92 : geometry::dimension<Geometry> 93 {}; 94 95 template<typename Geometry, std::size_t Index, std::size_t Dimension> 96 struct access 97 < 98 geometry::detail::indexed_point_view<Geometry, Index>, Dimension 99 > 100 { 101 typedef typename geometry::coordinate_type<Geometry>::type coordinate_type; 102 getboost::geometry::traits::access103 static inline coordinate_type get( 104 geometry::detail::indexed_point_view<Geometry, Index> const& p) 105 { 106 return p.template get<Dimension>(); 107 } 108 setboost::geometry::traits::access109 static inline void set( 110 geometry::detail::indexed_point_view<Geometry, Index> & p, 111 coordinate_type const& value) 112 { 113 p.template set<Dimension>(value); 114 } 115 }; 116 117 } // namespace traits 118 #endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS 119 120 }} // namespace boost::geometry 121 122 123 #endif // BOOST_GEOMETRY_VIEWS_DETAIL_INDEXED_POINT_VIEW_HPP 124