partition_subrange_test.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #include <boost/config.hpp>
  2. #include <boost/algorithm/sort_subrange.hpp>
  3. #include <boost/algorithm/cxx11/is_sorted.hpp>
  4. #define BOOST_TEST_MAIN
  5. #include <boost/test/unit_test.hpp>
  6. #include <vector>
  7. #include <iostream>
  8. #if (__cplusplus >= 201103L) || defined(BOOST_NO_CXX98_RANDOM_SHUFFLE)
  9. #include <random>
  10. std::default_random_engine gen;
  11. template<typename RandomIt>
  12. void do_shuffle(RandomIt first, RandomIt last)
  13. { std::shuffle(first, last, gen); }
  14. #else
  15. template<typename RandomIt>
  16. void do_shuffle(RandomIt first, RandomIt last)
  17. { std::random_shuffle(first, last); }
  18. #endif
  19. namespace ba = boost::algorithm;
  20. template <typename Iter>
  21. void check_sequence ( Iter first, Iter last, Iter sf, Iter sl )
  22. {
  23. // for (Iter i = first; i < last; ++i) {
  24. // if (i != first) std::cout << ' ';
  25. // if (i == sf) std::cout << ">";
  26. // std::cout << *i;
  27. // if (i == sl) std::cout << "<";
  28. // }
  29. // if (sl == last) std::cout << "<";
  30. // std::cout << '\n';
  31. if (sf == sl) return;
  32. for (Iter i = first; i < sf; ++i)
  33. BOOST_CHECK(*i < *sf);
  34. for (Iter i = sf; i < sl; ++i) {
  35. if (first != sf) // if there is an element before the subrange
  36. BOOST_CHECK(*i > *(sf-1));
  37. if (last != sl) // if there is an element after the subrange
  38. BOOST_CHECK(*i < *sl);
  39. }
  40. for (Iter i = sl; i < last; ++i)
  41. BOOST_CHECK(*(sl-1) < *i);
  42. }
  43. template <typename Iter, typename Pred>
  44. void check_sequence ( Iter first, Iter last, Iter sf, Iter sl, Pred p )
  45. {
  46. if (sf == sl) return;
  47. for (Iter i = first; i < sf; ++i)
  48. BOOST_CHECK(p(*i, *sf));
  49. for (Iter i = sf; i < sl; ++i) {
  50. if (first != sf) // if there is an element before the subrange
  51. BOOST_CHECK(p(*(sf-1), *i));
  52. if (last != sl) // if there is an element after the subrange
  53. BOOST_CHECK(p(*i, *sl));
  54. }
  55. for (Iter i = sl; i < last; ++i)
  56. BOOST_CHECK(p(*(sl-1), *i));
  57. }
  58. // for ( int i = 0; i < v.size(); ++i )
  59. // std::cout << v[i] << ' ';
  60. // std::cout << std::endl;
  61. BOOST_AUTO_TEST_CASE( test_main )
  62. {
  63. {
  64. std::vector<int> v;
  65. for ( int i = 0; i < 10; ++i )
  66. v.push_back(i);
  67. const std::vector<int>::iterator b = v.begin();
  68. ba::partition_subrange(b, v.end(), b + 3, b + 6);
  69. check_sequence (b, v.end(), b + 3, b + 6);
  70. // BOOST_CHECK_EQUAL(v[3], 3);
  71. // BOOST_CHECK_EQUAL(v[4], 4);
  72. // BOOST_CHECK_EQUAL(v[5], 5);
  73. // Mix them up and try again - single element
  74. do_shuffle(v.begin(), v.end());
  75. ba::partition_subrange(b, v.end(), b + 7, b + 8);
  76. check_sequence (b, v.end(), b + 7, b + 8);
  77. // BOOST_CHECK_EQUAL(v[7], 7);
  78. // Mix them up and try again - at the end
  79. do_shuffle(v.begin(), v.end());
  80. ba::partition_subrange(b, v.end(), b + 7, v.end());
  81. check_sequence (b, v.end(), b + 7, v.end());
  82. // BOOST_CHECK_EQUAL(v[7], 7);
  83. // BOOST_CHECK_EQUAL(v[8], 8);
  84. // BOOST_CHECK_EQUAL(v[9], 9);
  85. // Mix them up and try again - at the beginning
  86. do_shuffle(v.begin(), v.end());
  87. ba::partition_subrange(b, v.end(), b, b + 2);
  88. check_sequence (b, v.end(), b, b + 2);
  89. // BOOST_CHECK_EQUAL(v[0], 0);
  90. // BOOST_CHECK_EQUAL(v[1], 1);
  91. // Mix them up and try again - empty subrange
  92. do_shuffle(v.begin(), v.end());
  93. ba::partition_subrange(b, v.end(), b, b);
  94. check_sequence (b, v.end(), b, b);
  95. // Mix them up and try again - entire subrange
  96. do_shuffle(v.begin(), v.end());
  97. ba::partition_subrange(b, v.end(), b, v.end());
  98. check_sequence (b, v.end(), b, v.end());
  99. }
  100. {
  101. std::vector<int> v;
  102. for ( int i = 0; i < 10; ++i )
  103. v.push_back(i);
  104. const std::vector<int>::iterator b = v.begin();
  105. ba::partition_subrange(b, v.end(), b + 3, b + 6, std::greater<int>());
  106. check_sequence (b, v.end(), b + 3, b + 6, std::greater<int>());
  107. // BOOST_CHECK_EQUAL(v[3], 6);
  108. // BOOST_CHECK_EQUAL(v[4], 5);
  109. // BOOST_CHECK_EQUAL(v[5], 4);
  110. // Mix them up and try again - single element
  111. do_shuffle(v.begin(), v.end());
  112. ba::partition_subrange(b, v.end(), b + 7, b + 8, std::greater<int>());
  113. check_sequence (b, v.end(), b + 7, b + 8, std::greater<int>());
  114. // BOOST_CHECK_EQUAL(v[7], 2);
  115. // Mix them up and try again - at the end
  116. do_shuffle(v.begin(), v.end());
  117. ba::partition_subrange(b, v.end(), b + 7, v.end(), std::greater<int>());
  118. check_sequence (b, v.end(), b + 7, v.end(), std::greater<int>());
  119. // BOOST_CHECK_EQUAL(v[7], 2);
  120. // BOOST_CHECK_EQUAL(v[8], 1);
  121. // BOOST_CHECK_EQUAL(v[9], 0);
  122. // Mix them up and try again - at the beginning
  123. do_shuffle(v.begin(), v.end());
  124. ba::partition_subrange(b, v.end(), b, b + 2, std::greater<int>());
  125. check_sequence (b, v.end(), b, b + 2, std::greater<int>());
  126. // BOOST_CHECK_EQUAL(v[0], 9);
  127. // BOOST_CHECK_EQUAL(v[1], 8);
  128. // Mix them up and try again - empty subrange
  129. do_shuffle(v.begin(), v.end());
  130. ba::partition_subrange(b, v.end(), b, b, std::greater<int>());
  131. check_sequence (b, v.end(), b, b, std::greater<int>());
  132. // Mix them up and try again - entire subrange
  133. do_shuffle(v.begin(), v.end());
  134. ba::partition_subrange(b, v.end(), b, v.end(), std::greater<int>());
  135. check_sequence (b, v.end(), b, v.end(), std::greater<int>());
  136. }
  137. }