]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/geometry/algorithms/detail/distance/multipoint_to_geometry.hpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / boost / geometry / algorithms / detail / distance / multipoint_to_geometry.hpp
index c9462d7519e8151933e3b81c67d08e6b4f4c058b..e410e53d8eb2089acbd9ec3d8318905871e152f6 100644 (file)
@@ -1,7 +1,8 @@
 // Boost.Geometry (aka GGL, Generic Geometry Library)
 
-// Copyright (c) 2014, 2019, 2020 Oracle and/or its affiliates.
+// Copyright (c) 2014-2021, Oracle and/or its affiliates.
 
+// Contributed and/or modified by Vissarion Fysikopoulos, on behalf of Oracle
 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
 
 #include <boost/range/end.hpp>
 #include <boost/range/size.hpp>
 
+#include <boost/geometry/algorithms/covered_by.hpp>
+#include <boost/geometry/algorithms/detail/distance/range_to_geometry_rtree.hpp>
+#include <boost/geometry/algorithms/detail/distance/strategy_utils.hpp>
+#include <boost/geometry/algorithms/dispatch/distance.hpp>
+
 #include <boost/geometry/core/point_type.hpp>
 #include <boost/geometry/core/tags.hpp>
 
 #include <boost/geometry/strategies/distance.hpp>
 #include <boost/geometry/strategies/tags.hpp>
 
-#include <boost/geometry/algorithms/covered_by.hpp>
-
-#include <boost/geometry/algorithms/dispatch/distance.hpp>
-
-#include <boost/geometry/algorithms/detail/check_iterator_range.hpp>
-#include <boost/geometry/algorithms/detail/distance/range_to_geometry_rtree.hpp>
-
 
 namespace boost { namespace geometry
 {
@@ -37,147 +36,118 @@ namespace detail { namespace distance
 {
 
 
-template <typename MultiPoint1, typename MultiPoint2, typename Strategy>
+template <typename MultiPoint1, typename MultiPoint2, typename Strategies>
 struct multipoint_to_multipoint
 {
-    typedef typename strategy::distance::services::return_type
-        <
-            Strategy,
-            typename point_type<MultiPoint1>::type,
-            typename point_type<MultiPoint2>::type
-        >::type return_type;   
+    typedef distance::return_t<MultiPoint1, MultiPoint2, Strategies> return_type;
 
     static inline return_type apply(MultiPoint1 const& multipoint1,
                                     MultiPoint2 const& multipoint2,
-                                    Strategy const& strategy)
+                                    Strategies const& strategies)
     {
         if (boost::size(multipoint2) < boost::size(multipoint1))
-
         {
             return point_or_segment_range_to_geometry_rtree
                 <
                     typename boost::range_iterator<MultiPoint2 const>::type,
                     MultiPoint1,
-                    Strategy
+                    Strategies
                 >::apply(boost::begin(multipoint2),
                          boost::end(multipoint2),
                          multipoint1,
-                         strategy);
+                         strategies);
         }
 
         return point_or_segment_range_to_geometry_rtree
             <
                 typename boost::range_iterator<MultiPoint1 const>::type,
                 MultiPoint2,
-                Strategy
+                Strategies
             >::apply(boost::begin(multipoint1),
                      boost::end(multipoint1),
                      multipoint2,
-                     strategy);
+                     strategies);
     }
 };
 
 
-template <typename MultiPoint, typename Linear, typename Strategy>
+template <typename MultiPoint, typename Linear, typename Strategies>
 struct multipoint_to_linear
 {
-    typedef typename strategy::distance::services::return_type
-        <
-            Strategy,
-            typename point_type<MultiPoint>::type,
-            typename point_type<Linear>::type
-        >::type return_type;
-
-    static inline return_type apply(MultiPoint const& multipoint,
-                                    Linear const& linear,
-                                    Strategy const& strategy)
+    static inline auto apply(MultiPoint const& multipoint,
+                             Linear const& linear,
+                             Strategies const& strategies)
     {
         return detail::distance::point_or_segment_range_to_geometry_rtree
             <
                 typename boost::range_iterator<MultiPoint const>::type,
                 Linear,
-                Strategy
+                Strategies
             >::apply(boost::begin(multipoint),
                      boost::end(multipoint),
                      linear,
-                     strategy);
+                     strategies);
     }
 
-    static inline return_type apply(Linear const& linear,
-                                    MultiPoint const& multipoint,
-                                    Strategy const& strategy)
+    static inline auto apply(Linear const& linear,
+                             MultiPoint const& multipoint,
+                             Strategies const& strategies)
     {
-        return apply(multipoint, linear, strategy);
+        return apply(multipoint, linear, strategies);
     }
 };
 
 
-template <typename MultiPoint, typename Areal, typename Strategy>
+template <typename MultiPoint, typename Areal, typename Strategies>
 class multipoint_to_areal
 {
 private:
-    template <typename CoveredByStrategy>
-    struct not_covered_by_areal
+    struct covered_by_areal
     {
-        not_covered_by_areal(Areal const& areal, CoveredByStrategy const& strategy)
+        covered_by_areal(Areal const& areal, Strategies const& strategy)
             : m_areal(areal), m_strategy(strategy)
         {}
 
         template <typename Point>
-        inline bool apply(Point const& point) const
+        inline bool operator()(Point const& point) const
         {
-            return !geometry::covered_by(point, m_areal, m_strategy);
+            return geometry::covered_by(point, m_areal, m_strategy);
         }
 
         Areal const& m_areal;
-        CoveredByStrategy const& m_strategy;
+        Strategies const& m_strategy;
     };
 
 public:
-    typedef typename strategy::distance::services::return_type
-        <
-            Strategy,
-            typename point_type<MultiPoint>::type,
-            typename point_type<Areal>::type
-        >::type return_type;
+    typedef distance::return_t<MultiPoint, Areal, Strategies> return_type;
 
     static inline return_type apply(MultiPoint const& multipoint,
                                     Areal const& areal,
-                                    Strategy const& strategy)
+                                    Strategies const& strategies)
     {
-        typedef typename Strategy::point_in_geometry_strategy_type pg_strategy_type;
-
-        typedef not_covered_by_areal<pg_strategy_type> predicate_type;
-        
-        // predicate holds references so the strategy has to be created here
-        pg_strategy_type pg_strategy = strategy.get_point_in_geometry_strategy();
-        predicate_type predicate(areal, pg_strategy);
+        covered_by_areal predicate(areal, strategies);
 
-        if (check_iterator_range
-                <
-                    predicate_type, false
-                >::apply(boost::begin(multipoint),
-                         boost::end(multipoint),
-                         predicate))
+        if (! boost::empty(multipoint) && 
+            std::none_of(boost::begin(multipoint), boost::end(multipoint), predicate))
         {
             return detail::distance::point_or_segment_range_to_geometry_rtree
                 <
                     typename boost::range_iterator<MultiPoint const>::type,
                     Areal,
-                    Strategy
+                    Strategies
                 >::apply(boost::begin(multipoint),
                          boost::end(multipoint),
                          areal,
-                         strategy);
+                         strategies);
         }
-        return 0;
+        return return_type(0);
     }
 
     static inline return_type apply(Areal const& areal,
                                     MultiPoint const& multipoint,
-                                    Strategy const& strategy)
+                                    Strategies const& strategies)
     {
-        return apply(multipoint, areal, strategy);
+        return apply(multipoint, areal, strategies);
     }
 };