annotate DEPENDENCIES/generic/include/boost/geometry/algorithms/append.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@101 3 // Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
Chris@101 4 // Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
Chris@101 5 // Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
Chris@101 6
Chris@101 7 // This file was modified by Oracle on 2014.
Chris@101 8 // Modifications copyright (c) 2014, Oracle and/or its affiliates.
Chris@101 9
Chris@101 10 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
Chris@101 11 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
Chris@16 12
Chris@16 13 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
Chris@16 14 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
Chris@16 15
Chris@16 16 // Use, modification and distribution is subject to the Boost Software License,
Chris@16 17 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 18 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 19
Chris@16 20 #ifndef BOOST_GEOMETRY_ALGORITHMS_APPEND_HPP
Chris@16 21 #define BOOST_GEOMETRY_ALGORITHMS_APPEND_HPP
Chris@16 22
Chris@16 23
Chris@101 24 #include <boost/range.hpp>
Chris@101 25
Chris@101 26 #include <boost/variant/apply_visitor.hpp>
Chris@101 27 #include <boost/variant/static_visitor.hpp>
Chris@101 28 #include <boost/variant/variant_fwd.hpp>
Chris@101 29
Chris@16 30 #include <boost/geometry/algorithms/num_interior_rings.hpp>
Chris@16 31 #include <boost/geometry/algorithms/detail/convert_point_to_point.hpp>
Chris@16 32 #include <boost/geometry/core/access.hpp>
Chris@16 33 #include <boost/geometry/core/mutable_range.hpp>
Chris@16 34 #include <boost/geometry/core/point_type.hpp>
Chris@16 35 #include <boost/geometry/core/tags.hpp>
Chris@16 36 #include <boost/geometry/geometries/concepts/check.hpp>
Chris@16 37 #include <boost/geometry/geometries/variant.hpp>
Chris@101 38 #include <boost/geometry/util/range.hpp>
Chris@16 39
Chris@16 40
Chris@16 41 namespace boost { namespace geometry
Chris@16 42 {
Chris@16 43
Chris@16 44
Chris@16 45 #ifndef DOXYGEN_NO_DETAIL
Chris@16 46 namespace detail { namespace append
Chris@16 47 {
Chris@16 48
Chris@16 49 template <typename Geometry, typename Point>
Chris@16 50 struct append_no_action
Chris@16 51 {
Chris@16 52 static inline void apply(Geometry& , Point const& ,
Chris@16 53 int = 0, int = 0)
Chris@16 54 {
Chris@16 55 }
Chris@16 56 };
Chris@16 57
Chris@16 58 template <typename Geometry, typename Point>
Chris@16 59 struct append_point
Chris@16 60 {
Chris@16 61 static inline void apply(Geometry& geometry, Point const& point,
Chris@16 62 int = 0, int = 0)
Chris@16 63 {
Chris@16 64 typename geometry::point_type<Geometry>::type copy;
Chris@16 65 geometry::detail::conversion::convert_point_to_point(point, copy);
Chris@16 66 traits::push_back<Geometry>::apply(geometry, copy);
Chris@16 67 }
Chris@16 68 };
Chris@16 69
Chris@16 70
Chris@16 71 template <typename Geometry, typename Range>
Chris@16 72 struct append_range
Chris@16 73 {
Chris@16 74 typedef typename boost::range_value<Range>::type point_type;
Chris@16 75
Chris@16 76 static inline void apply(Geometry& geometry, Range const& range,
Chris@16 77 int = 0, int = 0)
Chris@16 78 {
Chris@16 79 for (typename boost::range_iterator<Range const>::type
Chris@16 80 it = boost::begin(range);
Chris@16 81 it != boost::end(range);
Chris@16 82 ++it)
Chris@16 83 {
Chris@16 84 append_point<Geometry, point_type>::apply(geometry, *it);
Chris@16 85 }
Chris@16 86 }
Chris@16 87 };
Chris@16 88
Chris@16 89
Chris@16 90 template <typename Polygon, typename Point>
Chris@16 91 struct point_to_polygon
Chris@16 92 {
Chris@16 93 typedef typename ring_type<Polygon>::type ring_type;
Chris@16 94
Chris@16 95 static inline void apply(Polygon& polygon, Point const& point,
Chris@16 96 int ring_index, int = 0)
Chris@16 97 {
Chris@16 98 if (ring_index == -1)
Chris@16 99 {
Chris@16 100 append_point<ring_type, Point>::apply(
Chris@16 101 exterior_ring(polygon), point);
Chris@16 102 }
Chris@16 103 else if (ring_index < int(num_interior_rings(polygon)))
Chris@16 104 {
Chris@16 105 append_point<ring_type, Point>::apply(
Chris@101 106 range::at(interior_rings(polygon), ring_index), point);
Chris@16 107 }
Chris@16 108 }
Chris@16 109 };
Chris@16 110
Chris@16 111
Chris@16 112 template <typename Polygon, typename Range>
Chris@16 113 struct range_to_polygon
Chris@16 114 {
Chris@16 115 typedef typename ring_type<Polygon>::type ring_type;
Chris@16 116
Chris@16 117 static inline void apply(Polygon& polygon, Range const& range,
Chris@101 118 int ring_index, int = 0)
Chris@16 119 {
Chris@16 120 if (ring_index == -1)
Chris@16 121 {
Chris@16 122 append_range<ring_type, Range>::apply(
Chris@16 123 exterior_ring(polygon), range);
Chris@16 124 }
Chris@16 125 else if (ring_index < int(num_interior_rings(polygon)))
Chris@16 126 {
Chris@16 127 append_range<ring_type, Range>::apply(
Chris@101 128 range::at(interior_rings(polygon), ring_index), range);
Chris@16 129 }
Chris@16 130 }
Chris@16 131 };
Chris@16 132
Chris@16 133
Chris@16 134 }} // namespace detail::append
Chris@16 135 #endif // DOXYGEN_NO_DETAIL
Chris@16 136
Chris@16 137
Chris@16 138 #ifndef DOXYGEN_NO_DISPATCH
Chris@16 139 namespace dispatch
Chris@16 140 {
Chris@16 141
Chris@16 142 namespace splitted_dispatch
Chris@16 143 {
Chris@16 144
Chris@16 145 template <typename Tag, typename Geometry, typename Point>
Chris@16 146 struct append_point
Chris@16 147 : detail::append::append_no_action<Geometry, Point>
Chris@16 148 {};
Chris@16 149
Chris@16 150 template <typename Geometry, typename Point>
Chris@16 151 struct append_point<linestring_tag, Geometry, Point>
Chris@16 152 : detail::append::append_point<Geometry, Point>
Chris@16 153 {};
Chris@16 154
Chris@16 155 template <typename Geometry, typename Point>
Chris@16 156 struct append_point<ring_tag, Geometry, Point>
Chris@16 157 : detail::append::append_point<Geometry, Point>
Chris@16 158 {};
Chris@16 159
Chris@16 160
Chris@16 161 template <typename Polygon, typename Point>
Chris@16 162 struct append_point<polygon_tag, Polygon, Point>
Chris@16 163 : detail::append::point_to_polygon<Polygon, Point>
Chris@16 164 {};
Chris@16 165
Chris@16 166
Chris@16 167 template <typename Tag, typename Geometry, typename Range>
Chris@16 168 struct append_range
Chris@16 169 : detail::append::append_no_action<Geometry, Range>
Chris@16 170 {};
Chris@16 171
Chris@16 172 template <typename Geometry, typename Range>
Chris@16 173 struct append_range<linestring_tag, Geometry, Range>
Chris@16 174 : detail::append::append_range<Geometry, Range>
Chris@16 175 {};
Chris@16 176
Chris@16 177 template <typename Geometry, typename Range>
Chris@16 178 struct append_range<ring_tag, Geometry, Range>
Chris@16 179 : detail::append::append_range<Geometry, Range>
Chris@16 180 {};
Chris@16 181
Chris@16 182
Chris@16 183 template <typename Polygon, typename Range>
Chris@16 184 struct append_range<polygon_tag, Polygon, Range>
Chris@16 185 : detail::append::range_to_polygon<Polygon, Range>
Chris@16 186 {};
Chris@16 187
Chris@16 188 } // namespace splitted_dispatch
Chris@16 189
Chris@16 190
Chris@16 191 // Default: append a range (or linestring or ring or whatever) to any geometry
Chris@16 192 template
Chris@16 193 <
Chris@16 194 typename Geometry, typename RangeOrPoint,
Chris@16 195 typename TagRangeOrPoint = typename tag<RangeOrPoint>::type
Chris@16 196 >
Chris@16 197 struct append
Chris@16 198 : splitted_dispatch::append_range<typename tag<Geometry>::type, Geometry, RangeOrPoint>
Chris@16 199 {};
Chris@16 200
Chris@16 201 // Specialization for point to append a point to any geometry
Chris@16 202 template <typename Geometry, typename RangeOrPoint>
Chris@16 203 struct append<Geometry, RangeOrPoint, point_tag>
Chris@16 204 : splitted_dispatch::append_point<typename tag<Geometry>::type, Geometry, RangeOrPoint>
Chris@16 205 {};
Chris@16 206
Chris@101 207 } // namespace dispatch
Chris@101 208 #endif // DOXYGEN_NO_DISPATCH
Chris@101 209
Chris@101 210 #ifndef DOXYGEN_NO_DETAIL
Chris@101 211 namespace detail { namespace append
Chris@101 212 {
Chris@101 213
Chris@101 214 template <typename MultiGeometry, typename RangeOrPoint>
Chris@101 215 struct append_to_multigeometry
Chris@101 216 {
Chris@101 217 static inline void apply(MultiGeometry& multigeometry,
Chris@101 218 RangeOrPoint const& range_or_point,
Chris@101 219 int ring_index, int multi_index)
Chris@101 220 {
Chris@101 221
Chris@101 222 dispatch::append
Chris@101 223 <
Chris@101 224 typename boost::range_value<MultiGeometry>::type,
Chris@101 225 RangeOrPoint
Chris@101 226 >::apply(range::at(multigeometry, multi_index), range_or_point, ring_index);
Chris@101 227 }
Chris@101 228 };
Chris@101 229
Chris@101 230 }} // namespace detail::append
Chris@101 231 #endif // DOXYGEN_NO_DETAIL
Chris@101 232
Chris@101 233 #ifndef DOXYGEN_NO_DISPATCH
Chris@101 234 namespace dispatch
Chris@101 235 {
Chris@101 236
Chris@101 237 namespace splitted_dispatch
Chris@101 238 {
Chris@101 239
Chris@101 240 template <typename Geometry, typename Point>
Chris@101 241 struct append_point<multi_point_tag, Geometry, Point>
Chris@101 242 : detail::append::append_point<Geometry, Point>
Chris@101 243 {};
Chris@101 244
Chris@101 245 template <typename Geometry, typename Range>
Chris@101 246 struct append_range<multi_point_tag, Geometry, Range>
Chris@101 247 : detail::append::append_range<Geometry, Range>
Chris@101 248 {};
Chris@101 249
Chris@101 250 template <typename MultiGeometry, typename RangeOrPoint>
Chris@101 251 struct append_point<multi_linestring_tag, MultiGeometry, RangeOrPoint>
Chris@101 252 : detail::append::append_to_multigeometry<MultiGeometry, RangeOrPoint>
Chris@101 253 {};
Chris@101 254
Chris@101 255 template <typename MultiGeometry, typename RangeOrPoint>
Chris@101 256 struct append_range<multi_linestring_tag, MultiGeometry, RangeOrPoint>
Chris@101 257 : detail::append::append_to_multigeometry<MultiGeometry, RangeOrPoint>
Chris@101 258 {};
Chris@101 259
Chris@101 260 template <typename MultiGeometry, typename RangeOrPoint>
Chris@101 261 struct append_point<multi_polygon_tag, MultiGeometry, RangeOrPoint>
Chris@101 262 : detail::append::append_to_multigeometry<MultiGeometry, RangeOrPoint>
Chris@101 263 {};
Chris@101 264
Chris@101 265 template <typename MultiGeometry, typename RangeOrPoint>
Chris@101 266 struct append_range<multi_polygon_tag, MultiGeometry, RangeOrPoint>
Chris@101 267 : detail::append::append_to_multigeometry<MultiGeometry, RangeOrPoint>
Chris@101 268 {};
Chris@101 269
Chris@101 270 } // namespace splitted_dispatch
Chris@101 271
Chris@101 272 } // namespace dispatch
Chris@101 273 #endif // DOXYGEN_NO_DISPATCH
Chris@101 274
Chris@101 275
Chris@101 276 namespace resolve_variant {
Chris@101 277
Chris@16 278 template <typename Geometry>
Chris@101 279 struct append
Chris@16 280 {
Chris@16 281 template <typename RangeOrPoint>
Chris@16 282 static inline void apply(Geometry& geometry,
Chris@16 283 RangeOrPoint const& range_or_point,
Chris@16 284 int ring_index,
Chris@16 285 int multi_index)
Chris@16 286 {
Chris@16 287 concept::check<Geometry>();
Chris@101 288 dispatch::append<Geometry, RangeOrPoint>::apply(geometry,
Chris@101 289 range_or_point,
Chris@101 290 ring_index,
Chris@101 291 multi_index);
Chris@16 292 }
Chris@16 293 };
Chris@16 294
Chris@16 295
Chris@16 296 template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
Chris@101 297 struct append<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
Chris@16 298 {
Chris@16 299 template <typename RangeOrPoint>
Chris@16 300 struct visitor: boost::static_visitor<void>
Chris@16 301 {
Chris@16 302 RangeOrPoint const& m_range_or_point;
Chris@16 303 int m_ring_index;
Chris@16 304 int m_multi_index;
Chris@101 305
Chris@16 306 visitor(RangeOrPoint const& range_or_point,
Chris@16 307 int ring_index,
Chris@16 308 int multi_index):
Chris@16 309 m_range_or_point(range_or_point),
Chris@16 310 m_ring_index(ring_index),
Chris@16 311 m_multi_index(multi_index)
Chris@16 312 {}
Chris@101 313
Chris@16 314 template <typename Geometry>
Chris@16 315 void operator()(Geometry& geometry) const
Chris@16 316 {
Chris@101 317 append<Geometry>::apply(geometry,
Chris@101 318 m_range_or_point,
Chris@101 319 m_ring_index,
Chris@101 320 m_multi_index);
Chris@16 321 }
Chris@16 322 };
Chris@16 323
Chris@16 324 template <typename RangeOrPoint>
Chris@16 325 static inline void apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>& variant_geometry,
Chris@16 326 RangeOrPoint const& range_or_point,
Chris@16 327 int ring_index,
Chris@16 328 int multi_index)
Chris@16 329 {
Chris@16 330 apply_visitor(
Chris@16 331 visitor<RangeOrPoint>(
Chris@16 332 range_or_point,
Chris@16 333 ring_index,
Chris@16 334 multi_index
Chris@16 335 ),
Chris@16 336 variant_geometry
Chris@16 337 );
Chris@16 338 }
Chris@16 339 };
Chris@16 340
Chris@101 341 } // namespace resolve_variant;
Chris@16 342
Chris@16 343
Chris@16 344 /*!
Chris@16 345 \brief Appends one or more points to a linestring, ring, polygon, multi-geometry
Chris@16 346 \ingroup append
Chris@16 347 \tparam Geometry \tparam_geometry
Chris@16 348 \tparam RangeOrPoint Either a range or a point, fullfilling Boost.Range concept or Boost.Geometry Point Concept
Chris@16 349 \param geometry \param_geometry
Chris@16 350 \param range_or_point The point or range to add
Chris@16 351 \param ring_index The index of the ring in case of a polygon:
Chris@16 352 exterior ring (-1, the default) or interior ring index
Chris@101 353 \param multi_index The index of the geometry to which the points are appended
Chris@16 354
Chris@16 355 \qbk{[include reference/algorithms/append.qbk]}
Chris@16 356 }
Chris@16 357 */
Chris@16 358 template <typename Geometry, typename RangeOrPoint>
Chris@16 359 inline void append(Geometry& geometry, RangeOrPoint const& range_or_point,
Chris@16 360 int ring_index = -1, int multi_index = 0)
Chris@16 361 {
Chris@101 362 resolve_variant::append<Geometry>
Chris@101 363 ::apply(geometry, range_or_point, ring_index, multi_index);
Chris@16 364 }
Chris@16 365
Chris@16 366
Chris@16 367 }} // namespace boost::geometry
Chris@16 368
Chris@16 369
Chris@16 370 #endif // BOOST_GEOMETRY_ALGORITHMS_APPEND_HPP