// Boost.Geometry Index // // This view makes possible to treat some simple primitives as its bounding geometry // e.g. box, nsphere, etc. // // Copyright (c) 2014-2015 Adam Wulkiewicz, Lodz, Poland. // // This file was modified by Oracle on 2019. // Modifications copyright (c) 2019 Oracle and/or its affiliates. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // // 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 #include #include #include namespace boost { namespace geometry { namespace index { namespace detail { template struct bounded_view_base_cs_tag { typedef typename Strategy::cs_tag type; }; template struct bounded_view_base_cs_tag : geometry::cs_tag {}; template < typename Geometry, typename BoundingGeometry, typename Strategy, typename Tag = typename geometry::tag::type, typename BoundingTag = typename geometry::tag::type, typename CSTag = typename bounded_view_base_cs_tag < Geometry, BoundingGeometry, Strategy >::type > struct bounded_view_base { BOOST_MPL_ASSERT_MSG( (false), NOT_IMPLEMENTED_FOR_THOSE_GEOMETRIES, (types)); }; // Segment -> Box template struct bounded_view_base { public: typedef typename geometry::coordinate_type::type coordinate_type; bounded_view_base(Segment const& segment, Strategy const& ) : m_segment(segment) {} template inline coordinate_type get_min() const { return boost::numeric_cast( (std::min)( geometry::get<0, Dimension>(m_segment), geometry::get<1, Dimension>(m_segment) ) ); } template inline coordinate_type get_max() const { return boost::numeric_cast( (std::max)( geometry::get<0, Dimension>(m_segment), geometry::get<1, Dimension>(m_segment) ) ); } private: Segment const& m_segment; }; template struct bounded_view_base { template inline void envelope(Segment const& segment, S const& strategy) { geometry::envelope(segment, m_box, strategy.get_envelope_segment_strategy()); } inline void envelope(Segment const& segment, default_strategy const& ) { geometry::envelope(segment, m_box); } public: typedef typename geometry::coordinate_type::type coordinate_type; bounded_view_base(Segment const& segment, Strategy const& strategy) { envelope(segment, strategy); } template inline coordinate_type get_min() const { return geometry::get(m_box); } template inline coordinate_type get_max() const { return geometry::get(m_box); } private: Box m_box; }; // Box -> Box template struct bounded_view_base { public: typedef typename geometry::coordinate_type::type coordinate_type; bounded_view_base(BoxIn const& box, Strategy const& ) : m_box(box) {} template inline coordinate_type get_min() const { return boost::numeric_cast( geometry::get(m_box) ); } template inline coordinate_type get_max() const { return boost::numeric_cast( geometry::get(m_box) ); } private: BoxIn const& m_box; }; // Point -> Box template struct bounded_view_base { public: typedef typename geometry::coordinate_type::type coordinate_type; bounded_view_base(Point const& point, Strategy const& ) : m_point(point) {} template inline coordinate_type get_min() const { return boost::numeric_cast( geometry::get(m_point) ); } template inline coordinate_type get_max() const { return boost::numeric_cast( geometry::get(m_point) ); } private: Point const& m_point; }; template ::type, typename BoundingTag = typename geometry::tag::type> struct bounded_view : bounded_view_base { typedef bounded_view_base base_type; bounded_view(Geometry const& geometry, Strategy const& strategy) : base_type(geometry, strategy) {} }; template struct bounded_view : bounded_view_base < Geometry, BoundingGeometry, typename strategy::index::services::default_strategy::type > { typedef typename strategy::index::services::default_strategy < Geometry >::type strategy_type; typedef bounded_view_base < Geometry, BoundingGeometry, strategy_type > base_type; explicit bounded_view(Geometry const& geometry, default_strategy const& ) : base_type(geometry, strategy_type()) {} }; }} // namespace index::detail // XXX -> Box #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS namespace traits { template struct tag< index::detail::bounded_view > { typedef box_tag type; }; template struct point_type< index::detail::bounded_view > { typedef typename point_type::type type; }; template struct indexed_access, min_corner, Dimension> { typedef index::detail::bounded_view box_type; typedef typename geometry::coordinate_type::type coordinate_type; static inline coordinate_type get(box_type const& b) { return b.template get_min(); } //static inline void set(box_type & b, coordinate_type const& value) //{ // BOOST_GEOMETRY_INDEX_ASSERT(false, "unable to modify a box through view"); //} }; template struct indexed_access, max_corner, Dimension> { typedef index::detail::bounded_view box_type; typedef typename geometry::coordinate_type::type coordinate_type; static inline coordinate_type get(box_type const& b) { return b.template get_max(); } //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