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