calculation_type.cpp 5.8 KB

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