merge.pass.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is dual licensed under the MIT and the University of Illinois Open
  6. // Source Licenses. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // REQUIRES: long_tests
  11. // <algorithm>
  12. // template<InputIterator InIter1, InputIterator InIter2, typename OutIter>
  13. // requires OutputIterator<OutIter, InIter1::reference>
  14. // && OutputIterator<OutIter, InIter2::reference>
  15. // && HasLess<InIter2::value_type, InIter1::value_type>
  16. // constexpr OutIter // constexpr after C++17
  17. // merge(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, OutIter result);
  18. #include <algorithm>
  19. #include <random>
  20. #include <cassert>
  21. #include "test_macros.h"
  22. #include "test_iterators.h"
  23. // #if TEST_STD_VER > 17
  24. // TEST_CONSTEXPR bool test_constexpr() {
  25. // int ia[] = {0, 1, 2, 3, 4};
  26. // int ib[] = {2, 4, 6, 8};
  27. // int ic[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  28. // const int expected[] = {0, 1, 2, 2, 3, 4, 4, 6, 8};
  29. //
  30. // auto it = std::merge(std::begin(ia), std::end(ia), std::begin(ib), std::end(ib), std::begin(ic));
  31. // return std::distance(std::begin(ic), it) == (std::size(ia) + std::size(ib))
  32. // && *it == 0
  33. // && std::equal(std::begin(ic), it, std::begin(expected), std::end(expected))
  34. // ;
  35. // }
  36. // #endif
  37. std::mt19937 randomness;
  38. template <class InIter1, class InIter2, class OutIter>
  39. void
  40. test()
  41. {
  42. {
  43. unsigned N = 100000;
  44. int* ia = new int[N];
  45. int* ib = new int[N];
  46. int* ic = new int[2*N];
  47. for (unsigned i = 0; i < N; ++i)
  48. ia[i] = 2*i;
  49. for (unsigned i = 0; i < N; ++i)
  50. ib[i] = 2*i+1;
  51. OutIter r = std::merge(InIter1(ia), InIter1(ia+N),
  52. InIter2(ib), InIter2(ib+N), OutIter(ic));
  53. assert(base(r) == ic+2*N);
  54. assert(ic[0] == 0);
  55. assert(ic[2*N-1] == static_cast<int>(2*N-1));
  56. assert(std::is_sorted(ic, ic+2*N));
  57. delete [] ic;
  58. delete [] ib;
  59. delete [] ia;
  60. }
  61. {
  62. unsigned N = 100;
  63. int* ia = new int[N];
  64. int* ib = new int[N];
  65. int* ic = new int[2*N];
  66. for (unsigned i = 0; i < 2*N; ++i)
  67. ic[i] = i;
  68. std::shuffle(ic, ic+2*N, randomness);
  69. std::copy(ic, ic+N, ia);
  70. std::copy(ic+N, ic+2*N, ib);
  71. std::sort(ia, ia+N);
  72. std::sort(ib, ib+N);
  73. OutIter r = std::merge(InIter1(ia), InIter1(ia+N),
  74. InIter2(ib), InIter2(ib+N), OutIter(ic));
  75. assert(base(r) == ic+2*N);
  76. assert(ic[0] == 0);
  77. assert(ic[2*N-1] == static_cast<int>(2*N-1));
  78. assert(std::is_sorted(ic, ic+2*N));
  79. delete [] ic;
  80. delete [] ib;
  81. delete [] ia;
  82. }
  83. }
  84. int main()
  85. {
  86. test<input_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
  87. test<input_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
  88. test<input_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
  89. test<input_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
  90. test<input_iterator<const int*>, input_iterator<const int*>, int*>();
  91. test<input_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
  92. test<input_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
  93. test<input_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
  94. test<input_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
  95. test<input_iterator<const int*>, forward_iterator<const int*>, int*>();
  96. test<input_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
  97. test<input_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
  98. test<input_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
  99. test<input_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
  100. test<input_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
  101. test<input_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
  102. test<input_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
  103. test<input_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
  104. test<input_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
  105. test<input_iterator<const int*>, random_access_iterator<const int*>, int*>();
  106. test<input_iterator<const int*>, const int*, output_iterator<int*> >();
  107. test<input_iterator<const int*>, const int*, forward_iterator<int*> >();
  108. test<input_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
  109. test<input_iterator<const int*>, const int*, random_access_iterator<int*> >();
  110. test<input_iterator<const int*>, const int*, int*>();
  111. test<forward_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
  112. test<forward_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >();
  113. test<forward_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
  114. test<forward_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
  115. test<forward_iterator<const int*>, input_iterator<const int*>, int*>();
  116. test<forward_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
  117. test<forward_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
  118. test<forward_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
  119. test<forward_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
  120. test<forward_iterator<const int*>, forward_iterator<const int*>, int*>();
  121. test<forward_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
  122. test<forward_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
  123. test<forward_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
  124. test<forward_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
  125. test<forward_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
  126. test<forward_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
  127. test<forward_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
  128. test<forward_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
  129. test<forward_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
  130. test<forward_iterator<const int*>, random_access_iterator<const int*>, int*>();
  131. test<forward_iterator<const int*>, const int*, output_iterator<int*> >();
  132. test<forward_iterator<const int*>, const int*, forward_iterator<int*> >();
  133. test<forward_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
  134. test<forward_iterator<const int*>, const int*, random_access_iterator<int*> >();
  135. test<forward_iterator<const int*>, const int*, int*>();
  136. test<bidirectional_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
  137. test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
  138. test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
  139. test<bidirectional_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
  140. test<bidirectional_iterator<const int*>, input_iterator<const int*>, int*>();
  141. test<bidirectional_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
  142. test<bidirectional_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
  143. test<bidirectional_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
  144. test<bidirectional_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
  145. test<bidirectional_iterator<const int*>, forward_iterator<const int*>, int*>();
  146. test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
  147. test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
  148. test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
  149. test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
  150. test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
  151. test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
  152. test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
  153. test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
  154. test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
  155. test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, int*>();
  156. test<bidirectional_iterator<const int*>, const int*, output_iterator<int*> >();
  157. test<bidirectional_iterator<const int*>, const int*, forward_iterator<int*> >();
  158. test<bidirectional_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
  159. test<bidirectional_iterator<const int*>, const int*, random_access_iterator<int*> >();
  160. test<bidirectional_iterator<const int*>, const int*, int*>();
  161. test<random_access_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >();
  162. test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
  163. test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >();
  164. test<random_access_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >();
  165. test<random_access_iterator<const int*>, input_iterator<const int*>, int*>();
  166. test<random_access_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >();
  167. test<random_access_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >();
  168. test<random_access_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >();
  169. test<random_access_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >();
  170. test<random_access_iterator<const int*>, forward_iterator<const int*>, int*>();
  171. test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >();
  172. test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >();
  173. test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
  174. test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
  175. test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, int*>();
  176. test<random_access_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >();
  177. test<random_access_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >();
  178. test<random_access_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
  179. test<random_access_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >();
  180. test<random_access_iterator<const int*>, random_access_iterator<const int*>, int*>();
  181. test<random_access_iterator<const int*>, const int*, output_iterator<int*> >();
  182. test<random_access_iterator<const int*>, const int*, forward_iterator<int*> >();
  183. test<random_access_iterator<const int*>, const int*, bidirectional_iterator<int*> >();
  184. test<random_access_iterator<const int*>, const int*, random_access_iterator<int*> >();
  185. test<random_access_iterator<const int*>, const int*, int*>();
  186. test<const int*, input_iterator<const int*>, output_iterator<int*> >();
  187. test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
  188. test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >();
  189. test<const int*, input_iterator<const int*>, random_access_iterator<int*> >();
  190. test<const int*, input_iterator<const int*>, int*>();
  191. test<const int*, forward_iterator<const int*>, output_iterator<int*> >();
  192. test<const int*, forward_iterator<const int*>, forward_iterator<int*> >();
  193. test<const int*, forward_iterator<const int*>, bidirectional_iterator<int*> >();
  194. test<const int*, forward_iterator<const int*>, random_access_iterator<int*> >();
  195. test<const int*, forward_iterator<const int*>, int*>();
  196. test<const int*, bidirectional_iterator<const int*>, output_iterator<int*> >();
  197. test<const int*, bidirectional_iterator<const int*>, forward_iterator<int*> >();
  198. test<const int*, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
  199. test<const int*, bidirectional_iterator<const int*>, random_access_iterator<int*> >();
  200. test<const int*, bidirectional_iterator<const int*>, int*>();
  201. test<const int*, random_access_iterator<const int*>, output_iterator<int*> >();
  202. test<const int*, random_access_iterator<const int*>, forward_iterator<int*> >();
  203. test<const int*, random_access_iterator<const int*>, bidirectional_iterator<int*> >();
  204. test<const int*, random_access_iterator<const int*>, random_access_iterator<int*> >();
  205. test<const int*, random_access_iterator<const int*>, int*>();
  206. test<const int*, const int*, output_iterator<int*> >();
  207. test<const int*, const int*, forward_iterator<int*> >();
  208. test<const int*, const int*, bidirectional_iterator<int*> >();
  209. test<const int*, const int*, random_access_iterator<int*> >();
  210. test<const int*, const int*, int*>();
  211. #if TEST_STD_VER > 17
  212. // Not yet - waiting on std::copy
  213. // static_assert(test_constexpr());
  214. #endif
  215. }