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