1 // Boost.Geometry 2 3 // Copyright (c) 2020, Oracle and/or its affiliates. 4 5 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle 6 7 // Licensed under the Boost Software License version 1.0. 8 // http://www.boost.org/users/license.html 9 10 #ifndef BOOST_GEOMETRY_STRATEGIES_ENVELOPE_CARTESIAN_HPP 11 #define BOOST_GEOMETRY_STRATEGIES_ENVELOPE_CARTESIAN_HPP 12 13 14 #include <type_traits> 15 16 #include <boost/geometry/strategy/cartesian/envelope.hpp> 17 #include <boost/geometry/strategy/cartesian/envelope_box.hpp> 18 #include <boost/geometry/strategy/cartesian/envelope_point.hpp> 19 #include <boost/geometry/strategy/cartesian/envelope_multipoint.hpp> 20 #include <boost/geometry/strategy/cartesian/envelope_segment.hpp> 21 22 #include <boost/geometry/strategies/detail.hpp> 23 #include <boost/geometry/strategies/envelope/services.hpp> 24 #include <boost/geometry/strategies/expand/cartesian.hpp> 25 26 27 namespace boost { namespace geometry 28 { 29 30 namespace strategies { namespace envelope 31 { 32 33 template <typename CalculationType = void> 34 struct cartesian 35 : strategies::expand::cartesian<CalculationType> 36 { 37 template <typename Geometry, typename Box> envelopeboost::geometry::strategies::envelope::cartesian38 static auto envelope(Geometry const&, Box const&, 39 typename util::enable_if_point_t<Geometry> * = nullptr) 40 { 41 return strategy::envelope::cartesian_point(); 42 } 43 44 template <typename Geometry, typename Box> envelopeboost::geometry::strategies::envelope::cartesian45 static auto envelope(Geometry const&, Box const&, 46 typename util::enable_if_multi_point_t<Geometry> * = nullptr) 47 { 48 return strategy::envelope::cartesian_multipoint(); 49 } 50 51 template <typename Geometry, typename Box> envelopeboost::geometry::strategies::envelope::cartesian52 static auto envelope(Geometry const&, Box const&, 53 typename util::enable_if_box_t<Geometry> * = nullptr) 54 { 55 return strategy::envelope::cartesian_box(); 56 } 57 58 template <typename Geometry, typename Box> envelopeboost::geometry::strategies::envelope::cartesian59 static auto envelope(Geometry const&, Box const&, 60 typename util::enable_if_segment_t<Geometry> * = nullptr) 61 { 62 return strategy::envelope::cartesian_segment<CalculationType>(); 63 } 64 65 template <typename Geometry, typename Box> envelopeboost::geometry::strategies::envelope::cartesian66 static auto envelope(Geometry const&, Box const&, 67 typename util::enable_if_polysegmental_t<Geometry> * = nullptr) 68 { 69 return strategy::envelope::cartesian<CalculationType>(); 70 } 71 72 template <typename Geometry, typename Box> envelopeboost::geometry::strategies::envelope::cartesian73 static auto envelope(Geometry const&, Box const&, 74 typename util::enable_if_geometry_collection_t<Geometry> * = nullptr) 75 { 76 return strategy::envelope::cartesian<CalculationType>(); 77 } 78 }; 79 80 81 namespace services 82 { 83 84 template <typename Geometry, typename Box> 85 struct default_strategy<Geometry, Box, cartesian_tag> 86 { 87 using type = strategies::envelope::cartesian<>; 88 }; 89 90 91 template <> 92 struct strategy_converter<strategy::envelope::cartesian_point> 93 { getboost::geometry::strategies::envelope::services::strategy_converter94 static auto get(strategy::envelope::cartesian_point const& ) 95 { 96 return strategies::envelope::cartesian<>(); 97 } 98 }; 99 100 template <> 101 struct strategy_converter<strategy::envelope::cartesian_multipoint> 102 { getboost::geometry::strategies::envelope::services::strategy_converter103 static auto get(strategy::envelope::cartesian_multipoint const&) 104 { 105 return strategies::envelope::cartesian<>(); 106 } 107 }; 108 109 template <> 110 struct strategy_converter<strategy::envelope::cartesian_box> 111 { getboost::geometry::strategies::envelope::services::strategy_converter112 static auto get(strategy::envelope::cartesian_box const& ) 113 { 114 return strategies::envelope::cartesian<>(); 115 } 116 }; 117 118 template <typename CT> 119 struct strategy_converter<strategy::envelope::cartesian_segment<CT> > 120 { getboost::geometry::strategies::envelope::services::strategy_converter121 static auto get(strategy::envelope::cartesian_segment<CT> const&) 122 { 123 return strategies::envelope::cartesian<CT>(); 124 } 125 }; 126 127 template <typename CT> 128 struct strategy_converter<strategy::envelope::cartesian<CT> > 129 { getboost::geometry::strategies::envelope::services::strategy_converter130 static auto get(strategy::envelope::cartesian<CT> const&) 131 { 132 return strategies::envelope::cartesian<CT>(); 133 } 134 }; 135 136 137 } // namespace services 138 139 }} // namespace strategies::envelope 140 141 }} // namespace boost::geometry 142 143 #endif // BOOST_GEOMETRY_STRATEGIES_ENVELOPE_CARTESIAN_HPP 144