sort_subrange_test.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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. if (sf == sl) return;
  24. for (Iter i = first; i < sf; ++i)
  25. BOOST_CHECK(*i < *sf);
  26. BOOST_CHECK(ba::is_sorted(sf, sl));
  27. for (Iter i = sl; i < last; ++i)
  28. BOOST_CHECK(*(sl-1) < *i);
  29. }
  30. template <typename Iter, typename Pred>
  31. void check_sequence ( Iter first, Iter last, Iter sf, Iter sl, Pred p )
  32. {
  33. if (sf == sl) return;
  34. for (Iter i = first; i < sf; ++i)
  35. BOOST_CHECK(p(*i, *sf));
  36. BOOST_CHECK(ba::is_sorted(sf, sl, p));
  37. for (Iter i = sl; i < last; ++i)
  38. BOOST_CHECK(p(*(sl-1), *i));
  39. }
  40. // for ( int i = 0; i < v.size(); ++i )
  41. // std::cout << v[i] << ' ';
  42. // std::cout << std::endl;
  43. BOOST_AUTO_TEST_CASE( test_main )
  44. {
  45. {
  46. std::vector<int> v;
  47. for ( int i = 0; i < 10; ++i )
  48. v.push_back(i);
  49. const std::vector<int>::iterator b = v.begin();
  50. ba::sort_subrange(b, v.end(), b + 3, b + 6);
  51. check_sequence (b, v.end(), b + 3, b + 6);
  52. BOOST_CHECK_EQUAL(v[3], 3);
  53. BOOST_CHECK_EQUAL(v[4], 4);
  54. BOOST_CHECK_EQUAL(v[5], 5);
  55. // Mix them up and try again - single element
  56. do_shuffle(v.begin(), v.end());
  57. ba::sort_subrange(b, v.end(), b + 7, b + 8);
  58. check_sequence (b, v.end(), b + 7, b + 8);
  59. BOOST_CHECK_EQUAL(v[7], 7);
  60. // Mix them up and try again - at the end
  61. do_shuffle(v.begin(), v.end());
  62. ba::sort_subrange(b, v.end(), b + 7, v.end());
  63. check_sequence (b, v.end(), b + 7, v.end());
  64. BOOST_CHECK_EQUAL(v[7], 7);
  65. BOOST_CHECK_EQUAL(v[8], 8);
  66. BOOST_CHECK_EQUAL(v[9], 9);
  67. // Mix them up and try again - at the beginning
  68. do_shuffle(v.begin(), v.end());
  69. ba::sort_subrange(b, v.end(), b, b + 2);
  70. check_sequence (b, v.end(), b, b + 2);
  71. BOOST_CHECK_EQUAL(v[0], 0);
  72. BOOST_CHECK_EQUAL(v[1], 1);
  73. // Mix them up and try again - empty subrange
  74. do_shuffle(v.begin(), v.end());
  75. ba::sort_subrange(b, v.end(), b, b);
  76. check_sequence (b, v.end(), b, b);
  77. // Mix them up and try again - entire subrange
  78. do_shuffle(v.begin(), v.end());
  79. ba::sort_subrange(b, v.end(), b, v.end());
  80. check_sequence (b, v.end(), b, v.end());
  81. }
  82. {
  83. std::vector<int> v;
  84. for ( int i = 0; i < 10; ++i )
  85. v.push_back(i);
  86. const std::vector<int>::iterator b = v.begin();
  87. ba::sort_subrange(b, v.end(), b + 3, b + 6, std::greater<int>());
  88. check_sequence (b, v.end(), b + 3, b + 6, std::greater<int>());
  89. BOOST_CHECK_EQUAL(v[3], 6);
  90. BOOST_CHECK_EQUAL(v[4], 5);
  91. BOOST_CHECK_EQUAL(v[5], 4);
  92. // Mix them up and try again - single element
  93. do_shuffle(v.begin(), v.end());
  94. ba::sort_subrange(b, v.end(), b + 7, b + 8, std::greater<int>());
  95. check_sequence (b, v.end(), b + 7, b + 8, std::greater<int>());
  96. BOOST_CHECK_EQUAL(v[7], 2);
  97. // Mix them up and try again - at the end
  98. do_shuffle(v.begin(), v.end());
  99. ba::sort_subrange(b, v.end(), b + 7, v.end(), std::greater<int>());
  100. check_sequence (b, v.end(), b + 7, v.end(), std::greater<int>());
  101. BOOST_CHECK_EQUAL(v[7], 2);
  102. BOOST_CHECK_EQUAL(v[8], 1);
  103. BOOST_CHECK_EQUAL(v[9], 0);
  104. // Mix them up and try again - at the beginning
  105. do_shuffle(v.begin(), v.end());
  106. ba::sort_subrange(b, v.end(), b, b + 2, std::greater<int>());
  107. check_sequence (b, v.end(), b, b + 2, std::greater<int>());
  108. BOOST_CHECK_EQUAL(v[0], 9);
  109. BOOST_CHECK_EQUAL(v[1], 8);
  110. // Mix them up and try again - empty subrange
  111. do_shuffle(v.begin(), v.end());
  112. ba::sort_subrange(b, v.end(), b, b, std::greater<int>());
  113. check_sequence (b, v.end(), b, b, std::greater<int>());
  114. // Mix them up and try again - entire subrange
  115. do_shuffle(v.begin(), v.end());
  116. ba::sort_subrange(b, v.end(), b, v.end(), std::greater<int>());
  117. check_sequence (b, v.end(), b, v.end(), std::greater<int>());
  118. }
  119. }