File indexing completed on 2025-09-15 08:36:36
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef BOOST_GEOMETRY_STRATEGY_RELATE_HPP
0011 #define BOOST_GEOMETRY_STRATEGY_RELATE_HPP
0012
0013
0014 #include <type_traits>
0015
0016 #include <boost/geometry/core/cs.hpp>
0017 #include <boost/geometry/core/point_type.hpp>
0018 #include <boost/geometry/core/static_assert.hpp>
0019 #include <boost/geometry/core/topological_dimension.hpp>
0020
0021 #include <boost/geometry/strategies/covered_by.hpp>
0022 #include <boost/geometry/strategies/intersection.hpp>
0023 #include <boost/geometry/strategies/within.hpp>
0024
0025
0026 namespace boost { namespace geometry
0027 {
0028
0029 namespace strategy
0030 {
0031
0032 namespace point_in_geometry
0033 {
0034
0035 #ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
0036 namespace services
0037 {
0038
0039 template
0040 <
0041 typename Point,
0042 typename Geometry,
0043 typename Tag1 = tag_t<Point>,
0044 typename Tag2 = tag_t<Geometry>
0045 >
0046 struct default_strategy
0047 : strategy::within::services::default_strategy
0048 <
0049 Point,
0050 Geometry
0051 >
0052 {
0053 typedef typename default_strategy::type within_strategy_type;
0054
0055 typedef typename strategy::covered_by::services::default_strategy
0056 <
0057 Point,
0058 Geometry
0059 >::type covered_by_strategy_type;
0060
0061 static const bool same_strategies = std::is_same<within_strategy_type, covered_by_strategy_type>::value;
0062 BOOST_GEOMETRY_STATIC_ASSERT(same_strategies,
0063 "Default within and covered_by strategies not compatible.",
0064 within_strategy_type, covered_by_strategy_type);
0065 };
0066
0067 template<typename Point, typename Geometry>
0068 struct default_strategy<Point, Geometry, point_tag, point_tag>
0069 : strategy::within::services::default_strategy<Point, Geometry>
0070 {};
0071
0072 template<typename Point, typename Geometry>
0073 struct default_strategy<Point, Geometry, point_tag, multi_point_tag>
0074 : strategy::within::services::default_strategy<Point, Geometry>
0075 {};
0076
0077
0078 }
0079 #endif
0080
0081
0082 }
0083
0084 namespace relate
0085 {
0086
0087 #ifndef DOXYGEN_NO_DETAIL
0088 namespace detail
0089 {
0090
0091 template <typename Geometry>
0092 struct default_intersection_strategy
0093 : strategy::intersection::services::default_strategy<cs_tag_t<Geometry>>
0094 {};
0095
0096 template <typename PointLike, typename Geometry>
0097 struct default_point_in_geometry_strategy
0098 : point_in_geometry::services::default_strategy<point_type_t<PointLike>, Geometry>
0099 {};
0100
0101 }
0102 #endif
0103
0104 #ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
0105 namespace services
0106 {
0107
0108 template
0109 <
0110 typename Geometry1,
0111 typename Geometry2,
0112 int TopDim1 = geometry::topological_dimension<Geometry1>::value,
0113 int TopDim2 = geometry::topological_dimension<Geometry2>::value
0114 >
0115 struct default_strategy
0116 {
0117 BOOST_GEOMETRY_STATIC_ASSERT_FALSE(
0118 "Not implemented for these types.",
0119 Geometry1, Geometry2);
0120 };
0121
0122 template <typename PointLike1, typename PointLike2>
0123 struct default_strategy<PointLike1, PointLike2, 0, 0>
0124 : detail::default_point_in_geometry_strategy<PointLike1, PointLike2>
0125 {};
0126
0127 template <typename PointLike, typename Geometry, int TopDim2>
0128 struct default_strategy<PointLike, Geometry, 0, TopDim2>
0129 : detail::default_point_in_geometry_strategy<PointLike, Geometry>
0130 {};
0131
0132 template <typename Geometry, typename PointLike, int TopDim1>
0133 struct default_strategy<Geometry, PointLike, TopDim1, 0>
0134 : detail::default_point_in_geometry_strategy<PointLike, Geometry>
0135 {};
0136
0137 template <typename Geometry1, typename Geometry2>
0138 struct default_strategy<Geometry1, Geometry2, 1, 1>
0139 : detail::default_intersection_strategy<Geometry1>
0140 {};
0141
0142 template <typename Geometry1, typename Geometry2>
0143 struct default_strategy<Geometry1, Geometry2, 1, 2>
0144 : detail::default_intersection_strategy<Geometry1>
0145 {};
0146
0147 template <typename Geometry1, typename Geometry2>
0148 struct default_strategy<Geometry1, Geometry2, 2, 1>
0149 : detail::default_intersection_strategy<Geometry1>
0150 {};
0151
0152 template <typename Geometry1, typename Geometry2>
0153 struct default_strategy<Geometry1, Geometry2, 2, 2>
0154 : detail::default_intersection_strategy<Geometry1>
0155 {};
0156
0157 }
0158 #endif
0159
0160 }
0161
0162 }
0163
0164
0165 }}
0166
0167
0168 #endif