thrust / dependencies /libcudacxx /libcxx /test /std /algorithms /alg.modifying.operations /alg.partitions /partition.pass.cpp
| //===----------------------------------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // <algorithm> | |
| // template<BidirectionalIterator Iter, Predicate<auto, Iter::value_type> Pred> | |
| // requires ShuffleIterator<Iter> | |
| // && CopyConstructible<Pred> | |
| // Iter | |
| // partition(Iter first, Iter last, Pred pred); | |
| struct is_odd | |
| { | |
| bool operator()(const int& i) const {return i & 1;} | |
| }; | |
| template <class Iter> | |
| void | |
| test() | |
| { | |
| // check mixed | |
| int ia[] = {1, 2, 3, 4, 5, 6, 7, 8 ,9}; | |
| const unsigned sa = sizeof(ia)/sizeof(ia[0]); | |
| Iter r = std::partition(Iter(ia), Iter(ia + sa), is_odd()); | |
| assert(base(r) == ia + 5); | |
| for (int* i = ia; i < base(r); ++i) | |
| assert(is_odd()(*i)); | |
| for (int* i = base(r); i < ia+sa; ++i) | |
| assert(!is_odd()(*i)); | |
| // check empty | |
| r = std::partition(Iter(ia), Iter(ia), is_odd()); | |
| assert(base(r) == ia); | |
| // check all false | |
| for (unsigned i = 0; i < sa; ++i) | |
| ia[i] = 2*i; | |
| r = std::partition(Iter(ia), Iter(ia+sa), is_odd()); | |
| assert(base(r) == ia); | |
| // check all true | |
| for (unsigned i = 0; i < sa; ++i) | |
| ia[i] = 2*i+1; | |
| r = std::partition(Iter(ia), Iter(ia+sa), is_odd()); | |
| assert(base(r) == ia+sa); | |
| // check all true but last | |
| for (unsigned i = 0; i < sa; ++i) | |
| ia[i] = 2*i+1; | |
| ia[sa-1] = 10; | |
| r = std::partition(Iter(ia), Iter(ia+sa), is_odd()); | |
| assert(base(r) == ia+sa-1); | |
| for (int* i = ia; i < base(r); ++i) | |
| assert(is_odd()(*i)); | |
| for (int* i = base(r); i < ia+sa; ++i) | |
| assert(!is_odd()(*i)); | |
| // check all true but first | |
| for (unsigned i = 0; i < sa; ++i) | |
| ia[i] = 2*i+1; | |
| ia[0] = 10; | |
| r = std::partition(Iter(ia), Iter(ia+sa), is_odd()); | |
| assert(base(r) == ia+sa-1); | |
| for (int* i = ia; i < base(r); ++i) | |
| assert(is_odd()(*i)); | |
| for (int* i = base(r); i < ia+sa; ++i) | |
| assert(!is_odd()(*i)); | |
| // check all false but last | |
| for (unsigned i = 0; i < sa; ++i) | |
| ia[i] = 2*i; | |
| ia[sa-1] = 11; | |
| r = std::partition(Iter(ia), Iter(ia+sa), is_odd()); | |
| assert(base(r) == ia+1); | |
| for (int* i = ia; i < base(r); ++i) | |
| assert(is_odd()(*i)); | |
| for (int* i = base(r); i < ia+sa; ++i) | |
| assert(!is_odd()(*i)); | |
| // check all false but first | |
| for (unsigned i = 0; i < sa; ++i) | |
| ia[i] = 2*i; | |
| ia[0] = 11; | |
| r = std::partition(Iter(ia), Iter(ia+sa), is_odd()); | |
| assert(base(r) == ia+1); | |
| for (int* i = ia; i < base(r); ++i) | |
| assert(is_odd()(*i)); | |
| for (int* i = base(r); i < ia+sa; ++i) | |
| assert(!is_odd()(*i)); | |
| } | |
| int main(int, char**) | |
| { | |
| test<bidirectional_iterator<int*> >(); | |
| test<random_access_iterator<int*> >(); | |
| test<int*>(); | |
| return 0; | |
| } | |