3 // Copyright (c) 2020, Oracle and/or its affiliates.
5 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
7 // Licensed under the Boost Software License version 1.0.
8 // http://www.boost.org/users/license.html
10 #ifndef BOOST_GEOMETRY_STRATEGIES_ENVELOPE_CARTESIAN_HPP
11 #define BOOST_GEOMETRY_STRATEGIES_ENVELOPE_CARTESIAN_HPP
14 #include <type_traits>
16 #include <boost/geometry/strategy/cartesian/envelope.hpp> // Not used, for backward compatibility
17 #include <boost/geometry/strategy/cartesian/envelope_box.hpp>
18 #include <boost/geometry/strategy/cartesian/envelope_boxes.hpp>
19 #include <boost/geometry/strategy/cartesian/envelope_multipoint.hpp>
20 #include <boost/geometry/strategy/cartesian/envelope_point.hpp>
21 #include <boost/geometry/strategy/cartesian/envelope_range.hpp>
22 #include <boost/geometry/strategy/cartesian/envelope_segment.hpp>
24 #include <boost/geometry/strategies/envelope/services.hpp>
25 #include <boost/geometry/strategies/expand/cartesian.hpp>
28 namespace boost { namespace geometry
31 namespace strategies { namespace envelope
34 template <typename CalculationType = void>
36 : strategies::expand::cartesian<CalculationType>
38 template <typename Geometry, typename Box>
39 static auto envelope(Geometry const&, Box const&,
40 util::enable_if_point_t<Geometry> * = nullptr)
42 return strategy::envelope::cartesian_point();
45 template <typename Geometry, typename Box>
46 static auto envelope(Geometry const&, Box const&,
47 util::enable_if_multi_point_t<Geometry> * = nullptr)
49 return strategy::envelope::cartesian_multipoint();
52 template <typename Geometry, typename Box>
53 static auto envelope(Geometry const&, Box const&,
54 util::enable_if_box_t<Geometry> * = nullptr)
56 return strategy::envelope::cartesian_box();
59 template <typename Geometry, typename Box>
60 static auto envelope(Geometry const&, Box const&,
61 util::enable_if_segment_t<Geometry> * = nullptr)
63 return strategy::envelope::cartesian_segment<CalculationType>();
66 template <typename Geometry, typename Box>
67 static auto envelope(Geometry const&, Box const&,
70 util::is_linestring<Geometry>::value
71 || util::is_ring<Geometry>::value
72 || util::is_polygon<Geometry>::value
75 return strategy::envelope::cartesian_range();
78 template <typename Geometry, typename Box>
79 static auto envelope(Geometry const&, Box const&,
82 util::is_multi_linestring<Geometry>::value
83 || util::is_multi_polygon<Geometry>::value
84 || util::is_geometry_collection<Geometry>::value
87 return strategy::envelope::cartesian_boxes();
95 template <typename Geometry, typename Box>
96 struct default_strategy<Geometry, Box, cartesian_tag>
98 using type = strategies::envelope::cartesian<>;
103 struct strategy_converter<strategy::envelope::cartesian_point>
105 static auto get(strategy::envelope::cartesian_point const& )
107 return strategies::envelope::cartesian<>();
112 struct strategy_converter<strategy::envelope::cartesian_multipoint>
114 static auto get(strategy::envelope::cartesian_multipoint const&)
116 return strategies::envelope::cartesian<>();
121 struct strategy_converter<strategy::envelope::cartesian_box>
123 static auto get(strategy::envelope::cartesian_box const& )
125 return strategies::envelope::cartesian<>();
129 template <typename CT>
130 struct strategy_converter<strategy::envelope::cartesian_segment<CT> >
132 static auto get(strategy::envelope::cartesian_segment<CT> const&)
134 return strategies::envelope::cartesian<CT>();
138 template <typename CT>
139 struct strategy_converter<strategy::envelope::cartesian<CT> >
141 static auto get(strategy::envelope::cartesian<CT> const&)
143 return strategies::envelope::cartesian<CT>();
148 } // namespace services
150 }} // namespace strategies::envelope
152 }} // namespace boost::geometry
154 #endif // BOOST_GEOMETRY_STRATEGIES_ENVELOPE_CARTESIAN_HPP