distance_default_result.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Unit Test
  3. // Copyright (c) 2014, Oracle and/or its affiliates.
  4. // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
  5. // Licensed under the Boost Software License version 1.0.
  6. // http://www.boost.org/users/license.html
  7. #ifndef BOOST_TEST_MODULE
  8. #define BOOST_TEST_MODULE test_distance_default_result
  9. #endif
  10. #include <cstddef>
  11. #include <iostream>
  12. #include <boost/test/included/unit_test.hpp>
  13. #include <boost/mpl/assert.hpp>
  14. #include <boost/mpl/if.hpp>
  15. #include <boost/type_traits/is_same.hpp>
  16. #include <boost/geometry/util/calculation_type.hpp>
  17. #include <boost/geometry/geometries/point.hpp>
  18. #include <boost/geometry/geometries/segment.hpp>
  19. #include <boost/geometry/geometries/box.hpp>
  20. #include <boost/geometry/strategies/strategies.hpp>
  21. #include <boost/geometry/strategies/default_distance_result.hpp>
  22. #include <boost/geometry/strategies/default_comparable_distance_result.hpp>
  23. #if defined(HAVE_TTMATH)
  24. #include <boost/geometry/extensions/contrib/ttmath_stub.hpp>
  25. #endif
  26. namespace bg = ::boost::geometry;
  27. template <typename DefaultResult, typename ExpectedResult>
  28. struct assert_equal_types
  29. {
  30. assert_equal_types()
  31. {
  32. static const bool are_same =
  33. boost::is_same<DefaultResult, ExpectedResult>::type::value;
  34. BOOST_MPL_ASSERT_MSG((are_same),
  35. WRONG_DEFAULT_DISTANCE_RESULT,
  36. (types<DefaultResult, ExpectedResult>));
  37. }
  38. };
  39. //=========================================================================
  40. template
  41. <
  42. typename Geometry1,
  43. typename Geometry2,
  44. typename ExpectedResult,
  45. typename ExpectedComparableResult
  46. >
  47. inline void test_distance_result()
  48. {
  49. typedef typename bg::default_distance_result
  50. <
  51. Geometry1, Geometry2
  52. >::type result12;
  53. typedef typename bg::default_distance_result
  54. <
  55. Geometry2, Geometry1
  56. >::type result21;
  57. typedef typename bg::default_comparable_distance_result
  58. <
  59. Geometry1, Geometry2
  60. >::type comparable_result12;
  61. typedef typename bg::default_comparable_distance_result
  62. <
  63. Geometry2, Geometry1
  64. >::type comparable_result21;
  65. assert_equal_types<result12, ExpectedResult>();
  66. assert_equal_types<result21, ExpectedResult>();
  67. assert_equal_types<comparable_result12, ExpectedComparableResult>();
  68. assert_equal_types<comparable_result21, ExpectedComparableResult>();
  69. }
  70. //=========================================================================
  71. template
  72. <
  73. typename CoordinateType1,
  74. typename CoordinateType2,
  75. std::size_t Dimension,
  76. typename CoordinateSystem,
  77. typename ExpectedResult,
  78. typename ExpectedComparableResult = ExpectedResult
  79. >
  80. struct test_distance_result_segment
  81. {
  82. test_distance_result_segment()
  83. {
  84. typedef typename bg::model::point
  85. <
  86. CoordinateType1, Dimension, CoordinateSystem
  87. > point1;
  88. typedef typename bg::model::point
  89. <
  90. CoordinateType2, Dimension, CoordinateSystem
  91. > point2;
  92. typedef typename bg::model::segment<point1> segment1;
  93. typedef typename bg::model::segment<point2> segment2;
  94. test_distance_result
  95. <
  96. point1, point2, ExpectedResult, ExpectedComparableResult
  97. >();
  98. test_distance_result
  99. <
  100. point1, segment2, ExpectedResult, ExpectedComparableResult
  101. >();
  102. test_distance_result
  103. <
  104. point2, segment1, ExpectedResult, ExpectedComparableResult
  105. >();
  106. }
  107. };
  108. //=========================================================================
  109. template
  110. <
  111. typename CoordinateType1,
  112. typename CoordinateType2,
  113. std::size_t Dimension,
  114. typename ExpectedResult,
  115. typename ExpectedComparableResult = ExpectedResult
  116. >
  117. struct test_distance_result_box
  118. {
  119. test_distance_result_box()
  120. {
  121. typedef typename bg::model::point
  122. <
  123. CoordinateType1, Dimension, bg::cs::cartesian
  124. > point1;
  125. typedef typename bg::model::point
  126. <
  127. CoordinateType2, Dimension, bg::cs::cartesian
  128. > point2;
  129. typedef typename bg::model::box<point1> box1;
  130. typedef typename bg::model::box<point2> box2;
  131. test_distance_result
  132. <
  133. point1, box2, ExpectedResult, ExpectedComparableResult
  134. >();
  135. test_distance_result
  136. <
  137. point2, box1, ExpectedResult, ExpectedComparableResult
  138. >();
  139. test_distance_result
  140. <
  141. box1, box2, ExpectedResult, ExpectedComparableResult
  142. >();
  143. }
  144. };
  145. //=========================================================================
  146. template <std::size_t D, typename CoordinateSystem>
  147. inline void test_segment_all()
  148. {
  149. #if defined(HAVE_TTMATH)
  150. typedef ttmath_big tt;
  151. typedef bg::util::detail::default_integral::type default_integral;
  152. #endif
  153. typedef typename boost::mpl::if_
  154. <
  155. typename boost::is_same<CoordinateSystem, bg::cs::cartesian>::type,
  156. double,
  157. float
  158. >::type float_return_type;
  159. test_distance_result_segment<short, short, D, CoordinateSystem, double>();
  160. test_distance_result_segment<int, int, D, CoordinateSystem, double>();
  161. test_distance_result_segment<int, long, D, CoordinateSystem, double>();
  162. test_distance_result_segment<long, long, D, CoordinateSystem, double>();
  163. test_distance_result_segment<int, float, D, CoordinateSystem, float_return_type>();
  164. test_distance_result_segment<float, float, D, CoordinateSystem, float_return_type>();
  165. test_distance_result_segment<int, double, D, CoordinateSystem, double>();
  166. test_distance_result_segment<double, int, D, CoordinateSystem, double>();
  167. test_distance_result_segment<float, double, D, CoordinateSystem, double>();
  168. test_distance_result_segment<double, float, D, CoordinateSystem, double>();
  169. test_distance_result_segment<double, double, D, CoordinateSystem, double>();
  170. #if defined(HAVE_TTMATH)
  171. test_distance_result_segment<tt, int, D, CoordinateSystem, tt>();
  172. test_distance_result_segment<tt, default_integral, D, CoordinateSystem, tt>();
  173. test_distance_result_segment<tt, float, D, CoordinateSystem, tt>();
  174. test_distance_result_segment<tt, double, D, CoordinateSystem, tt>();
  175. test_distance_result_segment<tt, tt, D, CoordinateSystem, tt>();
  176. #endif
  177. }
  178. //=========================================================================
  179. template <std::size_t D>
  180. inline void test_box_all()
  181. {
  182. #if defined(HAVE_TTMATH)
  183. typedef ttmath_big tt;
  184. #endif
  185. typedef bg::util::detail::default_integral::type default_integral;
  186. test_distance_result_box<short, short, D, double, default_integral>();
  187. test_distance_result_box<int, int, D, double, default_integral>();
  188. test_distance_result_box<int, long, D, double, default_integral>();
  189. test_distance_result_box<long, long, D, double, default_integral>();
  190. test_distance_result_box<int, float, D, double>();
  191. test_distance_result_box<float, float, D, double>();
  192. test_distance_result_box<int, double, D, double>();
  193. test_distance_result_box<double, int, D, double>();
  194. test_distance_result_box<float, double, D, double>();
  195. test_distance_result_box<double, float, D, double>();
  196. test_distance_result_box<double, double, D, double>();
  197. #if defined(HAVE_TTMATH)
  198. test_distance_result_box<tt, int, D, tt>();
  199. test_distance_result_box<tt, default_integral, D, tt>();
  200. test_distance_result_box<tt, float, D, tt>();
  201. test_distance_result_box<tt, double, D, tt>();
  202. test_distance_result_box<tt, tt, D, tt>();
  203. #endif
  204. }
  205. //=========================================================================
  206. BOOST_AUTO_TEST_CASE( test_point_point_or_point_segment )
  207. {
  208. test_segment_all<2, bg::cs::cartesian>();
  209. test_segment_all<3, bg::cs::cartesian>();
  210. test_segment_all<4, bg::cs::cartesian>();
  211. test_segment_all<2, bg::cs::spherical_equatorial<bg::degree> >();
  212. }
  213. BOOST_AUTO_TEST_CASE( test_point_box_or_box )
  214. {
  215. test_box_all<2>();
  216. test_box_all<3>();
  217. test_box_all<4>();
  218. }