stable_partition.pass.cpp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. // <algorithm>
  9. // template<BidirectionalIterator Iter, Predicate<auto, Iter::value_type> Pred>
  10. // requires ShuffleIterator<Iter>
  11. // && CopyConstructible<Pred>
  12. // Iter
  13. // stable_partition(Iter first, Iter last, Pred pred);
  14. #include <algorithm>
  15. #include <cassert>
  16. #include <memory>
  17. #include "test_macros.h"
  18. #include "test_iterators.h"
  19. struct is_odd
  20. {
  21. bool operator()(const int& i) const {return i & 1;}
  22. };
  23. struct odd_first
  24. {
  25. bool operator()(const std::pair<int,int>& p) const
  26. {return p.first & 1;}
  27. };
  28. template <class Iter>
  29. void
  30. test()
  31. {
  32. { // check mixed
  33. typedef std::pair<int,int> P;
  34. P array[] =
  35. {
  36. P(0, 1),
  37. P(0, 2),
  38. P(1, 1),
  39. P(1, 2),
  40. P(2, 1),
  41. P(2, 2),
  42. P(3, 1),
  43. P(3, 2),
  44. P(4, 1),
  45. P(4, 2)
  46. };
  47. const unsigned size = sizeof(array)/sizeof(array[0]);
  48. Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
  49. assert(base(r) == array + 4);
  50. assert(array[0] == P(1, 1));
  51. assert(array[1] == P(1, 2));
  52. assert(array[2] == P(3, 1));
  53. assert(array[3] == P(3, 2));
  54. assert(array[4] == P(0, 1));
  55. assert(array[5] == P(0, 2));
  56. assert(array[6] == P(2, 1));
  57. assert(array[7] == P(2, 2));
  58. assert(array[8] == P(4, 1));
  59. assert(array[9] == P(4, 2));
  60. }
  61. {
  62. typedef std::pair<int,int> P;
  63. P array[] =
  64. {
  65. P(0, 1),
  66. P(0, 2),
  67. P(1, 1),
  68. P(1, 2),
  69. P(2, 1),
  70. P(2, 2),
  71. P(3, 1),
  72. P(3, 2),
  73. P(4, 1),
  74. P(4, 2)
  75. };
  76. const unsigned size = sizeof(array)/sizeof(array[0]);
  77. Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
  78. assert(base(r) == array + 4);
  79. assert(array[0] == P(1, 1));
  80. assert(array[1] == P(1, 2));
  81. assert(array[2] == P(3, 1));
  82. assert(array[3] == P(3, 2));
  83. assert(array[4] == P(0, 1));
  84. assert(array[5] == P(0, 2));
  85. assert(array[6] == P(2, 1));
  86. assert(array[7] == P(2, 2));
  87. assert(array[8] == P(4, 1));
  88. assert(array[9] == P(4, 2));
  89. // check empty
  90. r = std::stable_partition(Iter(array), Iter(array), odd_first());
  91. assert(base(r) == array);
  92. // check one true
  93. r = std::stable_partition(Iter(array), Iter(array+1), odd_first());
  94. assert(base(r) == array+1);
  95. assert(array[0] == P(1, 1));
  96. // check one false
  97. r = std::stable_partition(Iter(array+4), Iter(array+5), odd_first());
  98. assert(base(r) == array+4);
  99. assert(array[4] == P(0, 1));
  100. }
  101. { // check all false
  102. typedef std::pair<int,int> P;
  103. P array[] =
  104. {
  105. P(0, 1),
  106. P(0, 2),
  107. P(2, 1),
  108. P(2, 2),
  109. P(4, 1),
  110. P(4, 2),
  111. P(6, 1),
  112. P(6, 2),
  113. P(8, 1),
  114. P(8, 2)
  115. };
  116. const unsigned size = sizeof(array)/sizeof(array[0]);
  117. Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
  118. assert(base(r) == array);
  119. assert(array[0] == P(0, 1));
  120. assert(array[1] == P(0, 2));
  121. assert(array[2] == P(2, 1));
  122. assert(array[3] == P(2, 2));
  123. assert(array[4] == P(4, 1));
  124. assert(array[5] == P(4, 2));
  125. assert(array[6] == P(6, 1));
  126. assert(array[7] == P(6, 2));
  127. assert(array[8] == P(8, 1));
  128. assert(array[9] == P(8, 2));
  129. }
  130. { // check all true
  131. typedef std::pair<int,int> P;
  132. P array[] =
  133. {
  134. P(1, 1),
  135. P(1, 2),
  136. P(3, 1),
  137. P(3, 2),
  138. P(5, 1),
  139. P(5, 2),
  140. P(7, 1),
  141. P(7, 2),
  142. P(9, 1),
  143. P(9, 2)
  144. };
  145. const unsigned size = sizeof(array)/sizeof(array[0]);
  146. Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
  147. assert(base(r) == array + size);
  148. assert(array[0] == P(1, 1));
  149. assert(array[1] == P(1, 2));
  150. assert(array[2] == P(3, 1));
  151. assert(array[3] == P(3, 2));
  152. assert(array[4] == P(5, 1));
  153. assert(array[5] == P(5, 2));
  154. assert(array[6] == P(7, 1));
  155. assert(array[7] == P(7, 2));
  156. assert(array[8] == P(9, 1));
  157. assert(array[9] == P(9, 2));
  158. }
  159. { // check all false but first true
  160. typedef std::pair<int,int> P;
  161. P array[] =
  162. {
  163. P(1, 1),
  164. P(0, 2),
  165. P(2, 1),
  166. P(2, 2),
  167. P(4, 1),
  168. P(4, 2),
  169. P(6, 1),
  170. P(6, 2),
  171. P(8, 1),
  172. P(8, 2)
  173. };
  174. const unsigned size = sizeof(array)/sizeof(array[0]);
  175. Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
  176. assert(base(r) == array + 1);
  177. assert(array[0] == P(1, 1));
  178. assert(array[1] == P(0, 2));
  179. assert(array[2] == P(2, 1));
  180. assert(array[3] == P(2, 2));
  181. assert(array[4] == P(4, 1));
  182. assert(array[5] == P(4, 2));
  183. assert(array[6] == P(6, 1));
  184. assert(array[7] == P(6, 2));
  185. assert(array[8] == P(8, 1));
  186. assert(array[9] == P(8, 2));
  187. }
  188. { // check all false but last true
  189. typedef std::pair<int,int> P;
  190. P array[] =
  191. {
  192. P(0, 1),
  193. P(0, 2),
  194. P(2, 1),
  195. P(2, 2),
  196. P(4, 1),
  197. P(4, 2),
  198. P(6, 1),
  199. P(6, 2),
  200. P(8, 1),
  201. P(1, 2)
  202. };
  203. const unsigned size = sizeof(array)/sizeof(array[0]);
  204. Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
  205. assert(base(r) == array + 1);
  206. assert(array[0] == P(1, 2));
  207. assert(array[1] == P(0, 1));
  208. assert(array[2] == P(0, 2));
  209. assert(array[3] == P(2, 1));
  210. assert(array[4] == P(2, 2));
  211. assert(array[5] == P(4, 1));
  212. assert(array[6] == P(4, 2));
  213. assert(array[7] == P(6, 1));
  214. assert(array[8] == P(6, 2));
  215. assert(array[9] == P(8, 1));
  216. }
  217. { // check all true but first false
  218. typedef std::pair<int,int> P;
  219. P array[] =
  220. {
  221. P(0, 1),
  222. P(1, 2),
  223. P(3, 1),
  224. P(3, 2),
  225. P(5, 1),
  226. P(5, 2),
  227. P(7, 1),
  228. P(7, 2),
  229. P(9, 1),
  230. P(9, 2)
  231. };
  232. const unsigned size = sizeof(array)/sizeof(array[0]);
  233. Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
  234. assert(base(r) == array + size-1);
  235. assert(array[0] == P(1, 2));
  236. assert(array[1] == P(3, 1));
  237. assert(array[2] == P(3, 2));
  238. assert(array[3] == P(5, 1));
  239. assert(array[4] == P(5, 2));
  240. assert(array[5] == P(7, 1));
  241. assert(array[6] == P(7, 2));
  242. assert(array[7] == P(9, 1));
  243. assert(array[8] == P(9, 2));
  244. assert(array[9] == P(0, 1));
  245. }
  246. { // check all true but last false
  247. typedef std::pair<int,int> P;
  248. P array[] =
  249. {
  250. P(1, 1),
  251. P(1, 2),
  252. P(3, 1),
  253. P(3, 2),
  254. P(5, 1),
  255. P(5, 2),
  256. P(7, 1),
  257. P(7, 2),
  258. P(9, 1),
  259. P(0, 2)
  260. };
  261. const unsigned size = sizeof(array)/sizeof(array[0]);
  262. Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
  263. assert(base(r) == array + size-1);
  264. assert(array[0] == P(1, 1));
  265. assert(array[1] == P(1, 2));
  266. assert(array[2] == P(3, 1));
  267. assert(array[3] == P(3, 2));
  268. assert(array[4] == P(5, 1));
  269. assert(array[5] == P(5, 2));
  270. assert(array[6] == P(7, 1));
  271. assert(array[7] == P(7, 2));
  272. assert(array[8] == P(9, 1));
  273. assert(array[9] == P(0, 2));
  274. }
  275. }
  276. #if TEST_STD_VER >= 11
  277. struct is_null
  278. {
  279. template <class P>
  280. bool operator()(const P& p) {return p == 0;}
  281. };
  282. template <class Iter>
  283. void
  284. test1()
  285. {
  286. const unsigned size = 5;
  287. std::unique_ptr<int> array[size];
  288. Iter r = std::stable_partition(Iter(array), Iter(array+size), is_null());
  289. assert(r == Iter(array+size));
  290. }
  291. #endif // TEST_STD_VER >= 11
  292. int main(int, char**)
  293. {
  294. test<bidirectional_iterator<std::pair<int,int>*> >();
  295. test<random_access_iterator<std::pair<int,int>*> >();
  296. test<std::pair<int,int>*>();
  297. #if TEST_STD_VER >= 11
  298. test1<bidirectional_iterator<std::unique_ptr<int>*> >();
  299. #endif
  300. return 0;
  301. }