reversible_closeable.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Unit Test
  3. // Copyright (c) 2010-2012 Barend Gehrels, Amsterdam, the Netherlands.
  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 <algorithm>
  8. #include <iterator>
  9. #include <sstream>
  10. #include <string>
  11. #include <geometry_test_common.hpp>
  12. #include <boost/geometry/views/closeable_view.hpp>
  13. #include <boost/geometry/views/reversible_view.hpp>
  14. #include <boost/geometry/io/wkt/read.hpp>
  15. #include <boost/geometry/io/dsv/write.hpp>
  16. #include <boost/geometry/geometries/geometries.hpp>
  17. #include <boost/geometry/geometries/point_xy.hpp>
  18. #include <boost/geometry/geometries/adapted/boost_tuple.hpp>
  19. BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian)
  20. template <typename View>
  21. void test_option(View const& view, std::string const& expected)
  22. {
  23. bool first = true;
  24. std::ostringstream out;
  25. typedef typename boost::range_iterator<View const>::type iterator;
  26. iterator end = boost::end(view);
  27. for (iterator it = boost::begin(view); it != end; ++it, first = false)
  28. {
  29. out << (first ? "" : " ") << bg::dsv(*it);
  30. }
  31. BOOST_CHECK_EQUAL(out.str(), expected);
  32. }
  33. template <bg::closure_selector Closure, bg::iterate_direction Direction, typename Range>
  34. void test_close_reverse(Range const& range, std::string const& expected)
  35. {
  36. typedef typename bg::reversible_view<Range const, Direction>::type rview;
  37. typedef typename bg::closeable_view<rview const, Closure>::type cview;
  38. rview view1(range);
  39. cview view2(view1);
  40. test_option(view2, expected);
  41. }
  42. template <bg::iterate_direction Direction, bg::closure_selector Closure, typename Range>
  43. void test_reverse_close(Range const& range, std::string const& expected)
  44. {
  45. typedef typename bg::closeable_view<Range const, Closure>::type cview;
  46. typedef typename bg::reversible_view<cview const, Direction>::type rview;
  47. cview view1(range);
  48. rview view2(view1);
  49. test_option(view2, expected);
  50. }
  51. template
  52. <
  53. bg::iterate_direction Direction1,
  54. bg::iterate_direction Direction2,
  55. typename Range
  56. >
  57. void test_reverse_reverse(Range const& range, std::string const& expected)
  58. {
  59. typedef typename bg::reversible_view<Range const, Direction1>::type rview1;
  60. typedef typename bg::reversible_view<rview1 const, Direction2>::type rview2;
  61. rview1 view1(range);
  62. rview2 view2(view1);
  63. test_option(view2, expected);
  64. }
  65. template
  66. <
  67. bg::closure_selector Closure1,
  68. bg::closure_selector Closure2,
  69. typename Range
  70. >
  71. void test_close_close(Range const& range, std::string const& expected)
  72. {
  73. typedef typename bg::closeable_view<Range const, Closure1>::type cview1;
  74. typedef typename bg::closeable_view<cview1 const, Closure2>::type cview2;
  75. cview1 view1(range);
  76. cview2 view2(view1);
  77. test_option(view2, expected);
  78. }
  79. template <typename Geometry>
  80. void test_geometry(std::string const& wkt,
  81. std::string const& expected_n,
  82. std::string const& expected_r,
  83. std::string const& closing,
  84. std::string const& rclosing
  85. )
  86. {
  87. std::string expected;
  88. Geometry geo;
  89. bg::read_wkt(wkt, geo);
  90. test_close_reverse<bg::closed, bg::iterate_forward>(geo, expected_n);
  91. test_close_reverse<bg::open, bg::iterate_forward>(geo, expected_n + closing);
  92. test_close_reverse<bg::closed, bg::iterate_reverse>(geo, expected_r);
  93. // 13-12-2010, this case was problematic in MSVC
  94. // SOLVED: caused by IMPLICIT constructor! It is now explicit and should be kept like that.
  95. test_close_reverse<bg::open, bg::iterate_reverse>(geo, expected_r + rclosing);
  96. test_reverse_close<bg::iterate_forward, bg::closed>(geo, expected_n);
  97. test_reverse_close<bg::iterate_forward, bg::open>(geo, expected_n + closing);
  98. test_reverse_close<bg::iterate_reverse, bg::closed>(geo, expected_r);
  99. // first closed, then reversed:
  100. expected = boost::trim_copy(closing + " " + expected_r);
  101. test_reverse_close<bg::iterate_reverse, bg::open>(geo, expected);
  102. test_reverse_reverse<bg::iterate_forward, bg::iterate_forward>(geo, expected_n);
  103. test_reverse_reverse<bg::iterate_reverse, bg::iterate_reverse>(geo, expected_n);
  104. test_reverse_reverse<bg::iterate_forward, bg::iterate_reverse>(geo, expected_r);
  105. test_reverse_reverse<bg::iterate_reverse, bg::iterate_forward>(geo, expected_r);
  106. test_close_close<bg::closed, bg::closed>(geo, expected_n);
  107. test_close_close<bg::open, bg::closed>(geo, expected_n + closing);
  108. test_close_close<bg::closed, bg::open>(geo, expected_n + closing);
  109. test_close_close<bg::open, bg::open>(geo, expected_n + closing + closing);
  110. }
  111. template <typename P>
  112. void test_all()
  113. {
  114. test_geometry<bg::model::ring<P> >(
  115. "POLYGON((1 1,1 4,4 4,4 1))",
  116. "(1, 1) (1, 4) (4, 4) (4, 1)",
  117. "(4, 1) (4, 4) (1, 4) (1, 1)",
  118. " (1, 1)", // closing
  119. " (4, 1)" // rclosing
  120. );
  121. }
  122. int test_main(int, char* [])
  123. {
  124. test_all<bg::model::d2::point_xy<double> >();
  125. test_all<bg::model::point<int, 2, bg::cs::cartesian> >();
  126. test_all<boost::tuple<double, double> >();
  127. return 0;
  128. }