1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++03, c++11, c++14
// UNSUPPORTED: libcpp-has-no-incomplete-pstl
// template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
// class Predicate, class T>
// ForwardIterator2
// replace_copy_if(ExecutionPolicy&& exec,
// ForwardIterator1 first, ForwardIterator1 last,
// ForwardIterator2 result,
// Predicate pred, const T& new_value);
#include <algorithm>
#include <array>
#include <cassert>
#include <vector>
#include "type_algorithms.h"
#include "test_execution_policies.h"
#include "test_iterators.h"
template <class Iter>
struct Test {
template <class ExecutionPolicy>
void operator()(ExecutionPolicy&& policy) {
{ // simple test
std::array a = {1, 2, 3, 4, 5, 6, 7, 8};
std::array<int, a.size()> out;
std::replace_copy_if(
policy,
Iter(std::data(a)),
Iter(std::data(a) + std::size(a)),
Iter(std::data(out)),
[](int i) { return i == 3; },
6);
assert((out == std::array{1, 2, 6, 4, 5, 6, 7, 8}));
}
{ // empty range works
std::array<int, 0> a = {};
std::replace_copy_if(
policy,
Iter(std::data(a)),
Iter(std::data(a) + std::size(a)),
Iter(std::data(a)),
[](int i) { return i == 3; },
6);
}
{ // non-empty range without a match works
std::array a = {1, 2};
std::array<int, a.size()> out;
std::replace_copy_if(
policy,
Iter(std::data(a)),
Iter(std::data(a) + std::size(a)),
Iter(out.data()),
[](int i) { return i == 3; },
6);
assert((out == std::array{1, 2}));
}
{ // single element range works
std::array a = {3};
std::array<int, a.size()> out;
std::replace_copy_if(
policy,
Iter(std::data(a)),
Iter(std::data(a) + std::size(a)),
Iter(std::data(out)),
[](int i) { return i == 3; },
6);
assert((out == std::array{6}));
}
{ // two element range works
std::array a = {3, 4};
std::array<int, a.size()> out;
std::replace_copy_if(
policy,
Iter(std::data(a)),
Iter(std::data(a) + std::size(a)),
Iter(std::data(out)),
[](int i) { return i == 3; },
6);
assert((out == std::array{6, 4}));
}
{ // multiple matching elements work
std::array a = {1, 2, 3, 4, 3, 3, 5, 6, 3};
std::array<int, a.size()> out;
std::replace_copy_if(
policy,
Iter(std::data(a)),
Iter(std::data(a) + std::size(a)),
Iter(std::data(out)),
[](int i) { return i == 3; },
9);
assert((out == std::array{1, 2, 9, 4, 9, 9, 5, 6, 9}));
}
{ // large range works
std::vector<int> a(150, 3);
std::vector<int> out(a.size());
a[45] = 5;
std::replace_copy_if(
policy,
Iter(std::data(a)),
Iter(std::data(a) + std::size(a)),
Iter(out.data()),
[](int i) { return i == 3; },
6);
std::vector<int> comp(150, 6);
comp[45] = 5;
assert(std::equal(out.begin(), out.end(), comp.begin()));
}
}
};
int main(int, char**) {
types::for_each(types::forward_iterator_list<int*>{}, TestIteratorWithPolicies<Test>{});
return 0;
}
|