/usr/include/boost/geometry/index/detail
Edit: /usr/include/boost/geometry/index/detail/bounded_view.hpp (8764B)
// 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