partition.pass.cpp 3.0 KB

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