2 //===-- replace_copy.pass.cpp ---------------------------------------------===//
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 // UNSUPPORTED: c++03, c++11, c++14
12 // Tests for replace_copy and replace_copy_if
14 #include "support/pstl_test_config.h"
19 #include "support/utils.h"
21 using namespace TestUtils
;
23 struct test_replace_copy
25 template <typename Policy
, typename InputIterator
, typename OutputIterator
, typename OutputIterator2
, typename Size
,
26 typename Predicate
, typename T
>
28 operator()(Policy
&& exec
, InputIterator first
, InputIterator last
, OutputIterator out_first
,
29 OutputIterator out_last
, OutputIterator2 expected_first
, OutputIterator2
, Size n
, Predicate pred
,
30 const T
& old_value
, const T
& new_value
, T trash
)
33 std::fill_n(expected_first
, n
, trash
);
34 std::fill_n(out_first
, n
, trash
);
36 auto i
= std::replace_copy(first
, last
, expected_first
, old_value
, new_value
);
37 auto k
= std::replace_copy(exec
, first
, last
, out_first
, old_value
, new_value
);
38 EXPECT_EQ_N(expected_first
, out_first
, n
, "wrong replace_copy effect");
39 EXPECT_TRUE(out_last
== k
, "wrong return value from replace_copy");
42 std::fill_n(expected_first
, n
, trash
);
43 std::fill_n(out_first
, n
, trash
);
44 // Run replace_copy_if
45 i
= replace_copy_if(first
, last
, expected_first
, pred
, new_value
);
46 k
= replace_copy_if(exec
, first
, last
, out_first
, pred
, new_value
);
47 EXPECT_EQ_N(expected_first
, out_first
, n
, "wrong replace_copy_if effect");
48 EXPECT_TRUE(out_last
== k
, "wrong return value from replace_copy_if");
52 template <typename T
, typename Convert
, typename Predicate
>
54 test(T trash
, const T
& old_value
, const T
& new_value
, Predicate pred
, Convert convert
)
56 // Try sequences of various lengths.
57 for (size_t n
= 0; n
<= 100000; n
= n
<= 16 ? n
+ 1 : size_t(3.1415 * n
))
59 Sequence
<T
> in(n
, [&](size_t k
) -> T
{ return convert(n
^ k
); });
60 Sequence
<T
> out(n
, [=](size_t) { return trash
; });
61 Sequence
<T
> expected(n
, [=](size_t) { return trash
; });
63 invoke_on_all_policies(test_replace_copy(), in
.begin(), in
.end(), out
.begin(), out
.end(), expected
.begin(),
64 expected
.end(), out
.size(), pred
, old_value
, new_value
, trash
);
65 invoke_on_all_policies(test_replace_copy(), in
.cbegin(), in
.cend(), out
.begin(), out
.end(), expected
.begin(),
66 expected
.end(), out
.size(), pred
, old_value
, new_value
, trash
);
73 template <typename Policy
, typename InputIterator
, typename OutputInterator
>
75 operator()(Policy
&& exec
, InputIterator input_iter
, OutputInterator out_iter
)
77 auto is_even
= [&](float64_t v
) {
78 uint32_t i
= (uint32_t)v
;
82 invoke_if(exec
, [&]() { replace_copy_if(exec
, input_iter
, input_iter
, out_iter
, non_const(is_even
), T(0)); });
90 test
<float64_t
>(-666.0, 8.5, 0.33, [](const float64_t
& x
) { return x
* x
<= 1024; },
91 [](size_t j
) { return ((j
+ 1) % 7 & 2) != 0 ? 8.5 : float64_t(j
% 32 + j
); });
93 test
<int32_t>(-666, 42, 99, [](const int32_t& x
) { return x
!= 42; },
94 [](size_t j
) { return ((j
+ 1) % 5 & 2) != 0 ? 42 : -1 - int32_t(j
); });
96 #if !defined(_PSTL_ICC_17_TEST_MAC_RELEASE_32_BROKEN)
97 test
<Number
>(Number(42, OddTag()), Number(2001, OddTag()), Number(2017, OddTag()), IsMultiple(3, OddTag()),
98 [](int32_t j
) { return ((j
+ 1) % 3 & 2) != 0 ? Number(2001, OddTag()) : Number(j
, OddTag()); });
101 test_algo_basic_double
<int32_t>(run_for_rnd_fw
<test_non_const
<int32_t>>());
103 std::cout
<< done() << std::endl
;