brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · 87beba1 Raw
115 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// <algorithm>10 11// template<BidirectionalIterator Iter, Predicate<auto, Iter::value_type> Pred>12//   requires ShuffleIterator<Iter>13//         && CopyConstructible<Pred>14//   constexpr Iter  // constexpr in C++2015//   partition(Iter first, Iter last, Pred pred);16 17#include <algorithm>18#include <cassert>19 20 21#include "test_macros.h"22#include "test_iterators.h"23 24struct is_odd25{26    TEST_CONSTEXPR bool operator()(const int& i) const {return i & 1;}27};28 29template <class Iter>30TEST_CONSTEXPR_CXX20 bool31test()32{33    // check mixed34    int ia[] = {1, 2, 3, 4, 5, 6, 7, 8 ,9};35    const unsigned sa = sizeof(ia)/sizeof(ia[0]);36    Iter r = std::partition(Iter(ia), Iter(ia + sa), is_odd());37    assert(base(r) == ia + 5);38    for (int* i = ia; i < base(r); ++i)39        assert(is_odd()(*i));40    for (int* i = base(r); i < ia+sa; ++i)41        assert(!is_odd()(*i));42    // check empty43    r = std::partition(Iter(ia), Iter(ia), is_odd());44    assert(base(r) == ia);45    // check all false46    for (unsigned i = 0; i < sa; ++i)47        ia[i] = 2*i;48    r = std::partition(Iter(ia), Iter(ia+sa), is_odd());49    assert(base(r) == ia);50    // check all true51    for (unsigned i = 0; i < sa; ++i)52        ia[i] = 2*i+1;53    r = std::partition(Iter(ia), Iter(ia+sa), is_odd());54    assert(base(r) == ia+sa);55    // check all true but last56    for (unsigned i = 0; i < sa; ++i)57        ia[i] = 2*i+1;58    ia[sa-1] = 10;59    r = std::partition(Iter(ia), Iter(ia+sa), is_odd());60    assert(base(r) == ia+sa-1);61    for (int* i = ia; i < base(r); ++i)62        assert(is_odd()(*i));63    for (int* i = base(r); i < ia+sa; ++i)64        assert(!is_odd()(*i));65    // check all true but first66    for (unsigned i = 0; i < sa; ++i)67        ia[i] = 2*i+1;68    ia[0] = 10;69    r = std::partition(Iter(ia), Iter(ia+sa), is_odd());70    assert(base(r) == ia+sa-1);71    for (int* i = ia; i < base(r); ++i)72        assert(is_odd()(*i));73    for (int* i = base(r); i < ia+sa; ++i)74        assert(!is_odd()(*i));75    // check all false but last76    for (unsigned i = 0; i < sa; ++i)77        ia[i] = 2*i;78    ia[sa-1] = 11;79    r = std::partition(Iter(ia), Iter(ia+sa), is_odd());80    assert(base(r) == ia+1);81    for (int* i = ia; i < base(r); ++i)82        assert(is_odd()(*i));83    for (int* i = base(r); i < ia+sa; ++i)84        assert(!is_odd()(*i));85    // check all false but first86    for (unsigned i = 0; i < sa; ++i)87        ia[i] = 2*i;88    ia[0] = 11;89    r = std::partition(Iter(ia), Iter(ia+sa), is_odd());90    assert(base(r) == ia+1);91    for (int* i = ia; i < base(r); ++i)92        assert(is_odd()(*i));93    for (int* i = base(r); i < ia+sa; ++i)94        assert(!is_odd()(*i));95 96    return true;97}98 99int main(int, char**)100{101    test<forward_iterator<int*> >();102    test<bidirectional_iterator<int*> >();103    test<random_access_iterator<int*> >();104    test<int*>();105 106#if TEST_STD_VER >= 20107    static_assert(test<forward_iterator<int*>>());108    static_assert(test<bidirectional_iterator<int*>>());109    static_assert(test<random_access_iterator<int*>>());110    static_assert(test<int*>());111#endif112 113    return 0;114}115