6e026676f47a1cd536f98b827b831291b04ec177
[platform/upstream/boost.git] / libs / geometry / test / util / calculation_type.cpp
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 // Unit Test
3
4 // Copyright (c) 2012 Barend Gehrels, Amsterdam, the Netherlands.
5 // Copyright (c) 2012 Bruno Lalande, Paris, France.
6 // Copyright (c) 2012 Mateusz Loskot, London, UK.
7
8 // Use, modification and distribution is subject to the Boost Software License,
9 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
10 // http://www.boost.org/LICENSE_1_0.txt)
11
12
13 #include <geometry_test_common.hpp>
14
15 #include <boost/geometry/geometries/geometries.hpp>
16 #include <boost/geometry/util/calculation_type.hpp>
17
18 template <typename G1, typename G2>
19 inline std::string helper()
20 {
21     std::string result;
22     result += typeid(typename bg::coordinate_type<G1>::type).name();
23     result += "/";
24     result += typeid(typename bg::coordinate_type<G2>::type).name();
25     return result;
26 }
27
28 template <typename G1, typename G2, typename G3>
29 inline std::string helper3()
30 {
31     std::string result;
32     result += typeid(typename bg::coordinate_type<G1>::type).name();
33     result += "/";
34     result += typeid(typename bg::coordinate_type<G2>::type).name();
35     result += "/";
36     result += typeid(typename bg::coordinate_type<G3>::type).name();
37     return result;
38 }
39
40 template
41 <
42     typename G1,
43     typename G2,
44     typename DefaultFP,
45     typename DefaultInt,
46     typename ExpectedType
47 >
48 void test()
49 {
50     typedef typename bg::util::calculation_type::geometric::binary
51         <
52             G1,
53             G2,
54             void,
55             DefaultFP,
56             DefaultInt
57         >::type type;
58
59     std::string const caption = helper<G1, G2>();
60
61     BOOST_CHECK_MESSAGE((boost::is_same<type, ExpectedType>::type::value),
62         "Failure, types do not agree;"
63             << " input: " << caption
64             << " defaults: " << typeid(DefaultFP).name()
65                 << "/" << typeid(DefaultInt).name()
66             << " expected: " << typeid(ExpectedType).name()
67             << " detected: " << typeid(type).name()
68         );
69 }
70
71 template
72 <
73     typename G1,
74     typename G2,
75     typename CalculationType,
76     typename ExpectedType
77 >
78 void test_with_calculation_type()
79 {
80     typedef typename bg::util::calculation_type::geometric::binary
81         <
82             G1,
83             G2,
84             CalculationType,
85             double,
86             int
87         >::type type;
88
89     std::string const caption = helper<G1, G2>();
90
91     BOOST_CHECK_MESSAGE((boost::is_same<type, ExpectedType>::type::value),
92         "Failure, types do not agree;"
93             << " input: " << caption
94             << " calculation type: " << typeid(CalculationType).name()
95             << " expected: " << typeid(ExpectedType).name()
96             << " detected: " << typeid(type).name()
97         );
98 }
99
100 template
101 <
102     typename Geometry,
103     typename DefaultFP,
104     typename DefaultInt,
105     typename ExpectedType
106 >
107 void test_unary()
108 {
109     typedef typename bg::util::calculation_type::geometric::unary
110         <
111             Geometry,
112             void,
113             DefaultFP,
114             DefaultInt
115         >::type type;
116
117     BOOST_CHECK_MESSAGE((boost::is_same<type, ExpectedType>::type::value),
118         "Failure, types do not agree;"
119             << " input: " << typeid(typename bg::coordinate_type<Geometry>::type).name()
120             << " defaults: " << typeid(DefaultFP).name()
121                 << "/" << typeid(DefaultInt).name()
122             << " expected: " << typeid(ExpectedType).name()
123             << " detected: " << typeid(type).name()
124         );
125 }
126
127
128 template
129 <
130     typename G1,
131     typename G2,
132     typename G3,
133     typename DefaultFP,
134     typename DefaultInt,
135     typename ExpectedType
136 >
137 void test_ternary()
138 {
139     typedef typename bg::util::calculation_type::geometric::ternary
140         <
141             G1,
142             G2,
143             G3,
144             void,
145             DefaultFP,
146             DefaultInt
147         >::type type;
148
149     std::string const caption = helper3<G1, G2, G3>();
150
151     BOOST_CHECK_MESSAGE((boost::is_same<type, ExpectedType>::type::value),
152         "Failure, types do not agree;"
153             << " input: " << caption
154             << " defaults: " << typeid(DefaultFP).name()
155                 << "/" << typeid(DefaultInt).name()
156             << " expected: " << typeid(ExpectedType).name()
157             << " detected: " << typeid(type).name()
158         );
159 }
160
161
162 struct user_defined {};
163
164 int test_main(int, char* [])
165 {
166     using namespace boost::geometry;
167     typedef model::point<double, 2, cs::cartesian> d;
168     typedef model::point<float, 2, cs::cartesian> f;
169     typedef model::point<int, 2, cs::cartesian> i;
170     typedef model::point<char, 2, cs::cartesian> c;
171     typedef model::point<short int, 2, cs::cartesian> s;
172     typedef model::point<boost::long_long_type, 2, cs::cartesian> ll;
173     typedef model::point<user_defined, 2, cs::cartesian> u;
174
175     // Calculation type "void" so
176     test<f, f, double, int, double>();
177     test<d, d, double, int, double>();
178     test<f, d, double, int, double>();
179
180     // FP/int mixed
181     test<i, f, double, int, double>();
182     test<s, f, double, short int, double>();
183
184     // integers
185     test<s, s, double, short int, short int>();
186     test<i, i, double, int, int>();
187     test<c, i, double, int, int>();
188     test<c, c, double, char, char>();
189     test<c, c, double, int, int>();
190     test<i, i, double, boost::long_long_type, boost::long_long_type>();
191
192     // Even if we specify "int" as default-calculation-type, it should never go downwards.
193     // So it will select "long long"
194     test<ll, ll, double, int, boost::long_long_type>();
195
196     // user defined
197     test<u, i, double, char, user_defined>();
198     test<u, d, double, double, user_defined>();
199
200     test_with_calculation_type<i, i, double, double>();
201     test_with_calculation_type<u, u, double, double>();
202
203     test_unary<i, double, int, int>();
204     test_unary<u, double, double, user_defined>();
205     test_ternary<u, u, u, double, double, user_defined>();
206
207     return 0;
208 }