inplace_merge.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // Copyright Neil Groves 2009. Use, modification and
  2. // distribution is subject to the Boost Software License, Version
  3. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. //
  6. //
  7. // For more information, see http://www.boost.org/libs/range/
  8. //
  9. #include <boost/range/algorithm/inplace_merge.hpp>
  10. #include <boost/test/test_tools.hpp>
  11. #include <boost/test/unit_test.hpp>
  12. #include <boost/assign.hpp>
  13. #include <boost/bind.hpp>
  14. #include <algorithm>
  15. #include <functional>
  16. #include <list>
  17. #include <numeric>
  18. #include <deque>
  19. #include <vector>
  20. namespace boost
  21. {
  22. namespace
  23. {
  24. template<class Container1, class Container2>
  25. void test(Container1& cont1, Container2& cont2)
  26. {
  27. typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t;
  28. typedef BOOST_DEDUCED_TYPENAME std::vector<value_t>::iterator
  29. iterator_t BOOST_RANGE_UNUSED;
  30. std::vector<value_t> reference_target(cont1.begin(), cont1.end());
  31. reference_target.insert(reference_target.end(),
  32. cont2.begin(), cont2.end());
  33. std::vector<value_t> test_target(reference_target);
  34. std::vector<value_t> test_target2(reference_target);
  35. std::inplace_merge(reference_target.begin(),
  36. reference_target.begin() + cont1.size(),
  37. reference_target.end());
  38. boost::inplace_merge(test_target,
  39. test_target.begin() + cont1.size());
  40. BOOST_CHECK_EQUAL_COLLECTIONS(
  41. reference_target.begin(), reference_target.end(),
  42. test_target.begin(), test_target.end()
  43. );
  44. boost::inplace_merge(boost::make_iterator_range(test_target2),
  45. test_target2.begin() + cont1.size());
  46. BOOST_CHECK_EQUAL_COLLECTIONS(
  47. reference_target.begin(), reference_target.end(),
  48. test_target2.begin(), test_target2.end()
  49. );
  50. }
  51. template<class Container, class BinaryPredicate>
  52. void sort_container(Container& cont, BinaryPredicate pred)
  53. {
  54. typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t;
  55. std::vector<value_t> temp(cont.begin(), cont.end());
  56. std::sort(temp.begin(), temp.end(), pred);
  57. cont.assign(temp.begin(), temp.end());
  58. }
  59. template<class Container1,
  60. class Container2,
  61. class BinaryPredicate>
  62. void test_pred(Container1 cont1, Container2 cont2, BinaryPredicate pred)
  63. {
  64. typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t;
  65. typedef BOOST_DEDUCED_TYPENAME std::vector<value_t>::iterator
  66. iterator_t BOOST_RANGE_UNUSED;
  67. sort_container(cont1, pred);
  68. sort_container(cont2, pred);
  69. std::vector<value_t> reference_target(cont1.begin(), cont1.end());
  70. reference_target.insert(reference_target.end(),
  71. cont2.begin(), cont2.end());
  72. std::vector<value_t> test_target(reference_target);
  73. std::vector<value_t> test_target2(reference_target);
  74. std::inplace_merge(reference_target.begin(),
  75. reference_target.begin() + cont1.size(),
  76. reference_target.end(), pred);
  77. boost::inplace_merge(test_target,
  78. test_target.begin() + cont1.size(),
  79. pred);
  80. BOOST_CHECK_EQUAL_COLLECTIONS(
  81. reference_target.begin(), reference_target.end(),
  82. test_target.begin(), test_target.end()
  83. );
  84. boost::inplace_merge(boost::make_iterator_range(test_target2),
  85. test_target2.begin() + cont1.size(),
  86. pred);
  87. BOOST_CHECK_EQUAL_COLLECTIONS(
  88. reference_target.begin(), reference_target.end(),
  89. test_target2.begin(), test_target2.end()
  90. );
  91. }
  92. template<class Container1, class Container2>
  93. void test_inplace_merge_impl(Container1& cont1, Container2& cont2)
  94. {
  95. test(cont1, cont2);
  96. test_pred(cont1, cont2, std::less<int>());
  97. test_pred(cont1, cont2, std::greater<int>());
  98. }
  99. template<class Container1, class Container2>
  100. void test_inplace_merge_impl()
  101. {
  102. using namespace boost::assign;
  103. Container1 cont1;
  104. Container2 cont2;
  105. test_inplace_merge_impl(cont1, cont2);
  106. cont1.clear();
  107. cont2.clear();
  108. cont1 += 1;
  109. test_inplace_merge_impl(cont1, cont2);
  110. cont1.clear();
  111. cont2.clear();
  112. cont2 += 1;
  113. test_inplace_merge_impl(cont1, cont2);
  114. cont1.clear();
  115. cont2.clear();
  116. cont1 += 1,3,5,7,9,11,13,15,17,19;
  117. cont2 += 2,4,6,8,10,12,14,16,18,20;
  118. test_inplace_merge_impl(cont1, cont2);
  119. }
  120. void test_inplace_merge()
  121. {
  122. test_inplace_merge_impl< std::vector<int>, std::vector<int> >();
  123. }
  124. }
  125. }
  126. boost::unit_test::test_suite*
  127. init_unit_test_suite(int argc, char* argv[])
  128. {
  129. boost::unit_test::test_suite* test
  130. = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.inplace_merge" );
  131. test->add( BOOST_TEST_CASE( &boost::test_inplace_merge ) );
  132. return test;
  133. }