%PDF- %PDF-
| Direktori : /proc/self/root/usr/include/boost/geometry/views/detail/ |
| Current File : //proc/self/root/usr/include/boost/geometry/views/detail/two_dimensional_view.hpp |
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2015, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_VIEWS_DETAIL_TWO_DIMENSIONAL_VIEW_HPP
#define BOOST_GEOMETRY_VIEWS_DETAIL_TWO_DIMENSIONAL_VIEW_HPP
#include <cstddef>
#include <boost/mpl/assert.hpp>
#include <boost/mpl/int.hpp>
#include <boost/geometry/core/access.hpp>
#include <boost/geometry/core/coordinate_type.hpp>
#include <boost/geometry/core/coordinate_system.hpp>
#include <boost/geometry/core/coordinate_dimension.hpp>
#include <boost/geometry/core/point_type.hpp>
#include <boost/geometry/core/tag.hpp>
#include <boost/geometry/core/tags.hpp>
#include <boost/geometry/algorithms/not_implemented.hpp>
namespace boost { namespace geometry
{
#ifndef DOXYGEN_NO_DETAIL
namespace detail
{
template
<
typename Geometry,
std::size_t Dimension1 = 0,
std::size_t Dimension2 = 1,
typename Tag = typename tag<Geometry>::type
>
struct two_dimensional_view
: not_implemented<Tag>
{};
// View that enables to choose two dimensions of a point and see it as
// a two-dimensional point
template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
struct two_dimensional_view<Point, Dimension1, Dimension2, point_tag>
{
BOOST_MPL_ASSERT_MSG(
(Dimension1 < static_cast<std::size_t>(dimension<Point>::value)),
COORDINATE_DIMENSION1_IS_LARGER_THAN_POINT_DIMENSION,
(boost::mpl::int_<Dimension1>));
BOOST_MPL_ASSERT_MSG(
(Dimension2 < static_cast<std::size_t>(dimension<Point>::value)),
COORDINATE_DIMENSION2_IS_LARGER_THAN_POINT_DIMENSION,
(boost::mpl::int_<Dimension2>));
two_dimensional_view(Point& point)
: m_point(point)
{}
Point& m_point;
};
} // namespace detail
#endif // DOXYGEN_NO_DETAIL
#ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
namespace traits
{
template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
struct tag
<
geometry::detail::two_dimensional_view
<
Point, Dimension1, Dimension2, point_tag
>
>
{
typedef point_tag type;
};
template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
struct coordinate_system
<
geometry::detail::two_dimensional_view
<
Point, Dimension1, Dimension2, point_tag
>
> : coordinate_system<typename geometry::point_type<Point>::type>
{};
template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
struct coordinate_type
<
geometry::detail::two_dimensional_view
<
Point, Dimension1, Dimension2, point_tag
>
> : coordinate_type<typename geometry::point_type<Point>::type>
{};
template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
struct dimension
<
geometry::detail::two_dimensional_view
<
Point, Dimension1, Dimension2, point_tag
>
> : boost::mpl::int_<2>
{};
template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
struct point_type
<
geometry::detail::two_dimensional_view
<
Point, Dimension1, Dimension2, point_tag
>
>
{
typedef typename geometry::point_type<Point>::type type;
};
template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
struct access
<
geometry::detail::two_dimensional_view
<
Point, Dimension1, Dimension2, point_tag
>,
0
>
{
typedef typename geometry::coordinate_type<Point>::type coordinate_type;
typedef geometry::detail::two_dimensional_view
<
Point, Dimension1, Dimension2, point_tag
> view_type;
static inline coordinate_type get(view_type const& view)
{
return geometry::get<Dimension1>(view.m_point);
}
static inline void set(view_type& view, coordinate_type const& value)
{
geometry::set<Dimension1>(view.m_point, value);
}
};
template <typename Point, std::size_t Dimension1, std::size_t Dimension2>
struct access
<
geometry::detail::two_dimensional_view
<
Point, Dimension1, Dimension2, point_tag
>,
1
>
{
typedef typename geometry::coordinate_type<Point>::type coordinate_type;
typedef geometry::detail::two_dimensional_view
<
Point, Dimension1, Dimension2, point_tag
> view_type;
static inline coordinate_type get(view_type const& view)
{
return geometry::get<Dimension2>(view.m_point);
}
static inline void set(view_type& view, coordinate_type const& value)
{
geometry::set<Dimension2>(view.m_point, value);
}
};
} // namespace traits
#endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_VIEWS_DETAIL_TWO_DIMENSIONAL_VIEW_HPP