stable_partition.pass.cpp 8.0 KB

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