Chris@16: // Boost.Geometry (aka GGL, Generic Geometry Library) Chris@16: Chris@16: // Copyright (c) 2007-2012 Barend Gehrels, 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_SYM_DIFFERENCE_HPP Chris@16: #define BOOST_GEOMETRY_ALGORITHMS_SYM_DIFFERENCE_HPP 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 sym_difference Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: /*! Chris@16: \brief \brief_calc2{symmetric difference} \brief_strategy Chris@16: \ingroup sym_difference Chris@16: \details \details_calc2{symmetric difference, spatial set theoretic symmetric difference (XOR)} Chris@16: \brief_strategy. \details_insert{sym_difference} Chris@16: \tparam GeometryOut output geometry type, must be specified Chris@16: \tparam Geometry1 \tparam_geometry Chris@16: \tparam Geometry2 \tparam_geometry Chris@16: \tparam Strategy \tparam_strategy_overlay Chris@16: \param geometry1 \param_geometry Chris@16: \param geometry2 \param_geometry Chris@16: \param out \param_out{difference} Chris@16: \param strategy \param_strategy{difference} Chris@16: \return \return_out Chris@16: Chris@16: \qbk{distinguish,with strategy} Chris@16: */ Chris@16: template Chris@16: < Chris@16: typename GeometryOut, Chris@16: typename Geometry1, Chris@16: typename Geometry2, Chris@101: typename RobustPolicy, Chris@16: typename OutputIterator, Chris@16: typename Strategy Chris@16: > Chris@16: inline OutputIterator sym_difference_insert(Geometry1 const& geometry1, Chris@101: Geometry2 const& geometry2, Chris@101: RobustPolicy const& robust_policy, Chris@101: OutputIterator out, Chris@16: Strategy const& strategy) Chris@16: { Chris@16: concept::check(); Chris@16: concept::check(); Chris@16: concept::check(); Chris@16: Chris@16: out = geometry::dispatch::intersection_insert Chris@16: < Chris@16: Geometry1, Geometry2, Chris@16: GeometryOut, Chris@16: overlay_difference, Chris@16: geometry::detail::overlay::do_reverse::value>::value, Chris@16: geometry::detail::overlay::do_reverse::value, true>::value Chris@101: >::apply(geometry1, geometry2, robust_policy, out, strategy); Chris@16: out = geometry::dispatch::intersection_insert Chris@16: < Chris@16: Geometry2, Geometry1, Chris@16: GeometryOut, Chris@16: overlay_difference, Chris@16: geometry::detail::overlay::do_reverse::value>::value, Chris@16: geometry::detail::overlay::do_reverse::value, true>::value, Chris@16: geometry::detail::overlay::do_reverse::value>::value Chris@101: >::apply(geometry2, geometry1, robust_policy, out, strategy); Chris@16: return out; Chris@16: } Chris@16: Chris@16: Chris@16: /*! Chris@16: \brief \brief_calc2{symmetric difference} Chris@16: \ingroup sym_difference Chris@16: \details \details_calc2{symmetric difference, spatial set theoretic symmetric difference (XOR)} Chris@16: \details_insert{sym_difference} Chris@16: \tparam GeometryOut output geometry type, must be specified Chris@16: \tparam Geometry1 \tparam_geometry Chris@16: \tparam Geometry2 \tparam_geometry Chris@16: \param geometry1 \param_geometry Chris@16: \param geometry2 \param_geometry Chris@16: \param out \param_out{difference} Chris@16: \return \return_out Chris@16: Chris@16: */ Chris@16: template Chris@16: < Chris@16: typename GeometryOut, Chris@16: typename Geometry1, Chris@16: typename Geometry2, Chris@101: typename RobustPolicy, Chris@16: typename OutputIterator Chris@16: > Chris@16: inline OutputIterator sym_difference_insert(Geometry1 const& geometry1, Chris@101: Geometry2 const& geometry2, Chris@101: RobustPolicy const& robust_policy, OutputIterator out) Chris@16: { Chris@16: concept::check(); Chris@16: concept::check(); Chris@16: concept::check(); Chris@16: Chris@16: typedef strategy_intersection Chris@16: < Chris@16: typename cs_tag::type, Chris@16: Geometry1, Chris@16: Geometry2, Chris@101: typename geometry::point_type::type, Chris@101: RobustPolicy Chris@16: > strategy_type; Chris@16: Chris@101: return sym_difference_insert(geometry1, geometry2, robust_policy, out, strategy_type()); Chris@16: } Chris@16: Chris@16: }} // namespace detail::sym_difference Chris@16: #endif // DOXYGEN_NO_DETAIL Chris@16: Chris@16: Chris@16: /*! Chris@16: \brief \brief_calc2{symmetric difference} Chris@16: \ingroup sym_difference Chris@16: \details \details_calc2{symmetric difference, spatial set theoretic symmetric difference (XOR)}. Chris@16: \tparam Geometry1 \tparam_geometry Chris@16: \tparam Geometry2 \tparam_geometry Chris@16: \tparam Collection output collection, either a multi-geometry, Chris@16: or a std::vector / std::deque etc Chris@16: \param geometry1 \param_geometry Chris@16: \param geometry2 \param_geometry Chris@16: \param output_collection the output collection Chris@16: Chris@16: \qbk{[include reference/algorithms/sym_difference.qbk]} Chris@16: */ Chris@16: template Chris@16: < Chris@16: typename Geometry1, Chris@16: typename Geometry2, Chris@16: typename Collection Chris@16: > Chris@16: inline void sym_difference(Geometry1 const& geometry1, Chris@16: Geometry2 const& geometry2, Collection& output_collection) Chris@16: { Chris@16: concept::check(); Chris@16: concept::check(); Chris@16: Chris@16: typedef typename boost::range_value::type geometry_out; Chris@16: concept::check(); Chris@16: Chris@101: typedef typename geometry::rescale_overlay_policy_type Chris@101: < Chris@101: Geometry1, Chris@101: Geometry2 Chris@101: >::type rescale_policy_type; Chris@101: Chris@101: rescale_policy_type robust_policy Chris@101: = geometry::get_rescale_policy(geometry1, geometry2); Chris@101: Chris@16: detail::sym_difference::sym_difference_insert( Chris@101: geometry1, geometry2, robust_policy, Chris@16: std::back_inserter(output_collection)); Chris@16: } Chris@16: Chris@16: Chris@16: }} // namespace boost::geometry Chris@16: Chris@16: Chris@16: #endif // BOOST_GEOMETRY_ALGORITHMS_SYM_DIFFERENCE_HPP