brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 99f9adf Raw
111 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<ForwardIterator Iter, Predicate<auto, Iter::value_type> Pred>12//   requires OutputIterator<Iter, RvalueOf<Iter::reference>::type>13//         && CopyConstructible<Pred>14//   constexpr Iter         // constexpr after C++1715//   remove_if(Iter first, Iter last, Pred pred);16 17#include <algorithm>18#include <functional>19#include <cassert>20#include <memory>21 22#include "test_macros.h"23#include "test_iterators.h"24#include "counting_predicates.h"25 26TEST_CONSTEXPR bool equal2 ( int i ) { return i == 2; }27 28#if TEST_STD_VER > 1729TEST_CONSTEXPR bool test_constexpr() {30    int ia[] = {1, 3, 5, 2, 5, 6};31 32    auto it = std::remove_if(std::begin(ia), std::end(ia), equal2);33 34    return (std::begin(ia) + std::size(ia) - 1) == it  // we removed one element35        && std::none_of(std::begin(ia), it, equal2)36           ;37    }38#endif39 40template <class Iter>41void42test()43{44    int ia[] = {0, 1, 2, 3, 4, 2, 3, 4, 2};45    const unsigned sa = sizeof(ia)/sizeof(ia[0]);46//     int* r = std::remove_if(ia, ia+sa, std::bind2nd(std::equal_to<int>(), 2));47    unary_counting_predicate<bool(*)(int), int> cp(equal2);48    int* r = std::remove_if(ia, ia+sa, std::ref(cp));49    assert(r == ia + sa-3);50    assert(ia[0] == 0);51    assert(ia[1] == 1);52    assert(ia[2] == 3);53    assert(ia[3] == 4);54    assert(ia[4] == 3);55    assert(ia[5] == 4);56    assert(cp.count() == sa);57}58 59#if TEST_STD_VER >= 1160struct pred61{62    bool operator()(const std::unique_ptr<int>& i) {return *i == 2;}63};64 65template <class Iter>66void67test1()68{69    const unsigned sa = 9;70    std::unique_ptr<int> ia[sa];71    ia[0].reset(new int(0));72    ia[1].reset(new int(1));73    ia[2].reset(new int(2));74    ia[3].reset(new int(3));75    ia[4].reset(new int(4));76    ia[5].reset(new int(2));77    ia[6].reset(new int(3));78    ia[7].reset(new int(4));79    ia[8].reset(new int(2));80    Iter r = std::remove_if(Iter(ia), Iter(ia+sa), pred());81    assert(base(r) == ia + sa-3);82    assert(*ia[0] == 0);83    assert(*ia[1] == 1);84    assert(*ia[2] == 3);85    assert(*ia[3] == 4);86    assert(*ia[4] == 3);87    assert(*ia[5] == 4);88}89#endif // TEST_STD_VER >= 1190 91int main(int, char**)92{93    test<forward_iterator<int*> >();94    test<bidirectional_iterator<int*> >();95    test<random_access_iterator<int*> >();96    test<int*>();97 98#if TEST_STD_VER >= 1199    test1<forward_iterator<std::unique_ptr<int>*> >();100    test1<bidirectional_iterator<std::unique_ptr<int>*> >();101    test1<random_access_iterator<std::unique_ptr<int>*> >();102    test1<std::unique_ptr<int>*>();103#endif // TEST_STD_VER >= 11104 105#if TEST_STD_VER > 17106    static_assert(test_constexpr());107#endif108 109  return 0;110}111