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@101: // Copyright (c) 2014 Samuel Debionne, Grenoble, France. 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_HPP Chris@16: #define BOOST_GEOMETRY_ALGORITHMS_ASSIGN_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@101: #include Chris@101: #include Chris@101: #include Chris@101: Chris@16: #include Chris@16: #include Chris@16: #include 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: Chris@16: #include Chris@16: Chris@16: namespace boost { namespace geometry Chris@16: { Chris@16: Chris@16: /*! Chris@16: \brief Assign a range of points to a linestring, ring or polygon Chris@16: \note The point-type of the range might be different from the point-type of the geometry Chris@16: \ingroup assign Chris@16: \tparam Geometry \tparam_geometry Chris@16: \tparam Range \tparam_range_point Chris@16: \param geometry \param_geometry Chris@16: \param range \param_range_point Chris@16: Chris@16: \qbk{ Chris@16: [heading Notes] Chris@16: [note Assign automatically clears the geometry before assigning (use append if you don't want that)] Chris@16: [heading Example] Chris@16: [assign_points] [assign_points_output] Chris@16: Chris@16: [heading See also] Chris@16: \* [link geometry.reference.algorithms.append append] Chris@16: } Chris@16: */ Chris@16: template Chris@16: inline void assign_points(Geometry& geometry, Range const& range) Chris@16: { Chris@16: concept::check(); Chris@16: Chris@16: clear(geometry); Chris@16: geometry::append(geometry, range, -1, 0); Chris@16: } Chris@16: Chris@16: Chris@16: /*! Chris@16: \brief assign to a box inverse infinite Chris@16: \details The assign_inverse function initialize a 2D or 3D box with large coordinates, the Chris@16: min corner is very large, the max corner is very small. This is a convenient starting point to Chris@16: collect the minimum bounding box of a geometry. Chris@16: \ingroup assign Chris@16: \tparam Geometry \tparam_geometry Chris@16: \param geometry \param_geometry Chris@16: Chris@16: \qbk{ Chris@16: [heading Example] Chris@16: [assign_inverse] [assign_inverse_output] Chris@16: Chris@16: [heading See also] Chris@16: \* [link geometry.reference.algorithms.make.make_inverse make_inverse] Chris@16: } Chris@16: */ Chris@16: template Chris@16: inline void assign_inverse(Geometry& geometry) Chris@16: { Chris@16: concept::check(); Chris@16: Chris@16: dispatch::assign_inverse Chris@16: < Chris@16: typename tag::type, Chris@16: Geometry Chris@16: >::apply(geometry); Chris@16: } Chris@16: Chris@16: /*! Chris@16: \brief assign zero values to a box, point Chris@16: \ingroup assign Chris@16: \details The assign_zero function initializes a 2D or 3D point or box with coordinates of zero Chris@16: \tparam Geometry \tparam_geometry Chris@16: \param geometry \param_geometry Chris@16: Chris@16: */ Chris@16: template Chris@16: inline void assign_zero(Geometry& geometry) Chris@16: { Chris@16: concept::check(); Chris@16: Chris@16: dispatch::assign_zero Chris@16: < Chris@16: typename tag::type, Chris@16: Geometry Chris@16: >::apply(geometry); Chris@16: } Chris@16: Chris@16: /*! Chris@101: \brief Assign two coordinates to a geometry (usually a 2D point) Chris@101: \ingroup assign Chris@101: \tparam Geometry \tparam_geometry Chris@101: \tparam Type \tparam_numeric to specify the coordinates Chris@101: \param geometry \param_geometry Chris@101: \param c1 \param_x Chris@101: \param c2 \param_y Chris@101: Chris@101: \qbk{distinguish, 2 coordinate values} Chris@101: \qbk{ Chris@101: [heading Example] Chris@101: [assign_2d_point] [assign_2d_point_output] Chris@101: Chris@101: [heading See also] Chris@101: \* [link geometry.reference.algorithms.make.make_2_2_coordinate_values make] Chris@101: } Chris@101: */ Chris@101: template Chris@101: inline void assign_values(Geometry& geometry, Type const& c1, Type const& c2) Chris@101: { Chris@101: concept::check(); Chris@101: Chris@101: dispatch::assign Chris@101: < Chris@101: typename tag::type, Chris@101: Geometry, Chris@101: geometry::dimension::type::value Chris@101: >::apply(geometry, c1, c2); Chris@101: } Chris@101: Chris@101: /*! Chris@101: \brief Assign three values to a geometry (usually a 3D point) Chris@101: \ingroup assign Chris@101: \tparam Geometry \tparam_geometry Chris@101: \tparam Type \tparam_numeric to specify the coordinates Chris@101: \param geometry \param_geometry Chris@101: \param c1 \param_x Chris@101: \param c2 \param_y Chris@101: \param c3 \param_z Chris@101: Chris@101: \qbk{distinguish, 3 coordinate values} Chris@101: \qbk{ Chris@101: [heading Example] Chris@101: [assign_3d_point] [assign_3d_point_output] Chris@101: Chris@101: [heading See also] Chris@101: \* [link geometry.reference.algorithms.make.make_3_3_coordinate_values make] Chris@101: } Chris@101: */ Chris@101: template Chris@101: inline void assign_values(Geometry& geometry, Chris@101: Type const& c1, Type const& c2, Type const& c3) Chris@101: { Chris@101: concept::check(); Chris@101: Chris@101: dispatch::assign Chris@101: < Chris@101: typename tag::type, Chris@101: Geometry, Chris@101: geometry::dimension::type::value Chris@101: >::apply(geometry, c1, c2, c3); Chris@101: } Chris@101: Chris@101: /*! Chris@101: \brief Assign four values to a geometry (usually a box or segment) Chris@101: \ingroup assign Chris@101: \tparam Geometry \tparam_geometry Chris@101: \tparam Type \tparam_numeric to specify the coordinates Chris@101: \param geometry \param_geometry Chris@101: \param c1 First coordinate (usually x1) Chris@101: \param c2 Second coordinate (usually y1) Chris@101: \param c3 Third coordinate (usually x2) Chris@101: \param c4 Fourth coordinate (usually y2) Chris@101: Chris@101: \qbk{distinguish, 4 coordinate values} Chris@101: */ Chris@101: template Chris@101: inline void assign_values(Geometry& geometry, Chris@101: Type const& c1, Type const& c2, Type const& c3, Type const& c4) Chris@101: { Chris@101: concept::check(); Chris@101: Chris@101: dispatch::assign Chris@101: < Chris@101: typename tag::type, Chris@101: Geometry, Chris@101: geometry::dimension::type::value Chris@101: >::apply(geometry, c1, c2, c3, c4); Chris@101: } Chris@101: Chris@101: Chris@101: Chris@101: namespace resolve_variant Chris@101: { Chris@101: Chris@101: template Chris@101: struct assign Chris@101: { Chris@101: static inline void Chris@101: apply(Geometry1& geometry1, const Geometry2& geometry2) Chris@101: { Chris@101: concept::check(); Chris@101: concept::check(); Chris@101: concept::check_concepts_and_equal_dimensions(); Chris@101: Chris@101: static bool const same_point_order Chris@101: = point_order::value == point_order::value; Chris@101: BOOST_MPL_ASSERT_MSG Chris@101: ( Chris@101: (same_point_order), Chris@101: ASSIGN_IS_NOT_SUPPORTED_FOR_DIFFERENT_POINT_ORDER, Chris@101: (types) Chris@101: ); Chris@101: static bool const same_closure Chris@101: = closure::value == closure::value; Chris@101: BOOST_MPL_ASSERT_MSG Chris@101: ( Chris@101: (same_closure), Chris@101: ASSIGN_IS_NOT_SUPPORTED_FOR_DIFFERENT_CLOSURE, Chris@101: (types) Chris@101: ); Chris@101: Chris@101: dispatch::convert::apply(geometry2, geometry1); Chris@101: } Chris@101: }; Chris@101: Chris@101: Chris@101: template Chris@101: struct assign, Geometry2> Chris@101: { Chris@101: struct visitor: static_visitor Chris@101: { Chris@101: Geometry2 const& m_geometry2; Chris@101: Chris@101: visitor(Geometry2 const& geometry2) Chris@101: : m_geometry2(geometry2) Chris@101: {} Chris@101: Chris@101: template Chris@101: result_type operator()(Geometry1& geometry1) const Chris@101: { Chris@101: return assign Chris@101: < Chris@101: Geometry1, Chris@101: Geometry2 Chris@101: >::apply Chris@101: (geometry1, m_geometry2); Chris@101: } Chris@101: }; Chris@101: Chris@101: static inline void Chris@101: apply(variant& geometry1, Chris@101: Geometry2 const& geometry2) Chris@101: { Chris@101: return apply_visitor(visitor(geometry2), geometry1); Chris@101: } Chris@101: }; Chris@101: Chris@101: Chris@101: template Chris@101: struct assign > Chris@101: { Chris@101: struct visitor: static_visitor Chris@101: { Chris@101: Geometry1& m_geometry1; Chris@101: Chris@101: visitor(Geometry1 const& geometry1) Chris@101: : m_geometry1(geometry1) Chris@101: {} Chris@101: Chris@101: template Chris@101: result_type operator()(Geometry2 const& geometry2) const Chris@101: { Chris@101: return assign Chris@101: < Chris@101: Geometry1, Chris@101: Geometry2 Chris@101: >::apply Chris@101: (m_geometry1, geometry2); Chris@101: } Chris@101: }; Chris@101: Chris@101: static inline void Chris@101: apply(Geometry1& geometry1, Chris@101: variant const& geometry2) Chris@101: { Chris@101: return apply_visitor(visitor(geometry1), geometry2); Chris@101: } Chris@101: }; Chris@101: Chris@101: Chris@101: template Chris@101: struct assign, variant > Chris@101: { Chris@101: struct visitor: static_visitor Chris@101: { Chris@101: template Chris@101: result_type operator()( Chris@101: Geometry1& geometry1, Chris@101: Geometry2 const& geometry2) const Chris@101: { Chris@101: return assign Chris@101: < Chris@101: Geometry1, Chris@101: Geometry2 Chris@101: >::apply Chris@101: (geometry1, geometry2); Chris@101: } Chris@101: }; Chris@101: Chris@101: static inline void Chris@101: apply(variant& geometry1, Chris@101: variant const& geometry2) Chris@101: { Chris@101: return apply_visitor(visitor(), geometry1, geometry2); Chris@101: } Chris@101: }; Chris@101: Chris@101: } // namespace resolve_variant Chris@101: Chris@101: Chris@101: /*! Chris@16: \brief Assigns one geometry to another geometry Chris@16: \details The assign algorithm assigns one geometry, e.g. a BOX, to another Chris@16: geometry, e.g. a RING. This only works if it is possible and applicable. Chris@16: \ingroup assign Chris@16: \tparam Geometry1 \tparam_geometry Chris@16: \tparam Geometry2 \tparam_geometry Chris@16: \param geometry1 \param_geometry (target) Chris@16: \param geometry2 \param_geometry (source) Chris@16: Chris@16: \qbk{ Chris@16: [heading Example] Chris@16: [assign] [assign_output] Chris@16: Chris@16: [heading See also] Chris@16: \* [link geometry.reference.algorithms.convert convert] Chris@16: } Chris@16: */ Chris@16: template Chris@16: inline void assign(Geometry1& geometry1, Geometry2 const& geometry2) Chris@16: { Chris@101: resolve_variant::assign::apply(geometry1, geometry2); Chris@16: } Chris@16: Chris@16: Chris@16: }} // namespace boost::geometry Chris@16: Chris@16: Chris@16: Chris@16: #endif // BOOST_GEOMETRY_ALGORITHMS_ASSIGN_HPP