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