nan_cases.hpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // Boost.Geometry
  2. // Copyright (c) 2015 Oracle and/or its affiliates.
  3. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
  4. // Use, modification and distribution is subject to the Boost Software License,
  5. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. #include <geometry_test_common.hpp>
  8. #include <boost/geometry/geometries/geometries.hpp>
  9. #include <boost/geometry/geometries/point_xy.hpp>
  10. #include <boost/range/value_type.hpp>
  11. #include <boost/type_traits/is_same.hpp>
  12. template <typename Container>
  13. struct pusher
  14. : public Container
  15. {
  16. typedef typename Container::value_type value_type;
  17. pusher(value_type const& val)
  18. {
  19. this->push_back(val);
  20. }
  21. pusher & operator()(value_type const& val)
  22. {
  23. this->push_back(val);
  24. return *this;
  25. }
  26. };
  27. template <typename Geometry,
  28. typename Tag = typename bg::tag<Geometry>::type,
  29. typename Coord = typename bg::coordinate_type<Geometry>::type>
  30. struct nan_case_generator
  31. {
  32. static void apply(Geometry & , std::string & )
  33. {}
  34. };
  35. template <typename Geometry>
  36. struct nan_case_generator<Geometry, bg::multi_linestring_tag, double>
  37. {
  38. static void apply(Geometry & geometry, std::string & wkt)
  39. {
  40. typedef typename boost::range_value<Geometry>::type ls;
  41. typedef typename bg::point_type<Geometry>::type P;
  42. typedef typename bg::coordinate_type<Geometry>::type coord_t;
  43. coord_t nan = std::numeric_limits<coord_t>::quiet_NaN();
  44. wkt = "MULTILINESTRING((3.1e+307 1,-nan -nan),(3.1e+307 1,-nan -nan),(3.1e+307 1,5.1e+307 6e+307,nan nan),(-nan -nan,nan nan),(-nan -nan,-1 -3.97843,-1 3.28571,-1 47.6364),(3 78.5455,3 2),(nan nan,3 12.9689),(3 -2,-nan -nan),(3 2,3 12.9689,3 78.5455),(-1 4.29497e+09,-1 7,-nan -nan),(9 5,-nan -nan),(-nan -nan,9 60.8755,9 124.909),(nan nan,1 6.87195e+10,-nan -nan),(nan nan,4 86.2727,4 20.9533),(4 -5,-nan -nan),(4 -5,-nan -nan),(4 -5,-nan -nan),(4 -5,1.1e+308 2.1e+307,nan nan),(-nan -nan,-1 -8),(-nan -nan,-9 -4))";
  45. typedef pusher<Geometry> ml;
  46. typedef pusher<ls> l;
  47. geometry = ml(l(P(3.1e+307, 1))(P(-nan, -nan)))
  48. (l(P(3.1e+307, 1))(P(-nan, -nan)))
  49. (l(P(3.1e+307, 1))(P(5.1e+307, 6e+307))(P(nan, nan)))
  50. (l(P(-nan, -nan))(P(nan, nan)))
  51. (l(P(-nan, -nan))(P(-1, -3.97843))(P(-1, 3.28571))(P(-1, 47.6364)))
  52. (l(P(3, 78.5455))(P(3, 2)))
  53. (l(P(nan, nan))(P(3, 12.9689)))
  54. (l(P(3, -2))(P(-nan, -nan)))
  55. (l(P(3, 2))(P(3, 12.9689))(P(3, 78.5455)))
  56. (l(P(-1, 4.29497e+09))(P(-1, 7))(P(-nan, -nan)))
  57. (l(P(9, 5))(P(-nan, -nan)))
  58. (l(P(-nan, -nan))(P(9, 60.8755))(P(9, 124.909)))
  59. (l(P(nan, nan))(P(1, 6.87195e+10))(P(-nan, -nan)))
  60. (l(P(nan, nan))(P(4, 86.2727))(P(4, 20.9533)))
  61. (l(P(4, -5))(P(-nan, -nan)))
  62. (l(P(4, -5))(P(-nan, -nan)))
  63. (l(P(4, -5))(P(-nan, -nan)))
  64. (l(P(4, -5))(P(1.1e+308, 2.1e+307))(P(nan, nan)))
  65. (l(P(-nan, -nan))(P(-1, -8)))
  66. (l(P(-nan, -nan))(P(-9, -4)));
  67. }
  68. };
  69. template <typename Geometry>
  70. struct nan_case_generator<Geometry, bg::multi_point_tag, double>
  71. {
  72. static void apply(Geometry & geometry, std::string & wkt)
  73. {
  74. typedef typename bg::point_type<Geometry>::type P;
  75. typedef typename bg::coordinate_type<Geometry>::type coord_t;
  76. coord_t nan = std::numeric_limits<coord_t>::quiet_NaN();
  77. wkt = "MULTIPOINT((3.1e+307 1),(-nan -nan),(3.1e+307 1),(-nan -nan),(3.1e+307 1),(5.1e+307 6e+307),(nan nan),(-nan -nan),(nan nan),(-nan -nan),(-1 -3.97843),(-1 3.28571),(-1 47.6364),(3 78.5455),(3 2),(nan nan),(3 12.9689),(3 -2),(-nan -nan),(3 2),(3 12.9689),(3 78.5455),(-1 4.29497e+09),(-1 7),(-nan -nan),(9 5),(-nan -nan),(-nan -nan),(9 60.8755),(9 124.909),(nan nan),(1 6.87195e+10),(-nan -nan),(nan nan),(4 86.2727),(4 20.9533),(4 -5),(-nan -nan),(4 -5),(-nan -nan),(4 -5),(-nan -nan),(4 -5),(1.1e+308 2.1e+307),(nan nan),(-nan -nan),(-1 -8),(-nan -nan),(-9 -4))";
  78. typedef pusher<Geometry> mp;
  79. geometry = mp(P(3.1e+307, 1))(P(-nan, -nan))
  80. (P(3.1e+307, 1))(P(-nan, -nan))
  81. (P(3.1e+307, 1))(P(5.1e+307, 6e+307))(P(nan, nan))
  82. (P(-nan, -nan))(P(nan, nan))
  83. (P(-nan, -nan))(P(-1, -3.97843))(P(-1, 3.28571))(P(-1, 47.6364))
  84. (P(3, 78.5455))(P(3, 2))
  85. (P(nan, nan))(P(3, 12.9689))
  86. (P(3, -2))(P(-nan, -nan))
  87. (P(3, 2))(P(3, 12.9689))(P(3, 78.5455))
  88. (P(-1, 4.29497e+09))(P(-1, 7))(P(-nan, -nan))
  89. (P(9, 5))(P(-nan, -nan))
  90. (P(-nan, -nan))(P(9, 60.8755))(P(9, 124.909))
  91. (P(nan, nan))(P(1, 6.87195e+10))(P(-nan, -nan))
  92. (P(nan, nan))(P(4, 86.2727))(P(4, 20.9533))
  93. (P(4, -5))(P(-nan, -nan))
  94. (P(4, -5))(P(-nan, -nan))
  95. (P(4, -5))(P(-nan, -nan))
  96. (P(4, -5))(P(1.1e+308, 2.1e+307))(P(nan, nan))
  97. (P(-nan, -nan))(P(-1, -8))
  98. (P(-nan, -nan))(P(-9, -4));
  99. }
  100. };
  101. template <typename Geometry>
  102. void nan_case(Geometry & geometry, std::string & wkt)
  103. {
  104. nan_case_generator<Geometry>::apply(geometry, wkt);
  105. }
  106. template <typename Geometry>
  107. struct is_nan_case_supported
  108. {
  109. typedef typename bg::coordinate_type<Geometry>::type coord_t;
  110. static const bool value = boost::is_same<coord_t, double>::value
  111. && std::numeric_limits<coord_t>::has_quiet_NaN;
  112. };