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, c++17
19 #include "test_iterators.h"
20 #include "type_algorithms.h"
22 template <class InContainer
, class OutContainer
>
23 constexpr void test_containers() {
24 using InIter
= typename
InContainer::iterator
;
25 using OutIter
= typename
OutContainer::iterator
;
28 InContainer in
{1, 2, 3, 4};
31 std::same_as
<std::ranges::in_out_result
<InIter
, OutIter
>> auto ret
=
32 std::ranges::move_backward(in
.begin(), in
.end(), out
.end());
33 assert(std::ranges::equal(in
, out
));
34 assert(ret
.in
== in
.end());
35 assert(ret
.out
== out
.begin());
38 InContainer in
{1, 2, 3, 4};
40 std::same_as
<std::ranges::in_out_result
<InIter
, OutIter
>> auto ret
= std::ranges::move_backward(in
, out
.end());
41 assert(std::ranges::equal(in
, out
));
42 assert(ret
.in
== in
.end());
43 assert(ret
.out
== out
.begin());
47 template <class Iter
, class Sent
>
48 constexpr void test_join_view() {
49 auto to_subranges
= std::views::transform([](auto& vec
) {
50 return std::ranges::subrange(Iter(vec
.data()), Sent(Iter(vec
.data() + vec
.size())));
53 { // segmented -> contiguous
54 std::vector
<std::vector
<int>> vectors
= {};
55 auto range
= vectors
| to_subranges
;
56 std::vector
<std::ranges::subrange
<Iter
, Sent
>> subrange_vector(range
.begin(), range
.end());
57 std::array
<int, 0> arr
;
59 std::ranges::move_backward(subrange_vector
| std::views::join
, arr
.end());
60 assert(std::ranges::equal(arr
, std::array
<int, 0>{}));
62 { // segmented -> contiguous
63 std::vector
<std::vector
<int>> vectors
= {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10}, {}};
64 auto range
= vectors
| to_subranges
;
65 std::vector
<std::ranges::subrange
<Iter
, Sent
>> subrange_vector(range
.begin(), range
.end());
66 std::array
<int, 10> arr
;
68 std::ranges::move_backward(subrange_vector
| std::views::join
, arr
.end());
69 assert(std::ranges::equal(arr
, std::array
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}));
71 { // contiguous -> segmented
72 std::vector
<std::vector
<int>> vectors
= {{0, 0, 0, 0}, {0, 0}, {0, 0, 0, 0}, {}};
73 auto range
= vectors
| to_subranges
;
74 std::vector
<std::ranges::subrange
<Iter
, Sent
>> subrange_vector(range
.begin(), range
.end());
75 std::array arr
= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
77 std::ranges::move_backward(arr
, (subrange_vector
| std::views::join
).end());
78 assert(std::ranges::equal(subrange_vector
| std::views::join
, std::array
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}));
80 { // segmented -> segmented
81 std::vector
<std::vector
<int>> vectors
= {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10}, {}};
82 auto range1
= vectors
| to_subranges
;
83 std::vector
<std::ranges::subrange
<Iter
, Sent
>> subrange_vector(range1
.begin(), range1
.end());
84 std::vector
<std::vector
<int>> to_vectors
= {{0, 0, 0, 0}, {0, 0, 0, 0}, {}, {0, 0}};
85 auto range2
= to_vectors
| to_subranges
;
86 std::vector
<std::ranges::subrange
<Iter
, Sent
>> to_subrange_vector(range2
.begin(), range2
.end());
88 std::ranges::move_backward(subrange_vector
| std::views::join
, (to_subrange_vector
| std::views::join
).end());
89 assert(std::ranges::equal(to_subrange_vector
| std::views::join
, std::array
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}));
93 constexpr bool test_constexpr() {
94 test_containers
<std::vector
<int>, std::vector
<int>>();
96 types::for_each(types::bidirectional_iterator_list
<int*>{}, []<class Iter
> { test_join_view
<Iter
, Iter
>(); });
100 int main(int, char**) {
101 test_containers
<std::deque
<int>, std::deque
<int>>();
102 test_containers
<std::deque
<int>, std::vector
<int>>();
103 test_containers
<std::vector
<int>, std::deque
<int>>();
106 static_assert(test_constexpr());