partition.pass.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. // partition(Iter first, Iter last, Pred pred);
  14. #include <algorithm>
  15. #include <cassert>
  16. #include "test_macros.h"
  17. #include "test_iterators.h"
  18. struct is_odd
  19. {
  20. bool operator()(const int& i) const {return i & 1;}
  21. };
  22. template <class Iter>
  23. void
  24. test()
  25. {
  26. // check mixed
  27. int ia[] = {1, 2, 3, 4, 5, 6, 7, 8 ,9};
  28. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  29. Iter r = std::partition(Iter(ia), Iter(ia + sa), is_odd());
  30. assert(base(r) == ia + 5);
  31. for (int* i = ia; i < base(r); ++i)
  32. assert(is_odd()(*i));
  33. for (int* i = base(r); i < ia+sa; ++i)
  34. assert(!is_odd()(*i));
  35. // check empty
  36. r = std::partition(Iter(ia), Iter(ia), is_odd());
  37. assert(base(r) == ia);
  38. // check all false
  39. for (unsigned i = 0; i < sa; ++i)
  40. ia[i] = 2*i;
  41. r = std::partition(Iter(ia), Iter(ia+sa), is_odd());
  42. assert(base(r) == ia);
  43. // check all true
  44. for (unsigned i = 0; i < sa; ++i)
  45. ia[i] = 2*i+1;
  46. r = std::partition(Iter(ia), Iter(ia+sa), is_odd());
  47. assert(base(r) == ia+sa);
  48. // check all true but last
  49. for (unsigned i = 0; i < sa; ++i)
  50. ia[i] = 2*i+1;
  51. ia[sa-1] = 10;
  52. r = std::partition(Iter(ia), Iter(ia+sa), is_odd());
  53. assert(base(r) == ia+sa-1);
  54. for (int* i = ia; i < base(r); ++i)
  55. assert(is_odd()(*i));
  56. for (int* i = base(r); i < ia+sa; ++i)
  57. assert(!is_odd()(*i));
  58. // check all true but first
  59. for (unsigned i = 0; i < sa; ++i)
  60. ia[i] = 2*i+1;
  61. ia[0] = 10;
  62. r = std::partition(Iter(ia), Iter(ia+sa), is_odd());
  63. assert(base(r) == ia+sa-1);
  64. for (int* i = ia; i < base(r); ++i)
  65. assert(is_odd()(*i));
  66. for (int* i = base(r); i < ia+sa; ++i)
  67. assert(!is_odd()(*i));
  68. // check all false but last
  69. for (unsigned i = 0; i < sa; ++i)
  70. ia[i] = 2*i;
  71. ia[sa-1] = 11;
  72. r = std::partition(Iter(ia), Iter(ia+sa), is_odd());
  73. assert(base(r) == ia+1);
  74. for (int* i = ia; i < base(r); ++i)
  75. assert(is_odd()(*i));
  76. for (int* i = base(r); i < ia+sa; ++i)
  77. assert(!is_odd()(*i));
  78. // check all false but first
  79. for (unsigned i = 0; i < sa; ++i)
  80. ia[i] = 2*i;
  81. ia[0] = 11;
  82. r = std::partition(Iter(ia), Iter(ia+sa), is_odd());
  83. assert(base(r) == ia+1);
  84. for (int* i = ia; i < base(r); ++i)
  85. assert(is_odd()(*i));
  86. for (int* i = base(r); i < ia+sa; ++i)
  87. assert(!is_odd()(*i));
  88. }
  89. int main(int, char**)
  90. {
  91. test<bidirectional_iterator<int*> >();
  92. test<random_access_iterator<int*> >();
  93. test<int*>();
  94. return 0;
  95. }