annotate DEPENDENCIES/generic/include/boost/geometry/algorithms/sym_difference.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // Boost.Geometry (aka GGL, Generic Geometry Library)
Chris@16 2
Chris@16 3 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
Chris@16 4
Chris@16 5 // Use, modification and distribution is subject to the Boost Software License,
Chris@16 6 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 7 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8
Chris@16 9 #ifndef BOOST_GEOMETRY_ALGORITHMS_SYM_DIFFERENCE_HPP
Chris@16 10 #define BOOST_GEOMETRY_ALGORITHMS_SYM_DIFFERENCE_HPP
Chris@16 11
Chris@16 12 #include <algorithm>
Chris@16 13
Chris@16 14
Chris@16 15 #include <boost/geometry/algorithms/intersection.hpp>
Chris@16 16
Chris@16 17
Chris@16 18 namespace boost { namespace geometry
Chris@16 19 {
Chris@16 20
Chris@16 21 #ifndef DOXYGEN_NO_DETAIL
Chris@16 22 namespace detail { namespace sym_difference
Chris@16 23 {
Chris@16 24
Chris@16 25
Chris@16 26
Chris@16 27 /*!
Chris@16 28 \brief \brief_calc2{symmetric difference} \brief_strategy
Chris@16 29 \ingroup sym_difference
Chris@16 30 \details \details_calc2{symmetric difference, spatial set theoretic symmetric difference (XOR)}
Chris@16 31 \brief_strategy. \details_insert{sym_difference}
Chris@16 32 \tparam GeometryOut output geometry type, must be specified
Chris@16 33 \tparam Geometry1 \tparam_geometry
Chris@16 34 \tparam Geometry2 \tparam_geometry
Chris@16 35 \tparam Strategy \tparam_strategy_overlay
Chris@16 36 \param geometry1 \param_geometry
Chris@16 37 \param geometry2 \param_geometry
Chris@16 38 \param out \param_out{difference}
Chris@16 39 \param strategy \param_strategy{difference}
Chris@16 40 \return \return_out
Chris@16 41
Chris@16 42 \qbk{distinguish,with strategy}
Chris@16 43 */
Chris@16 44 template
Chris@16 45 <
Chris@16 46 typename GeometryOut,
Chris@16 47 typename Geometry1,
Chris@16 48 typename Geometry2,
Chris@101 49 typename RobustPolicy,
Chris@16 50 typename OutputIterator,
Chris@16 51 typename Strategy
Chris@16 52 >
Chris@16 53 inline OutputIterator sym_difference_insert(Geometry1 const& geometry1,
Chris@101 54 Geometry2 const& geometry2,
Chris@101 55 RobustPolicy const& robust_policy,
Chris@101 56 OutputIterator out,
Chris@16 57 Strategy const& strategy)
Chris@16 58 {
Chris@16 59 concept::check<Geometry1 const>();
Chris@16 60 concept::check<Geometry2 const>();
Chris@16 61 concept::check<GeometryOut>();
Chris@16 62
Chris@16 63 out = geometry::dispatch::intersection_insert
Chris@16 64 <
Chris@16 65 Geometry1, Geometry2,
Chris@16 66 GeometryOut,
Chris@16 67 overlay_difference,
Chris@16 68 geometry::detail::overlay::do_reverse<geometry::point_order<Geometry1>::value>::value,
Chris@16 69 geometry::detail::overlay::do_reverse<geometry::point_order<Geometry2>::value, true>::value
Chris@101 70 >::apply(geometry1, geometry2, robust_policy, out, strategy);
Chris@16 71 out = geometry::dispatch::intersection_insert
Chris@16 72 <
Chris@16 73 Geometry2, Geometry1,
Chris@16 74 GeometryOut,
Chris@16 75 overlay_difference,
Chris@16 76 geometry::detail::overlay::do_reverse<geometry::point_order<Geometry2>::value>::value,
Chris@16 77 geometry::detail::overlay::do_reverse<geometry::point_order<Geometry1>::value, true>::value,
Chris@16 78 geometry::detail::overlay::do_reverse<geometry::point_order<GeometryOut>::value>::value
Chris@101 79 >::apply(geometry2, geometry1, robust_policy, out, strategy);
Chris@16 80 return out;
Chris@16 81 }
Chris@16 82
Chris@16 83
Chris@16 84 /*!
Chris@16 85 \brief \brief_calc2{symmetric difference}
Chris@16 86 \ingroup sym_difference
Chris@16 87 \details \details_calc2{symmetric difference, spatial set theoretic symmetric difference (XOR)}
Chris@16 88 \details_insert{sym_difference}
Chris@16 89 \tparam GeometryOut output geometry type, must be specified
Chris@16 90 \tparam Geometry1 \tparam_geometry
Chris@16 91 \tparam Geometry2 \tparam_geometry
Chris@16 92 \param geometry1 \param_geometry
Chris@16 93 \param geometry2 \param_geometry
Chris@16 94 \param out \param_out{difference}
Chris@16 95 \return \return_out
Chris@16 96
Chris@16 97 */
Chris@16 98 template
Chris@16 99 <
Chris@16 100 typename GeometryOut,
Chris@16 101 typename Geometry1,
Chris@16 102 typename Geometry2,
Chris@101 103 typename RobustPolicy,
Chris@16 104 typename OutputIterator
Chris@16 105 >
Chris@16 106 inline OutputIterator sym_difference_insert(Geometry1 const& geometry1,
Chris@101 107 Geometry2 const& geometry2,
Chris@101 108 RobustPolicy const& robust_policy, OutputIterator out)
Chris@16 109 {
Chris@16 110 concept::check<Geometry1 const>();
Chris@16 111 concept::check<Geometry2 const>();
Chris@16 112 concept::check<GeometryOut>();
Chris@16 113
Chris@16 114 typedef strategy_intersection
Chris@16 115 <
Chris@16 116 typename cs_tag<GeometryOut>::type,
Chris@16 117 Geometry1,
Chris@16 118 Geometry2,
Chris@101 119 typename geometry::point_type<GeometryOut>::type,
Chris@101 120 RobustPolicy
Chris@16 121 > strategy_type;
Chris@16 122
Chris@101 123 return sym_difference_insert<GeometryOut>(geometry1, geometry2, robust_policy, out, strategy_type());
Chris@16 124 }
Chris@16 125
Chris@16 126 }} // namespace detail::sym_difference
Chris@16 127 #endif // DOXYGEN_NO_DETAIL
Chris@16 128
Chris@16 129
Chris@16 130 /*!
Chris@16 131 \brief \brief_calc2{symmetric difference}
Chris@16 132 \ingroup sym_difference
Chris@16 133 \details \details_calc2{symmetric difference, spatial set theoretic symmetric difference (XOR)}.
Chris@16 134 \tparam Geometry1 \tparam_geometry
Chris@16 135 \tparam Geometry2 \tparam_geometry
Chris@16 136 \tparam Collection output collection, either a multi-geometry,
Chris@16 137 or a std::vector<Geometry> / std::deque<Geometry> etc
Chris@16 138 \param geometry1 \param_geometry
Chris@16 139 \param geometry2 \param_geometry
Chris@16 140 \param output_collection the output collection
Chris@16 141
Chris@16 142 \qbk{[include reference/algorithms/sym_difference.qbk]}
Chris@16 143 */
Chris@16 144 template
Chris@16 145 <
Chris@16 146 typename Geometry1,
Chris@16 147 typename Geometry2,
Chris@16 148 typename Collection
Chris@16 149 >
Chris@16 150 inline void sym_difference(Geometry1 const& geometry1,
Chris@16 151 Geometry2 const& geometry2, Collection& output_collection)
Chris@16 152 {
Chris@16 153 concept::check<Geometry1 const>();
Chris@16 154 concept::check<Geometry2 const>();
Chris@16 155
Chris@16 156 typedef typename boost::range_value<Collection>::type geometry_out;
Chris@16 157 concept::check<geometry_out>();
Chris@16 158
Chris@101 159 typedef typename geometry::rescale_overlay_policy_type
Chris@101 160 <
Chris@101 161 Geometry1,
Chris@101 162 Geometry2
Chris@101 163 >::type rescale_policy_type;
Chris@101 164
Chris@101 165 rescale_policy_type robust_policy
Chris@101 166 = geometry::get_rescale_policy<rescale_policy_type>(geometry1, geometry2);
Chris@101 167
Chris@16 168 detail::sym_difference::sym_difference_insert<geometry_out>(
Chris@101 169 geometry1, geometry2, robust_policy,
Chris@16 170 std::back_inserter(output_collection));
Chris@16 171 }
Chris@16 172
Chris@16 173
Chris@16 174 }} // namespace boost::geometry
Chris@16 175
Chris@16 176
Chris@16 177 #endif // BOOST_GEOMETRY_ALGORITHMS_SYM_DIFFERENCE_HPP