Chris@16: // Boost.Geometry (aka GGL, Generic Geometry Library) Chris@16: Chris@101: // Copyright (c) 2011-2015 Akira Takahashi Chris@101: // Copyright (c) 2011-2015 Barend Gehrels, Amsterdam, the Netherlands. Chris@101: Chris@101: // This file was modified by Oracle on 2015. Chris@101: // Modifications copyright (c) 2015, Oracle and/or its affiliates. Chris@101: Chris@101: // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle Chris@16: Chris@16: // Use, modification and distribution is subject to the Boost Software License, Chris@16: // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_GEOMETRY_GEOMETRIES_ADAPTED_FUSION_HPP Chris@16: #define BOOST_GEOMETRY_GEOMETRIES_ADAPTED_FUSION_HPP Chris@16: Chris@16: Chris@16: #include Chris@16: Chris@101: #include Chris@101: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@101: #include Chris@16: Chris@101: #include Chris@101: #include Chris@16: #include Chris@101: #include Chris@16: #include Chris@16: #include Chris@101: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: Chris@16: namespace boost { namespace geometry Chris@16: { Chris@16: Chris@16: namespace fusion_adapt_detail Chris@16: { Chris@16: Chris@16: template Chris@16: struct all_same : Chris@16: boost::mpl::bool_< Chris@16: boost::mpl::count_if< Chris@16: Sequence, Chris@16: boost::is_same< Chris@16: typename boost::mpl::front::type, Chris@16: boost::mpl::_ Chris@16: > Chris@16: >::value == boost::mpl::size::value Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct is_coordinate_size : boost::mpl::bool_< Chris@16: boost::fusion::result_of::size::value == 2 || Chris@16: boost::fusion::result_of::size::value == 3> {}; Chris@16: Chris@16: template Chris@16: struct is_fusion_sequence Chris@101: : boost::mpl::and_, Chris@16: fusion_adapt_detail::is_coordinate_size, Chris@16: fusion_adapt_detail::all_same > Chris@16: {}; Chris@16: Chris@16: Chris@16: } // namespace fusion_adapt_detail Chris@16: Chris@16: Chris@16: #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS Chris@16: namespace traits Chris@16: { Chris@16: Chris@16: // Boost Fusion Sequence, 2D or 3D Chris@16: template Chris@16: struct coordinate_type Chris@16: < Chris@16: Sequence, Chris@16: typename boost::enable_if Chris@16: < Chris@16: fusion_adapt_detail::is_fusion_sequence Chris@16: >::type Chris@16: > Chris@16: { Chris@16: typedef typename boost::mpl::front::type type; Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@16: struct dimension Chris@16: < Chris@16: Sequence, Chris@16: typename boost::enable_if Chris@16: < Chris@16: fusion_adapt_detail::is_fusion_sequence Chris@16: >::type Chris@16: > : boost::mpl::size Chris@16: {}; Chris@16: Chris@16: Chris@16: template Chris@16: struct access Chris@16: < Chris@16: Sequence, Chris@16: Dimension, Chris@16: typename boost::enable_if Chris@16: < Chris@16: fusion_adapt_detail::is_fusion_sequence Chris@16: >::type Chris@16: > Chris@16: { Chris@16: typedef typename coordinate_type::type ctype; Chris@16: Chris@16: static inline ctype get(Sequence const& point) Chris@16: { Chris@16: return boost::fusion::at_c(point); Chris@16: } Chris@16: Chris@16: template Chris@16: static inline void set(Sequence& point, CoordinateType const& value) Chris@16: { Chris@16: boost::fusion::at_c(point) = value; Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@16: struct tag Chris@16: < Chris@16: Sequence, Chris@16: typename boost::enable_if Chris@16: < Chris@16: fusion_adapt_detail::is_fusion_sequence Chris@16: >::type Chris@16: > Chris@16: { Chris@16: typedef point_tag type; Chris@16: }; Chris@16: Chris@16: Chris@16: } // namespace traits Chris@16: Chris@16: #endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS Chris@16: Chris@16: Chris@16: }} // namespace boost::geometry Chris@16: Chris@16: Chris@16: // Convenience registration macro to bind a Fusion sequence to a CS Chris@16: #define BOOST_GEOMETRY_REGISTER_BOOST_FUSION_CS(CoordinateSystem) \ Chris@16: namespace boost { namespace geometry { namespace traits { \ Chris@16: template \ Chris@16: struct coordinate_system \ Chris@16: < \ Chris@16: Sequence, \ Chris@16: typename boost::enable_if \ Chris@16: < \ Chris@16: fusion_adapt_detail::is_fusion_sequence \ Chris@16: >::type \ Chris@16: > \ Chris@16: { typedef CoordinateSystem type; }; \ Chris@16: }}} Chris@16: Chris@16: Chris@16: #endif // BOOST_GEOMETRY_GEOMETRIES_ADAPTED_FUSION_HPP