1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 
3 // Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
4 // Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
5 // Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
6 // Copyright (c) 2014-2015 Samuel Debionne, Grenoble, France.
7 
8 // This file was modified by Oracle on 2015.
9 // Modifications copyright (c) 2015, Oracle and/or its affiliates.
10 
11 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
12 
13 // Distributed under the Boost Software License, Version 1.0.
14 // (See accompanying file LICENSE_1_0.txt or copy at
15 // http://www.boost.org/LICENSE_1_0.txt)
16 
17 #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_EXPAND_BOX_HPP
18 #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_EXPAND_BOX_HPP
19 
20 #include <cstddef>
21 #include <algorithm>
22 
23 #include <boost/mpl/assert.hpp>
24 #include <boost/type_traits/is_same.hpp>
25 
26 #include <boost/geometry/core/coordinate_dimension.hpp>
27 #include <boost/geometry/core/tags.hpp>
28 
29 #include <boost/geometry/algorithms/detail/envelope/box.hpp>
30 #include <boost/geometry/algorithms/detail/envelope/range_of_boxes.hpp>
31 
32 #include <boost/geometry/algorithms/detail/expand/indexed.hpp>
33 
34 #include <boost/geometry/algorithms/dispatch/expand.hpp>
35 
36 
37 namespace boost { namespace geometry
38 {
39 
40 #ifndef DOXYGEN_NO_DETAIL
41 namespace detail { namespace expand
42 {
43 
44 
45 struct box_on_spheroid
46 {
47     template <typename BoxOut, typename BoxIn>
applyboost::geometry::detail::expand::box_on_spheroid48     static inline void apply(BoxOut& box_out, BoxIn const& box_in)
49     {
50         // normalize both boxes and convert box-in to be of type of box-out
51         BoxOut mbrs[2];
52         detail::envelope::envelope_box_on_spheroid::apply(box_in, mbrs[0]);
53         detail::envelope::envelope_box_on_spheroid::apply(box_out, mbrs[1]);
54 
55         // compute the envelope of the two boxes
56         detail::envelope::envelope_range_of_boxes::apply(mbrs, box_out);
57     }
58 };
59 
60 
61 }} // namespace detail::expand
62 #endif // DOXYGEN_NO_DETAIL
63 
64 #ifndef DOXYGEN_NO_DISPATCH
65 namespace dispatch
66 {
67 
68 
69 // Box + box -> new box containing two input boxes
70 template
71 <
72     typename BoxOut, typename BoxIn,
73     typename StrategyLess, typename StrategyGreater,
74     typename CSTagOut, typename CSTag
75 >
76 struct expand
77     <
78         BoxOut, BoxIn,
79         StrategyLess, StrategyGreater,
80         box_tag, box_tag,
81         CSTagOut, CSTag
82     > : detail::expand::expand_indexed
83         <
84             0, dimension<BoxIn>::value, StrategyLess, StrategyGreater
85         >
86 {
87     BOOST_MPL_ASSERT_MSG((boost::is_same<CSTagOut, CSTag>::value),
88                          COORDINATE_SYSTEMS_MUST_BE_THE_SAME,
89                          (types<CSTagOut, CSTag>()));
90 };
91 
92 template
93 <
94     typename BoxOut, typename BoxIn,
95     typename StrategyLess, typename StrategyGreater
96 >
97 struct expand
98     <
99         BoxOut, BoxIn,
100         StrategyLess, StrategyGreater,
101         box_tag, box_tag,
102         spherical_equatorial_tag, spherical_equatorial_tag
103     > : detail::expand::box_on_spheroid
104 {};
105 
106 template
107 <
108     typename BoxOut, typename BoxIn,
109     typename StrategyLess, typename StrategyGreater
110 >
111 struct expand
112     <
113         BoxOut, BoxIn,
114         StrategyLess, StrategyGreater,
115         box_tag, box_tag,
116         geographic_tag, geographic_tag
117     > : detail::expand::box_on_spheroid
118 {};
119 
120 
121 } // namespace dispatch
122 #endif // DOXYGEN_NO_DISPATCH
123 
124 }} // namespace boost::geometry
125 
126 #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_EXPAND_INDEXED_HPP
127