File indexing completed on 2025-12-15 09:50:10
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_COVERED_BY_INTERFACE_HPP
0019 #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_COVERED_BY_INTERFACE_HPP
0020
0021
0022 #include <boost/geometry/algorithms/detail/within/interface.hpp>
0023 #include <boost/geometry/algorithms/not_implemented.hpp>
0024
0025 #include <boost/geometry/strategies/default_strategy.hpp>
0026 #include <boost/geometry/strategies/detail.hpp>
0027 #include <boost/geometry/strategies/relate/services.hpp>
0028
0029
0030 namespace boost { namespace geometry
0031 {
0032
0033 #ifndef DOXYGEN_NO_DISPATCH
0034 namespace dispatch
0035 {
0036
0037 template
0038 <
0039 typename Geometry1,
0040 typename Geometry2,
0041 typename Tag1 = tag_t<Geometry1>,
0042 typename Tag2 = tag_t<Geometry2>
0043 >
0044 struct covered_by
0045 : not_implemented<Tag1, Tag2>
0046 {};
0047
0048 }
0049 #endif
0050
0051
0052 namespace resolve_strategy {
0053
0054 template
0055 <
0056 typename Strategy,
0057 bool IsUmbrella = strategies::detail::is_umbrella_strategy<Strategy>::value
0058 >
0059 struct covered_by
0060 {
0061 template <typename Geometry1, typename Geometry2>
0062 static inline bool apply(Geometry1 const& geometry1,
0063 Geometry2 const& geometry2,
0064 Strategy const& strategy)
0065 {
0066 concepts::within::check<Geometry1, Geometry2, Strategy>();
0067 concepts::check<Geometry1 const>();
0068 concepts::check<Geometry2 const>();
0069 assert_dimension_equal<Geometry1, Geometry2>();
0070
0071 return dispatch::covered_by
0072 <
0073 Geometry1, Geometry2
0074 >::apply(geometry1, geometry2, strategy);
0075 }
0076 };
0077
0078 template <typename Strategy>
0079 struct covered_by<Strategy, false>
0080 {
0081 template <typename Geometry1, typename Geometry2>
0082 static inline bool apply(Geometry1 const& geometry1,
0083 Geometry2 const& geometry2,
0084 Strategy const& strategy)
0085 {
0086 using strategies::relate::services::strategy_converter;
0087
0088 return covered_by
0089 <
0090 decltype(strategy_converter<Strategy>::get(strategy))
0091 >::apply(geometry1, geometry2,
0092 strategy_converter<Strategy>::get(strategy));
0093 }
0094 };
0095
0096 template <>
0097 struct covered_by<default_strategy, false>
0098 {
0099 template <typename Geometry1, typename Geometry2>
0100 static inline bool apply(Geometry1 const& geometry1,
0101 Geometry2 const& geometry2,
0102 default_strategy)
0103 {
0104 typedef typename strategies::relate::services::default_strategy
0105 <
0106 Geometry1,
0107 Geometry2
0108 >::type strategy_type;
0109
0110 return covered_by
0111 <
0112 strategy_type
0113 >::apply(geometry1, geometry2, strategy_type());
0114 }
0115 };
0116
0117 }
0118
0119
0120 namespace resolve_dynamic {
0121
0122 template
0123 <
0124 typename Geometry1, typename Geometry2,
0125 typename Tag1 = geometry::tag_t<Geometry1>,
0126 typename Tag2 = geometry::tag_t<Geometry2>
0127 >
0128 struct covered_by
0129 {
0130 template <typename Strategy>
0131 static inline bool apply(Geometry1 const& geometry1,
0132 Geometry2 const& geometry2,
0133 Strategy const& strategy)
0134 {
0135 return resolve_strategy::covered_by
0136 <
0137 Strategy
0138 >::apply(geometry1, geometry2, strategy);
0139 }
0140 };
0141
0142 template <typename Geometry1, typename Geometry2, typename Tag2>
0143 struct covered_by<Geometry1, Geometry2, dynamic_geometry_tag, Tag2>
0144 {
0145 template <typename Strategy>
0146 static inline bool apply(Geometry1 const& geometry1,
0147 Geometry2 const& geometry2,
0148 Strategy const& strategy)
0149 {
0150 bool result = false;
0151 traits::visit<Geometry1>::apply([&](auto const& g1)
0152 {
0153 result = resolve_strategy::covered_by
0154 <
0155 Strategy
0156 >::apply(g1, geometry2, strategy);
0157 }, geometry1);
0158 return result;
0159 }
0160 };
0161
0162 template <typename Geometry1, typename Geometry2, typename Tag1>
0163 struct covered_by<Geometry1, Geometry2, Tag1, dynamic_geometry_tag>
0164 {
0165 template <typename Strategy>
0166 static inline bool apply(Geometry1 const& geometry1,
0167 Geometry2 const& geometry2,
0168 Strategy const& strategy)
0169 {
0170 bool result = false;
0171 traits::visit<Geometry2>::apply([&](auto const& g2)
0172 {
0173 result = resolve_strategy::covered_by
0174 <
0175 Strategy
0176 >::apply(geometry1, g2, strategy);
0177 }, geometry2);
0178 return result;
0179 }
0180 };
0181
0182 template <typename Geometry1, typename Geometry2>
0183 struct covered_by<Geometry1, Geometry2, dynamic_geometry_tag, dynamic_geometry_tag>
0184 {
0185 template <typename Strategy>
0186 static inline bool apply(Geometry1 const& geometry1,
0187 Geometry2 const& geometry2,
0188 Strategy const& strategy)
0189 {
0190 bool result = false;
0191 traits::visit<Geometry1, Geometry2>::apply([&](auto const& g1, auto const& g2)
0192 {
0193 result = resolve_strategy::covered_by
0194 <
0195 Strategy
0196 >::apply(g1, g2, strategy);
0197 }, geometry1, geometry2);
0198 return result;
0199 }
0200 };
0201
0202 }
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224 template<typename Geometry1, typename Geometry2>
0225 inline bool covered_by(Geometry1 const& geometry1, Geometry2 const& geometry2)
0226 {
0227 return resolve_dynamic::covered_by
0228 <
0229 Geometry1, Geometry2
0230 >::apply(geometry1, geometry2, default_strategy());
0231 }
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249 template<typename Geometry1, typename Geometry2, typename Strategy>
0250 inline bool covered_by(Geometry1 const& geometry1, Geometry2 const& geometry2,
0251 Strategy const& strategy)
0252 {
0253 return resolve_dynamic::covered_by
0254 <
0255 Geometry1, Geometry2
0256 >::apply(geometry1, geometry2, strategy);
0257 }
0258
0259 }}
0260
0261 #endif