diff --git a/include/boost/geometry/algorithms/detail/overlaps/implementation.hpp b/include/boost/geometry/algorithms/detail/overlaps/implementation.hpp index e7d359b39..5dc78d84c 100644 --- a/include/boost/geometry/algorithms/detail/overlaps/implementation.hpp +++ b/include/boost/geometry/algorithms/detail/overlaps/implementation.hpp @@ -24,8 +24,10 @@ #include +#include #include #include +#include #include #include @@ -34,6 +36,8 @@ #include #include +#include + namespace boost { namespace geometry { @@ -150,6 +154,74 @@ struct overlaps : detail::overlaps::box_box {}; + +template +struct overlaps +{ + template + static inline bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2, + Strategy const& strategy) + { + int dimension1 = detail::gc_topological_dimension(geometry1); + int dimension2 = detail::gc_topological_dimension(geometry2); + + if (dimension1 >= 0 && dimension2 >= 0) + { + if (dimension1 == 1 && dimension2 == 1) + { + return detail::relate::relate_impl + < + detail::de9im::static_mask_overlaps_d1_1_d2_1_type, + Geometry1, + Geometry2 + >::apply(geometry1, geometry2, strategy); + } + else if (dimension1 == dimension2) + { + return detail::relate::relate_impl + < + detail::de9im::static_mask_overlaps_d1_eq_d2_type, + Geometry1, + Geometry2 + >::apply(geometry1, geometry2, strategy); + } + } + + return false; + } +}; + +template +struct overlaps +{ + template + static inline bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2, + Strategy const& strategy) + { + using gc1_view_t = detail::geometry_collection_view; + return overlaps + < + gc1_view_t, Geometry2 + >::apply(gc1_view_t(geometry1), geometry2, strategy); + } +}; + +template +struct overlaps +{ + template + static inline bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2, + Strategy const& strategy) + { + using gc2_view_t = detail::geometry_collection_view; + return overlaps + < + Geometry1, gc2_view_t + >::apply(geometry1, gc2_view_t(geometry2), strategy); + } +}; + + } // namespace dispatch #endif // DOXYGEN_NO_DISPATCH diff --git a/include/boost/geometry/algorithms/detail/overlaps/interface.hpp b/include/boost/geometry/algorithms/detail/overlaps/interface.hpp index fbe0ffdae..18c760163 100644 --- a/include/boost/geometry/algorithms/detail/overlaps/interface.hpp +++ b/include/boost/geometry/algorithms/detail/overlaps/interface.hpp @@ -4,8 +4,8 @@ // Copyright (c) 2008-2015 Bruno Lalande, Paris, France. // Copyright (c) 2009-2015 Mateusz Loskot, London, UK. -// This file was modified by Oracle on 2014-2021. -// Modifications copyright (c) 2014-2021 Oracle and/or its affiliates. +// This file was modified by Oracle on 2014-2022. +// Modifications copyright (c) 2014-2022 Oracle and/or its affiliates. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle @@ -24,6 +24,7 @@ #include +#include #include #include @@ -124,6 +125,96 @@ struct overlaps } // namespace resolve_strategy +namespace resolve_dynamic +{ + +template +< + typename Geometry1, typename Geometry2, + typename Tag1 = typename geometry::tag::type, + typename Tag2 = typename geometry::tag::type +> +struct overlaps +{ + template + static inline bool apply(Geometry1 const& geometry1, + Geometry2 const& geometry2, + Strategy const& strategy) + { + return resolve_strategy::overlaps + < + Strategy + >::apply(geometry1, geometry2, strategy); + } +}; + + +template +struct overlaps +{ + template + static inline bool apply(DynamicGeometry1 const& geometry1, + Geometry2 const& geometry2, + Strategy const& strategy) + { + bool result = false; + traits::visit::apply([&](auto const& g1) + { + result = resolve_strategy::overlaps + < + Strategy + >::apply(g1, geometry2, strategy); + }, geometry1); + return result; + } +}; + + +template +struct overlaps +{ + template + static inline bool apply(Geometry1 const& geometry1, + DynamicGeometry2 const& geometry2, + Strategy const& strategy) + { + bool result = false; + traits::visit::apply([&](auto const& g2) + { + result = resolve_strategy::overlaps + < + Strategy + >::apply(geometry1, g2, strategy); + }, geometry2); + return result; + } +}; + + +template +struct overlaps +{ + template + static inline bool apply(DynamicGeometry1 const& geometry1, + DynamicGeometry2 const& geometry2, + Strategy const& strategy) + { + bool result = false; + traits::visit::apply([&](auto const& g1, auto const& g2) + { + result = resolve_strategy::overlaps + < + Strategy + >::apply(g1, g2, strategy); + }, geometry1, geometry2); + return result; + } +}; + + +} // namespace resolve_dynamic + + /*! \brief \brief_check2{overlap} \ingroup overlaps @@ -146,9 +237,9 @@ inline bool overlaps(Geometry1 const& geometry1, concepts::check(); concepts::check(); - return resolve_strategy::overlaps + return resolve_dynamic::overlaps < - Strategy + Geometry1, Geometry2 >::apply(geometry1, geometry2, strategy); } @@ -174,9 +265,9 @@ inline bool overlaps(Geometry1 const& geometry1, Geometry2 const& geometry2) concepts::check(); concepts::check(); - return resolve_strategy::overlaps + return resolve_dynamic::overlaps < - default_strategy + Geometry1, Geometry2 >::apply(geometry1, geometry2, default_strategy()); } diff --git a/include/boost/geometry/algorithms/detail/relate/de9im.hpp b/include/boost/geometry/algorithms/detail/relate/de9im.hpp index 29c2568e8..bfdd8c5c0 100644 --- a/include/boost/geometry/algorithms/detail/relate/de9im.hpp +++ b/include/boost/geometry/algorithms/detail/relate/de9im.hpp @@ -391,6 +391,16 @@ struct static_mask_overlaps_type : static_mask_overlaps_impl {}; +template +struct static_mask_overlaps_d1_eq_d2_type + : static_mask_overlaps_impl +{}; + +template +struct static_mask_overlaps_d1_1_d2_1_type + : static_mask_overlaps_impl +{}; + }} // namespace detail::de9im #endif // DOXYGEN_NO_DETAIL