Chris@16: // Boost.Geometry (aka GGL, Generic Geometry Library) Chris@16: Chris@16: // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. Chris@16: // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. Chris@16: // Copyright (c) 2009-2012 Mateusz Loskot, London, UK. Chris@16: Chris@16: // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library Chris@16: // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. 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_ALGORITHMS_ASSIGN_VALUES_HPP Chris@16: #define BOOST_GEOMETRY_ALGORITHMS_ASSIGN_VALUES_HPP Chris@16: Chris@16: 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: #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: #include Chris@16: Chris@16: Chris@16: #include Chris@16: Chris@16: Chris@16: namespace boost { namespace geometry Chris@16: { Chris@16: Chris@16: #ifndef DOXYGEN_NO_DETAIL Chris@16: namespace detail { namespace assign Chris@16: { Chris@16: Chris@16: Chris@16: template Chris@16: struct initialize Chris@16: { Chris@16: template Chris@16: static inline void apply(Box& box, typename coordinate_type::type const& value) Chris@16: { Chris@16: geometry::set(box, value); Chris@16: initialize::apply(box, value); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@16: struct initialize Chris@16: { Chris@16: template Chris@16: static inline void apply(Box&, typename coordinate_type::type const&) Chris@16: {} Chris@16: }; Chris@16: Chris@16: Chris@16: struct assign_zero_point Chris@16: { Chris@16: template Chris@16: static inline void apply(Point& point) Chris@16: { Chris@16: geometry::assign_value(point, 0); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: struct assign_inverse_box_or_segment Chris@16: { Chris@16: Chris@16: template Chris@16: static inline void apply(BoxOrSegment& geometry) Chris@16: { Chris@16: typedef typename point_type::type point_type; Chris@16: typedef typename coordinate_type::type bound_type; Chris@16: Chris@16: initialize<0, 0, dimension::type::value>::apply( Chris@16: geometry, boost::numeric::bounds::highest() Chris@16: ); Chris@16: initialize<1, 0, dimension::type::value>::apply( Chris@16: geometry, boost::numeric::bounds::lowest() Chris@16: ); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: struct assign_zero_box_or_segment Chris@16: { Chris@16: template Chris@16: static inline void apply(BoxOrSegment& geometry) Chris@16: { Chris@16: typedef typename coordinate_type::type coordinate_type; Chris@16: Chris@16: initialize<0, 0, dimension::type::value>::apply( Chris@16: geometry, coordinate_type() Chris@16: ); Chris@16: initialize<1, 0, dimension::type::value>::apply( Chris@16: geometry, coordinate_type() Chris@16: ); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@16: < Chris@16: std::size_t Corner1, std::size_t Corner2, Chris@16: typename Box, typename Point Chris@16: > Chris@16: inline void assign_box_2d_corner(Box const& box, Point& point) Chris@16: { Chris@16: // Be sure both are 2-Dimensional Chris@16: assert_dimension(); Chris@16: assert_dimension(); Chris@16: Chris@16: // Copy coordinates Chris@16: typedef typename coordinate_type::type coordinate_type; Chris@16: Chris@16: geometry::set<0>(point, boost::numeric_cast(get(box))); Chris@16: geometry::set<1>(point, boost::numeric_cast(get(box))); Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: < Chris@16: typename Geometry, typename Point, Chris@16: std::size_t Index, Chris@16: std::size_t Dimension, std::size_t DimensionCount Chris@16: > Chris@16: struct assign_point_to_index Chris@16: { Chris@16: Chris@16: static inline void apply(Point const& point, Geometry& geometry) Chris@16: { Chris@16: geometry::set(geometry, boost::numeric_cast Chris@16: < Chris@16: typename coordinate_type::type Chris@16: >(geometry::get(point))); Chris@16: Chris@16: assign_point_to_index Chris@16: < Chris@16: Geometry, Point, Index, Dimension + 1, DimensionCount Chris@16: >::apply(point, geometry); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: < Chris@16: typename Geometry, typename Point, Chris@16: std::size_t Index, Chris@16: std::size_t DimensionCount Chris@16: > Chris@16: struct assign_point_to_index Chris@16: < Chris@16: Geometry, Point, Chris@16: Index, Chris@16: DimensionCount, DimensionCount Chris@16: > Chris@16: { Chris@16: static inline void apply(Point const& , Geometry& ) Chris@16: { Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@16: < Chris@16: typename Geometry, typename Point, Chris@16: std::size_t Index, Chris@16: std::size_t Dimension, std::size_t DimensionCount Chris@16: > Chris@16: struct assign_point_from_index Chris@16: { Chris@16: Chris@16: static inline void apply(Geometry const& geometry, Point& point) Chris@16: { Chris@16: geometry::set( point, boost::numeric_cast Chris@16: < Chris@16: typename coordinate_type::type Chris@16: >(geometry::get(geometry))); Chris@16: Chris@16: assign_point_from_index Chris@16: < Chris@16: Geometry, Point, Index, Dimension + 1, DimensionCount Chris@16: >::apply(geometry, point); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: < Chris@16: typename Geometry, typename Point, Chris@16: std::size_t Index, Chris@16: std::size_t DimensionCount Chris@16: > Chris@16: struct assign_point_from_index Chris@16: < Chris@16: Geometry, Point, Chris@16: Index, Chris@16: DimensionCount, DimensionCount Chris@16: > Chris@16: { Chris@16: static inline void apply(Geometry const&, Point&) Chris@16: { Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@16: struct assign_2d_box_or_segment Chris@16: { Chris@16: typedef typename coordinate_type::type coordinate_type; Chris@16: Chris@16: // Here we assign 4 coordinates to a box of segment Chris@16: // -> Most logical is: x1,y1,x2,y2 Chris@16: // In case the user reverses x1/x2 or y1/y2, for a box, we could reverse them (THAT IS NOT IMPLEMENTED) Chris@16: Chris@16: template Chris@16: static inline void apply(Geometry& geometry, Chris@16: Type const& x1, Type const& y1, Type const& x2, Type const& y2) Chris@16: { Chris@16: geometry::set<0, 0>(geometry, boost::numeric_cast(x1)); Chris@16: geometry::set<0, 1>(geometry, boost::numeric_cast(y1)); Chris@16: geometry::set<1, 0>(geometry, boost::numeric_cast(x2)); Chris@16: geometry::set<1, 1>(geometry, boost::numeric_cast(y2)); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: }} // namespace detail::assign Chris@16: #endif // DOXYGEN_NO_DETAIL Chris@16: Chris@16: #ifndef DOXYGEN_NO_DISPATCH Chris@16: namespace dispatch Chris@16: { Chris@16: Chris@16: template Chris@16: struct assign Chris@16: { Chris@16: BOOST_MPL_ASSERT_MSG Chris@16: ( Chris@16: false, NOT_OR_NOT_YET_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE Chris@16: , (types) Chris@16: ); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct assign Chris@16: { Chris@16: typedef typename coordinate_type::type coordinate_type; Chris@16: Chris@16: template Chris@16: static inline void apply(Point& point, T const& c1, T const& c2) Chris@16: { Chris@16: set<0>(point, boost::numeric_cast(c1)); Chris@16: set<1>(point, boost::numeric_cast(c2)); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct assign Chris@16: { Chris@16: typedef typename coordinate_type::type coordinate_type; Chris@16: Chris@16: template Chris@16: static inline void apply(Point& point, T const& c1, T const& c2, T const& c3) Chris@16: { Chris@16: set<0>(point, boost::numeric_cast(c1)); Chris@16: set<1>(point, boost::numeric_cast(c2)); Chris@16: set<2>(point, boost::numeric_cast(c3)); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct assign Chris@16: : detail::assign::assign_2d_box_or_segment Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct assign Chris@16: : detail::assign::assign_2d_box_or_segment Chris@16: {}; Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct assign_zero {}; Chris@16: Chris@16: Chris@16: template Chris@16: struct assign_zero Chris@16: : detail::assign::assign_zero_point Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct assign_zero Chris@16: : detail::assign::assign_zero_box_or_segment Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct assign_zero Chris@16: : detail::assign::assign_zero_box_or_segment Chris@16: {}; Chris@16: Chris@16: Chris@16: template Chris@16: struct assign_inverse {}; Chris@16: Chris@16: template Chris@16: struct assign_inverse Chris@16: : detail::assign::assign_inverse_box_or_segment Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct assign_inverse Chris@16: : detail::assign::assign_inverse_box_or_segment Chris@16: {}; Chris@16: Chris@16: Chris@16: } // namespace dispatch Chris@16: #endif // DOXYGEN_NO_DISPATCH Chris@16: Chris@16: }} // namespace boost::geometry Chris@16: Chris@16: Chris@16: #endif // BOOST_GEOMETRY_ALGORITHMS_ASSIGN_VALUES_HPP