Mercurial > hg > vamp-build-and-test
view DEPENDENCIES/generic/include/boost/geometry/index/detail/bounded_view.hpp @ 102:f46d142149f5
Whoops, finish that update
author | Chris Cannam |
---|---|
date | Mon, 07 Sep 2015 11:13:41 +0100 |
parents | |
children |
line wrap: on
line source
// Boost.Geometry Index // // This view makes possible to treat some simple primitives as its bounding geometry // e.g. box, nsphere, etc. // // Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland. // // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_GEOMETRY_INDEX_DETAIL_BOUNDED_VIEW_HPP #define BOOST_GEOMETRY_INDEX_DETAIL_BOUNDED_VIEW_HPP namespace boost { namespace geometry { namespace index { namespace detail { template <typename Geometry, typename BoundingGeometry, typename Tag = typename geometry::tag<Geometry>::type, typename BoundingTag = typename geometry::tag<BoundingGeometry>::type> struct bounded_view { BOOST_MPL_ASSERT_MSG( (false), NOT_IMPLEMENTED_FOR_THOSE_GEOMETRIES, (BoundingTag, Tag)); }; // Segment -> Box template <typename Segment, typename Box> struct bounded_view<Segment, Box, segment_tag, box_tag> { public: typedef typename geometry::coordinate_type<Box>::type coordinate_type; explicit bounded_view(Segment const& segment) : m_segment(segment) {} template <std::size_t Dimension> inline coordinate_type get_min() const { return boost::numeric_cast<coordinate_type>( (std::min)( geometry::get<0, Dimension>(m_segment), geometry::get<1, Dimension>(m_segment) ) ); } template <std::size_t Dimension> inline coordinate_type get_max() const { return boost::numeric_cast<coordinate_type>( (std::max)( geometry::get<0, Dimension>(m_segment), geometry::get<1, Dimension>(m_segment) ) ); } private: Segment const& m_segment; }; // Box -> Box template <typename BoxIn, typename Box> struct bounded_view<BoxIn, Box, box_tag, box_tag> { public: typedef typename geometry::coordinate_type<Box>::type coordinate_type; explicit bounded_view(BoxIn const& box) : m_box(box) {} template <std::size_t Dimension> inline coordinate_type get_min() const { return boost::numeric_cast<coordinate_type>( geometry::get<min_corner, Dimension>(m_box) ); } template <std::size_t Dimension> inline coordinate_type get_max() const { return boost::numeric_cast<coordinate_type>( geometry::get<max_corner, Dimension>(m_box) ); } private: BoxIn const& m_box; }; // Point -> Box template <typename Point, typename Box> struct bounded_view<Point, Box, point_tag, box_tag> { public: typedef typename geometry::coordinate_type<Box>::type coordinate_type; explicit bounded_view(Point const& point) : m_point(point) {} template <std::size_t Dimension> inline coordinate_type get_min() const { return boost::numeric_cast<coordinate_type>( geometry::get<Dimension>(m_point) ); } template <std::size_t Dimension> inline coordinate_type get_max() const { return boost::numeric_cast<coordinate_type>( geometry::get<Dimension>(m_point) ); } private: Point const& m_point; }; }} // namespace index::detail // XXX -> Box #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS namespace traits { template <typename Geometry, typename Box, typename Tag> struct tag< index::detail::bounded_view<Geometry, Box, Tag, box_tag> > { typedef box_tag type; }; template <typename Segment, typename Box, typename Tag> struct point_type< index::detail::bounded_view<Segment, Box, Tag, box_tag> > { typedef typename point_type<Box>::type type; }; template <typename Segment, typename Box, typename Tag, std::size_t Dimension> struct indexed_access<index::detail::bounded_view<Segment, Box, Tag, box_tag>, min_corner, Dimension> { typedef index::detail::bounded_view<Segment, Box, Tag, box_tag> box_type; typedef typename geometry::coordinate_type<Box>::type coordinate_type; static inline coordinate_type get(box_type const& b) { return b.template get_min<Dimension>(); } //static inline void set(box_type & b, coordinate_type const& value) //{ // BOOST_GEOMETRY_INDEX_ASSERT(false, "unable to modify a box through view"); //} }; template <typename Segment, typename Box, typename Tag, std::size_t Dimension> struct indexed_access<index::detail::bounded_view<Segment, Box, Tag, box_tag>, max_corner, Dimension> { typedef index::detail::bounded_view<Segment, Box, Tag, box_tag> box_type; typedef typename geometry::coordinate_type<Box>::type coordinate_type; static inline coordinate_type get(box_type const& b) { return b.template get_max<Dimension>(); } //static inline void set(box_type & b, coordinate_type const& value) //{ // BOOST_GEOMETRY_INDEX_ASSERT(false, "unable to modify a box through view"); //} }; } // namespace traits #endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS }} // namespace boost::geometry #endif // BOOST_GEOMETRY_INDEX_DETAIL_BOUNDED_VIEW_HPP