]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/geometry/algorithms/detail/envelope/areal.hpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / boost / geometry / algorithms / detail / envelope / areal.hpp
index 3c9b5c576caa88201f03fff4190f6c0afa7c92c5..ece4d3d14464ba23bdba27fef3e4c0b719928a87 100644 (file)
@@ -1,6 +1,6 @@
 // Boost.Geometry
 
-// Copyright (c) 2018 Oracle and/or its affiliates.
+// Copyright (c) 2018-2021 Oracle and/or its affiliates.
 
 // Contributed and/or modified by Vissarion Fysikopoulos, on behalf of Oracle
 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
@@ -22,6 +22,8 @@
 
 #include <boost/geometry/algorithms/dispatch/envelope.hpp>
 
+#include <boost/geometry/views/reversible_view.hpp>
+
 namespace boost { namespace geometry
 {
 
@@ -29,6 +31,24 @@ namespace boost { namespace geometry
 namespace detail { namespace envelope
 {
 
+
+struct envelope_hole
+{
+    template <typename Range, typename Box, typename Strategies>
+    static inline void apply(Range const& range, Box& mbr, Strategies const& strategies)
+    {
+        // Reverse holes to avoid calculating the envelope for the outside
+        // in spherical and geographic coordinate systems
+        detail::clockwise_view
+            <
+                Range const,
+                geometry::point_order<Range>::value == counterclockwise
+                    ? clockwise : counterclockwise
+            > view(range);
+        strategies.envelope(range, mbr).apply(view, mbr);
+    }
+};
+
 struct envelope_polygon
 {
     template <typename Polygon, typename Box, typename Strategy>
@@ -39,11 +59,14 @@ struct envelope_polygon
 
         if (geometry::is_empty(ext_ring))
         {
+            // use dummy multi polygon to get the strategy because there is no multi ring concept
+            using strategy_t = decltype(strategy.envelope(detail::dummy_multi_polygon(),
+                                                          detail::dummy_box()));
             // if the exterior ring is empty, consider the interior rings
             envelope_multi_range
                 <
-                    envelope_range
-                >::apply(interior_rings(polygon), mbr, strategy);
+                    envelope_hole
+                >::template apply<strategy_t>(interior_rings(polygon), mbr, strategy);
         }
         else
         {