| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398 | // Boost.Geometry (aka GGL, Generic Geometry Library)// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.// This file was modified by Oracle on 2017, 2019.// Modifications copyright (c) 2017, 2019, Oracle and/or its affiliates.// Contributed and/or modified by Adam Wulkiewicz, 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_ALGORITHMS_DIFFERENCE_HPP#define BOOST_GEOMETRY_ALGORITHMS_DIFFERENCE_HPP#include <boost/variant/apply_visitor.hpp>#include <boost/variant/static_visitor.hpp>#include <boost/variant/variant_fwd.hpp>#include <boost/geometry/algorithms/detail/overlay/intersection_insert.hpp>#include <boost/geometry/policies/robustness/get_rescale_policy.hpp>#include <boost/geometry/strategies/default_strategy.hpp>#include <boost/geometry/util/range.hpp>namespace boost { namespace geometry{#ifndef DOXYGEN_NO_DETAILnamespace detail { namespace difference{/*!\brief_calc2{difference} \brief_strategy\ingroup difference\details \details_calc2{difference_insert, spatial set theoretic difference}    \brief_strategy. \details_inserter{difference}\tparam GeometryOut output geometry type, must be specified\tparam Geometry1 \tparam_geometry\tparam Geometry2 \tparam_geometry\tparam OutputIterator output iterator\tparam Strategy \tparam_strategy_overlay\param geometry1 \param_geometry\param geometry2 \param_geometry\param out \param_out{difference}\param strategy \param_strategy{difference}\return \return_out\qbk{distinguish,with strategy}*/template<    typename GeometryOut,    typename Geometry1,    typename Geometry2,    typename OutputIterator,    typename Strategy>inline OutputIterator difference_insert(Geometry1 const& geometry1,                                        Geometry2 const& geometry2,                                        OutputIterator out,                                        Strategy const& strategy){    concepts::check<Geometry1 const>();    concepts::check<Geometry2 const>();    concepts::check<GeometryOut>();    typedef typename geometry::rescale_overlay_policy_type        <            Geometry1,            Geometry2,            typename Strategy::cs_tag        >::type rescale_policy_type;    rescale_policy_type robust_policy            = geometry::get_rescale_policy<rescale_policy_type>(                geometry1, geometry2, strategy);    return geometry::dispatch::intersection_insert        <            Geometry1, Geometry2,            GeometryOut,            overlay_difference,            geometry::detail::overlay::do_reverse<geometry::point_order<Geometry1>::value>::value,            geometry::detail::overlay::do_reverse<geometry::point_order<Geometry2>::value, true>::value        >::apply(geometry1, geometry2, robust_policy, out, strategy);}/*!\brief_calc2{difference}\ingroup difference\details \details_calc2{difference_insert, spatial set theoretic difference}.    \details_insert{difference}\tparam GeometryOut output geometry type, must be specified\tparam Geometry1 \tparam_geometry\tparam Geometry2 \tparam_geometry\tparam OutputIterator output iterator\param geometry1 \param_geometry\param geometry2 \param_geometry\param out \param_out{difference}\return \return_out\qbk{[include reference/algorithms/difference_insert.qbk]}*/template<    typename GeometryOut,    typename Geometry1,    typename Geometry2,    typename OutputIterator>inline OutputIterator difference_insert(Geometry1 const& geometry1,                                        Geometry2 const& geometry2,                                        OutputIterator out){    typedef typename strategy::relate::services::default_strategy        <            Geometry1,            Geometry2        >::type strategy_type;    return difference_insert<GeometryOut>(geometry1, geometry2, out,                                          strategy_type());}}} // namespace detail::difference#endif // DOXYGEN_NO_DETAILnamespace resolve_strategy {struct difference{    template    <        typename Geometry1,        typename Geometry2,        typename Collection,        typename Strategy    >    static inline void apply(Geometry1 const& geometry1,                             Geometry2 const& geometry2,                             Collection & output_collection,                             Strategy const& strategy)    {        typedef typename boost::range_value<Collection>::type geometry_out;        detail::difference::difference_insert<geometry_out>(            geometry1, geometry2,            range::back_inserter(output_collection),            strategy);    }    template    <        typename Geometry1,        typename Geometry2,        typename Collection    >    static inline void apply(Geometry1 const& geometry1,                             Geometry2 const& geometry2,                             Collection & output_collection,                             default_strategy)    {        typedef typename boost::range_value<Collection>::type geometry_out;                detail::difference::difference_insert<geometry_out>(            geometry1, geometry2,            range::back_inserter(output_collection));    }};} // resolve_strategynamespace resolve_variant{    template <typename Geometry1, typename Geometry2>struct difference{    template <typename Collection, typename Strategy>    static inline void apply(Geometry1 const& geometry1,                             Geometry2 const& geometry2,                             Collection& output_collection,                             Strategy const& strategy)    {        resolve_strategy::difference::apply(geometry1, geometry2,                                            output_collection,                                            strategy);    }};template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Geometry2>struct difference<variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Geometry2>{    template <typename Collection, typename Strategy>    struct visitor: static_visitor<>    {        Geometry2 const& m_geometry2;        Collection& m_output_collection;        Strategy const& m_strategy;                visitor(Geometry2 const& geometry2,                Collection& output_collection,                Strategy const& strategy)            : m_geometry2(geometry2)            , m_output_collection(output_collection)            , m_strategy(strategy)        {}                template <typename Geometry1>        void operator()(Geometry1 const& geometry1) const        {            difference                <                    Geometry1,                    Geometry2                >::apply(geometry1, m_geometry2, m_output_collection, m_strategy);        }    };        template <typename Collection, typename Strategy>    static inline void    apply(variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry1,          Geometry2 const& geometry2,          Collection& output_collection,          Strategy const& strategy)    {        boost::apply_visitor(visitor<Collection, Strategy>(geometry2,                                                           output_collection,                                                           strategy),                             geometry1);    }};template <typename Geometry1, BOOST_VARIANT_ENUM_PARAMS(typename T)>struct difference<Geometry1, variant<BOOST_VARIANT_ENUM_PARAMS(T)> >{    template <typename Collection, typename Strategy>    struct visitor: static_visitor<>    {        Geometry1 const& m_geometry1;        Collection& m_output_collection;        Strategy const& m_strategy;                visitor(Geometry1 const& geometry1,                Collection& output_collection,                Strategy const& strategy)            : m_geometry1(geometry1)            , m_output_collection(output_collection)            , m_strategy(strategy)        {}                template <typename Geometry2>        void operator()(Geometry2 const& geometry2) const        {            difference                <                    Geometry1,                    Geometry2                >::apply(m_geometry1, geometry2, m_output_collection, m_strategy);        }    };        template <typename Collection, typename Strategy>    static inline void    apply(Geometry1 const& geometry1,          variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry2,          Collection& output_collection,          Strategy const& strategy)    {        boost::apply_visitor(visitor<Collection, Strategy>(geometry1,                                                           output_collection,                                                           strategy),                             geometry2);    }};template <BOOST_VARIANT_ENUM_PARAMS(typename T1), BOOST_VARIANT_ENUM_PARAMS(typename T2)>struct difference<variant<BOOST_VARIANT_ENUM_PARAMS(T1)>, variant<BOOST_VARIANT_ENUM_PARAMS(T2)> >{    template <typename Collection, typename Strategy>    struct visitor: static_visitor<>    {        Collection& m_output_collection;        Strategy const& m_strategy;                visitor(Collection& output_collection, Strategy const& strategy)            : m_output_collection(output_collection)            , m_strategy(strategy)        {}                template <typename Geometry1, typename Geometry2>        void operator()(Geometry1 const& geometry1,                        Geometry2 const& geometry2) const        {            difference                <                    Geometry1,                    Geometry2                >::apply(geometry1, geometry2, m_output_collection, m_strategy);        }    };        template <typename Collection, typename Strategy>    static inline void    apply(variant<BOOST_VARIANT_ENUM_PARAMS(T1)> const& geometry1,          variant<BOOST_VARIANT_ENUM_PARAMS(T2)> const& geometry2,          Collection& output_collection,          Strategy const& strategy)    {        boost::apply_visitor(visitor<Collection, Strategy>(output_collection,                                                           strategy),                             geometry1, geometry2);    }};    } // namespace resolve_variant/*!\brief_calc2{difference}\ingroup difference\details \details_calc2{difference, spatial set theoretic difference}.\tparam Geometry1 \tparam_geometry\tparam Geometry2 \tparam_geometry\tparam Collection \tparam_output_collection\tparam Strategy \tparam_strategy{Difference}\param geometry1 \param_geometry\param geometry2 \param_geometry\param output_collection the output collection\param strategy \param_strategy{difference}\qbk{distinguish,with strategy}\qbk{[include reference/algorithms/difference.qbk]}*/template<    typename Geometry1,    typename Geometry2,    typename Collection,    typename Strategy>inline void difference(Geometry1 const& geometry1,                       Geometry2 const& geometry2,                       Collection& output_collection,                       Strategy const& strategy){    resolve_variant::difference        <            Geometry1,            Geometry2        >::apply(geometry1, geometry2, output_collection, strategy);}/*!\brief_calc2{difference}\ingroup difference\details \details_calc2{difference, spatial set theoretic difference}.\tparam Geometry1 \tparam_geometry\tparam Geometry2 \tparam_geometry\tparam Collection \tparam_output_collection\param geometry1 \param_geometry\param geometry2 \param_geometry\param output_collection the output collection\qbk{[include reference/algorithms/difference.qbk]}*/template<    typename Geometry1,    typename Geometry2,    typename Collection>inline void difference(Geometry1 const& geometry1,                       Geometry2 const& geometry2,                       Collection& output_collection){    resolve_variant::difference        <            Geometry1,            Geometry2        >::apply(geometry1, geometry2, output_collection, default_strategy());}}} // namespace boost::geometry#endif // BOOST_GEOMETRY_ALGORITHMS_DIFFERENCE_HPP
 |