]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/std/ranges/adaptors/all.cc
1 // Copyright (C) 2020-2022 Free Software Foundation, Inc.
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
18 // { dg-options "-std=gnu++2a" }
19 // { dg-do run { target c++2a } }
23 #include <testsuite_hooks.h>
24 #include <testsuite_iterators.h>
26 namespace ranges
= std::ranges
;
27 namespace views
= std::ranges::views
;
32 int x
[] = {1,2,3,4,5};
33 auto v
= views::all(x
);
35 static_assert(ranges::view
<decltype(v
)>);
36 static_assert(ranges::random_access_range
<decltype(v
)>);
38 VERIFY( ranges::size(v
) == 5 );
39 VERIFY( ranges::size(x
| views::all
) == 5 );
40 VERIFY( ranges::size(v
| views::all
| views::all
) == 5 );
41 VERIFY( ranges::size(v
| (views::all
| views::all
)) == 5 );
44 VERIFY( ranges::equal(v
, (int[]){5,4,3,2,1}) );
52 for (auto&& i
: ranges::ref_view
{x
})
54 VERIFY( ranges::equal(x
, (int[]){1,2,3,4,5}) );
60 std::array ints
{0,1,2,3,4,5};
61 auto even
= [] (int i
) { return i
%2==0; };
62 auto odd
= [] (int i
) { return i
%2==1; };
63 auto square
= [] (int i
) { return i
*i
; };
67 | (views::filter(even
)
68 | (views::filter(odd
) | views::all
)))
69 | views::transform(square
)))
77 auto odd
= [] (int i
) { return i
%2==1; };
78 auto square
= [] (int i
) { return i
*i
; };
79 auto increment
= [] (int i
) { return i
+1; };
80 auto small
= [] (int i
) { return i
<30; };
81 auto non_negative
= [] (int i
) { return i
>=0; };
82 auto negative
= [] (int i
) { return i
<0; };
83 return ranges::equal(views::iota(-5)
84 | views::drop_while(negative
)
85 | views::take_while(non_negative
)
86 | views::transform(increment
)
90 | views::transform(square
),
92 | views::drop_while(negative
)
95 | views::transform(square
)
96 | views::take_while(small
)
97 | views::take_while(small
));
100 static_assert(std::is_empty_v
<decltype(views::common
107 // Adding empty range adaptor closure objects to a pipeline used to not
108 // increase the size of the pipeline, but now that our range adaptor closure
109 // objects derive from a common empty base class, [[no_unique_address]] can no
110 // longer make two empty adjacent range adaptor closure objects occupy the same
111 // data member address.
112 static_assert(sizeof(decltype(views::take(5) | views::drop(5)))
113 == sizeof(decltype(views::take(5)
122 template<auto all
= views::all
>
126 // Verify SFINAE behavior.
127 static_assert(!requires
{ all(); });
128 static_assert(!requires
{ all(0, 0); });
129 static_assert(!requires
{ all(0); });
130 static_assert(!requires
{ 0 | all
; });
133 template<bool B1
, bool B2
>
138 BorrowedRange(int (&arr
)[3]) noexcept
: ptr(arr
) { }
140 int* begin() const noexcept(B1
) { return ptr
; }
141 int* end() const noexcept(B2
) { return ptr
+ 3; }
144 template<bool B1
, bool B2
>
145 const bool std::ranges::enable_borrowed_range
<BorrowedRange
<B1
, B2
>> = true;
153 static_assert(noexcept(views::all(x
)));
156 static_assert(noexcept(views::all(BorrowedRange
<true, true>(x
))));
157 static_assert(!noexcept(views::all(BorrowedRange
<true, false>(x
))));
158 static_assert(!noexcept(views::all(BorrowedRange
<false, true>(x
))));
159 static_assert(!noexcept(views::all(BorrowedRange
<false, false>(x
))));
166 struct view_t
: ranges::empty_view
<int> { // move-only view
167 view_t(const view_t
&) = delete;
168 view_t(view_t
&&) = default;
169 view_t
& operator=(const view_t
&) = delete;
170 view_t
& operator=(view_t
&&) = default;
172 static_assert(std::movable
<view_t
> && !std::copyable
<view_t
>);
173 static_assert(!ranges::viewable_range
<view_t
&>);
181 static_assert(test03());
182 static_assert(test04());