]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/std/ranges/repeat/1.cc
1 // { dg-do run { target c++23 } }
5 #include <testsuite_hooks.h>
7 #if __cpp_lib_ranges_repeat != 202207L
8 # error "Feature-test macro __cpp_lib_ranges_repeat has wrong value in <ranges>"
11 namespace ranges
= std::ranges
;
12 namespace views
= std::views
;
17 auto v
= views::repeat(42);
18 static_assert(ranges::random_access_range
<decltype(v
)>
19 && !ranges::sized_range
<decltype(v
)>);
20 auto i
= ranges::begin(v
);
21 auto s
= ranges::end(v
);
24 VERIFY( &i
[0] == &i
[1] );
25 VERIFY( &*i
== &*(i
+1) );
27 auto j
= i
+ 5, k
= i
+ 12;
28 VERIFY( k
- i
== 12 );
30 VERIFY( i
- j
== -5 );
44 constexpr int bound
= 20;
45 auto v
= views::repeat(42, bound
);
46 static_assert(ranges::random_access_range
<decltype(v
)>
47 && ranges::sized_range
<decltype(v
)>);
48 VERIFY( ranges::equal(v
, views::repeat(42) | views::take(bound
)) );
49 auto i
= ranges::begin(v
);
50 auto s
= ranges::end(v
);
53 VERIFY( &i
[0] == &i
[1] );
54 VERIFY( &*i
== &*(i
+1) );
56 auto j
= i
+ 5, k
= i
+ 12;
57 VERIFY( k
- i
== 12 );
59 VERIFY( i
- j
== -5 );
67 VERIFY( ranges::size(v
) == bound
);
68 VERIFY( s
- i
== bound
);
69 VERIFY( s
- j
== bound
- (j
- i
) );
70 VERIFY( i
+ bound
== s
);
71 VERIFY( bound
+ i
== s
);
79 struct A
{ int n
, m
; };
80 auto v
= ranges::repeat_view
<A
, unsigned>(std::piecewise_construct
,
83 VERIFY( v
[0].n
== 1 );
84 VERIFY( v
[0].m
== 2 );
85 VERIFY( ranges::size(v
) == 3 );
93 // Verify P2474R2 changes to views::take/drop.
94 auto r
= views::repeat(42);
96 auto rt
= r
| views::take(10);
97 static_assert(views::__detail::__is_repeat_view
<decltype(rt
)>);
98 VERIFY( ranges::equal(rt
, views::repeat(42, 10)) );
100 auto rd
= r
| views::drop(10);
101 static_assert(std::same_as
<decltype(rd
), decltype(r
)>);
103 auto br
= views::repeat(42, 37);
105 auto brt
= br
| views::take(10);
106 static_assert(std::same_as
<decltype(brt
), decltype(br
)>);
107 VERIFY( ranges::equal(brt
, views::repeat(42, 10)) );
109 auto brt100
= br
| views::take(100);
110 VERIFY( ranges::equal(brt100
, br
) );
112 auto brd
= br
| views::drop(10);
113 static_assert(std::same_as
<decltype(brd
), decltype(br
)>);
114 VERIFY( ranges::equal(brd
, views::repeat(42, 27)) );
116 auto brd100
= br
| views::drop(100);
117 VERIFY( ranges::empty(brd100
) );
126 ranges::repeat_view
<int> r
;
134 move_only(move_only
&&) { }
136 // P2494R2 Relaxing range adaptors to allow for move only types
137 static_assert( requires
{ views::repeat(move_only
{}, 2); } );
143 static_assert(test01());
144 static_assert(test02());
145 static_assert(test03());
146 static_assert(test04());