1 //===----------------------------------------------------------------------===//
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-exception
7 //===----------------------------------------------------------------------===//
9 // UNSUPPORTED: c++03, c++11, c++14
11 // UNSUPPORTED: libcpp-has-no-incomplete-pstl
15 // template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
16 // ForwardIterator2 move(ExecutionPolicy&& policy,
17 // ForwardIterator1 first, ForwardIterator1 last,
18 // ForwardIterator2 result);
23 #include "test_macros.h"
24 #include "test_execution_policies.h"
25 #include "test_iterators.h"
27 EXECUTION_POLICY_SFINAE_TEST(move
);
29 static_assert(sfinae_test_move
<int, int*, int*, int*>);
30 static_assert(!sfinae_test_move
<std::execution::parallel_policy
, int*, int*, int*>);
32 template <class Iter1
, class Iter2
>
34 template <class Policy
>
35 void operator()(Policy
&& policy
) {
37 for (const int size
: {0, 1, 2, 100, 350}) {
38 std::vector
<int> a(size
);
39 for (int i
= 0; i
!= size
; ++i
)
42 std::vector
<int> out(std::size(a
));
44 std::move(policy
, Iter1(std::data(a
)), Iter1(std::data(a
) + std::size(a
)), Iter2(std::data(out
)));
45 static_assert(std::is_same_v
<decltype(ret
), Iter2
>);
46 assert(base(ret
) == std::data(out
) + std::size(out
));
47 for (int i
= 0; i
!= size
; ++i
)
48 assert(out
[i
] == i
+ 1);
53 struct MovedToTester
{
54 bool moved_to
= false;
55 MovedToTester() = default;
56 MovedToTester(MovedToTester
&&) {}
57 MovedToTester
& operator=(MovedToTester
&&) {
62 ~MovedToTester() = default;
65 template <class Iter1
, class Iter2
>
66 struct TestNonTrivial
{
67 template <class Policy
>
68 void operator()(Policy
&& policy
) {
70 for (const int size
: {0, 1, 2, 100, 350}) {
71 std::vector
<MovedToTester
> a(size
);
73 std::vector
<MovedToTester
> out(std::size(a
));
74 auto ret
= std::move(policy
, Iter1(std::data(a
)), Iter1(std::data(a
) + std::size(a
)), Iter2(std::data(out
)));
75 assert(base(ret
) == std::data(out
) + std::size(out
));
76 assert(std::all_of(std::begin(out
), std::end(out
), [](MovedToTester
& t
) { return t
.moved_to
; }));
77 assert(std::none_of(std::begin(a
), std::end(a
), [](MovedToTester
& t
) { return t
.moved_to
; }));
82 int main(int, char**) {
83 types::for_each(types::forward_iterator_list
<int*>{}, types::apply_type_identity
{[](auto v
) {
84 using Iter
= typename
decltype(v
)::type
;
86 types::forward_iterator_list
<int*>{},
87 TestIteratorWithPolicies
< types::partial_instantiation
<TestInt
, Iter
>::template apply
>{});
91 types::forward_iterator_list
<MovedToTester
*>{}, types::apply_type_identity
{[](auto v
) {
92 using Iter
= typename
decltype(v
)::type
;
94 types::forward_iterator_list
<MovedToTester
*>{},
95 TestIteratorWithPolicies
< types::partial_instantiation
<TestNonTrivial
, Iter
>::template apply
>{});