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>
helper()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>
helper3()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 >
test()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 >
test_with_calculation_type()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 >
test_unary()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 >
test_ternary()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
test_main(int,char * [])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 }
209