/usr/include/boost/geometry/geometries/adapted
Edit: /usr/include/boost/geometry/geometries/adapted/boost_fusion.hpp (4636B)
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2011-2015 Akira Takahashi
// Copyright (c) 2011-2015 Barend Gehrels, Amsterdam, the Netherlands.
// This file was modified by Oracle on 2015.
// Modifications copyright (c) 2015, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, 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_GEOMETRIES_ADAPTED_FUSION_HPP
#define BOOST_GEOMETRY_GEOMETRIES_ADAPTED_FUSION_HPP
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace boost { namespace geometry
{
namespace fusion_adapt_detail
{
template
struct all_same :
boost::mpl::bool_<
boost::mpl::count_if<
Sequence,
boost::is_same<
typename boost::mpl::front::type,
boost::mpl::_
>
>::value == boost::mpl::size::value
>
{};
template
struct is_coordinate_size : boost::mpl::bool_<
boost::fusion::result_of::size::value == 2 ||
boost::fusion::result_of::size::value == 3> {};
template
struct is_fusion_sequence
: boost::mpl::and_,
fusion_adapt_detail::is_coordinate_size,
fusion_adapt_detail::all_same >
{};
} // namespace fusion_adapt_detail
#ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
namespace traits
{
// Boost Fusion Sequence, 2D or 3D
template
struct coordinate_type
<
Sequence,
typename boost::enable_if
<
fusion_adapt_detail::is_fusion_sequence
>::type
>
{
typedef typename boost::mpl::front::type type;
};
template
struct dimension
<
Sequence,
typename boost::enable_if
<
fusion_adapt_detail::is_fusion_sequence
>::type
> : boost::mpl::size
{};
template
struct access
<
Sequence,
Dimension,
typename boost::enable_if
<
fusion_adapt_detail::is_fusion_sequence
>::type
>
{
typedef typename coordinate_type::type ctype;
static inline ctype get(Sequence const& point)
{
return boost::fusion::at_c(point);
}
template
static inline void set(Sequence& point, CoordinateType const& value)
{
boost::fusion::at_c(point) = value;
}
};
template
struct tag
<
Sequence,
typename boost::enable_if
<
fusion_adapt_detail::is_fusion_sequence
>::type
>
{
typedef point_tag type;
};
} // namespace traits
#endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
}} // namespace boost::geometry
// Convenience registration macro to bind a Fusion sequence to a CS
#define BOOST_GEOMETRY_REGISTER_BOOST_FUSION_CS(CoordinateSystem) \
namespace boost { namespace geometry { namespace traits { \
template \
struct coordinate_system \
< \
Sequence, \
typename boost::enable_if \
< \
fusion_adapt_detail::is_fusion_sequence \
>::type \
> \
{ typedef CoordinateSystem type; }; \
}}}
#endif // BOOST_GEOMETRY_GEOMETRIES_ADAPTED_FUSION_HPP