]>
git.proxmox.com Git - rustc.git/blob - vendor/rustc-rayon/tests/producer_split_at.rs
1 use rayon
::iter
::plumbing
::*;
4 /// Stress-test indexes for `Producer::split_at`.
5 fn check
<F
, I
>(expected
: &[I
::Item
], mut f
: F
)
8 I
: IntoParallelIterator
,
9 I
::Iter
: IndexedParallelIterator
,
10 I
::Item
: PartialEq
+ std
::fmt
::Debug
,
12 map_triples(expected
.len() + 1, |i
, j
, k
| {
13 Split
::forward(f(), i
, j
, k
, expected
);
14 Split
::reverse(f(), i
, j
, k
, expected
);
18 fn map_triples
<F
>(end
: usize, mut f
: F
)
20 F
: FnMut(usize, usize, usize),
40 fn forward
<I
>(iter
: I
, i
: usize, j
: usize, k
: usize, expected
: &[I
::Item
])
42 I
: IntoParallelIterator
,
43 I
::Iter
: IndexedParallelIterator
,
44 I
::Item
: PartialEq
+ std
::fmt
::Debug
,
46 let result
= iter
.into_par_iter().with_producer(Split
{
52 assert_eq
!(result
, expected
);
55 fn reverse
<I
>(iter
: I
, i
: usize, j
: usize, k
: usize, expected
: &[I
::Item
])
57 I
: IntoParallelIterator
,
58 I
::Iter
: IndexedParallelIterator
,
59 I
::Item
: PartialEq
+ std
::fmt
::Debug
,
61 let result
= iter
.into_par_iter().with_producer(Split
{
67 assert
!(result
.iter().eq(expected
.iter().rev()));
71 impl<T
> ProducerCallback
<T
> for Split
{
74 fn callback
<P
>(self, producer
: P
) -> Self::Output
76 P
: Producer
<Item
= T
>,
78 println
!("{:?}", self);
80 // Splitting the outer indexes first gets us an arbitrary mid section,
81 // which we then split further to get full test coverage.
82 let (left
, d
) = producer
.split_at(self.k
);
83 let (a
, mid
) = left
.split_at(self.i
);
84 let (b
, c
) = mid
.split_at(self.j
- self.i
);
86 let a
= a
.into_iter();
87 let b
= b
.into_iter();
88 let c
= c
.into_iter();
89 let d
= d
.into_iter();
91 check_len(&a
, self.i
);
92 check_len(&b
, self.j
- self.i
);
93 check_len(&c
, self.k
- self.j
);
95 let chain
= a
.chain(b
).chain(c
).chain(d
);
104 fn check_len
<I
: ExactSizeIterator
>(iter
: &I
, len
: usize) {
105 assert_eq
!(iter
.size_hint(), (len
, Some(len
)));
106 assert_eq
!(iter
.len(), len
);
109 // **** Base Producers ****
113 let a
= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
120 check(&v
[..0], rayon
::iter
::empty
);
126 check(&v
, || rayon
::iter
::once(42));
132 check(&v
, || Some(42));
137 let v
: Vec
<_
> = (0..10).collect();
142 fn range_inclusive() {
143 let v
: Vec
<_
> = (0u16..=10).collect();
144 check(&v
, || 0u16..=10);
149 let v
: Vec
<_
> = std
::iter
::repeat(1).take(5).collect();
150 check(&v
, || rayon
::iter
::repeatn(1, 5));
155 let s
: Vec
<_
> = (0..10).collect();
156 let v
: Vec
<_
> = s
.iter().collect();
161 fn slice_iter_mut() {
162 let mut s
: Vec
<_
> = (0..10).collect();
163 let mut v
: Vec
<_
> = s
.clone();
164 let expected
: Vec
<_
> = v
.iter_mut().collect();
166 map_triples(expected
.len() + 1, |i
, j
, k
| {
167 Split
::forward(s
.par_iter_mut(), i
, j
, k
, &expected
);
168 Split
::reverse(s
.par_iter_mut(), i
, j
, k
, &expected
);
174 let s
: Vec
<_
> = (0..10).collect();
175 for len
in 1..s
.len() + 2 {
176 let v
: Vec
<_
> = s
.chunks(len
).collect();
177 check(&v
, || s
.par_chunks(len
));
182 fn slice_chunks_exact() {
183 let s
: Vec
<_
> = (0..10).collect();
184 for len
in 1..s
.len() + 2 {
185 let v
: Vec
<_
> = s
.chunks_exact(len
).collect();
186 check(&v
, || s
.par_chunks_exact(len
));
191 fn slice_chunks_mut() {
192 let mut s
: Vec
<_
> = (0..10).collect();
193 let mut v
: Vec
<_
> = s
.clone();
194 for len
in 1..s
.len() + 2 {
195 let expected
: Vec
<_
> = v
.chunks_mut(len
).collect();
196 map_triples(expected
.len() + 1, |i
, j
, k
| {
197 Split
::forward(s
.par_chunks_mut(len
), i
, j
, k
, &expected
);
198 Split
::reverse(s
.par_chunks_mut(len
), i
, j
, k
, &expected
);
204 fn slice_chunks_exact_mut() {
205 let mut s
: Vec
<_
> = (0..10).collect();
206 let mut v
: Vec
<_
> = s
.clone();
207 for len
in 1..s
.len() + 2 {
208 let expected
: Vec
<_
> = v
.chunks_exact_mut(len
).collect();
209 map_triples(expected
.len() + 1, |i
, j
, k
| {
210 Split
::forward(s
.par_chunks_exact_mut(len
), i
, j
, k
, &expected
);
211 Split
::reverse(s
.par_chunks_exact_mut(len
), i
, j
, k
, &expected
);
218 let s
: Vec
<_
> = (0..10).collect();
219 for len
in 1..s
.len() + 2 {
220 let v
: Vec
<_
> = s
.rchunks(len
).collect();
221 check(&v
, || s
.par_rchunks(len
));
226 fn slice_rchunks_exact() {
227 let s
: Vec
<_
> = (0..10).collect();
228 for len
in 1..s
.len() + 2 {
229 let v
: Vec
<_
> = s
.rchunks_exact(len
).collect();
230 check(&v
, || s
.par_rchunks_exact(len
));
235 fn slice_rchunks_mut() {
236 let mut s
: Vec
<_
> = (0..10).collect();
237 let mut v
: Vec
<_
> = s
.clone();
238 for len
in 1..s
.len() + 2 {
239 let expected
: Vec
<_
> = v
.rchunks_mut(len
).collect();
240 map_triples(expected
.len() + 1, |i
, j
, k
| {
241 Split
::forward(s
.par_rchunks_mut(len
), i
, j
, k
, &expected
);
242 Split
::reverse(s
.par_rchunks_mut(len
), i
, j
, k
, &expected
);
248 fn slice_rchunks_exact_mut() {
249 let mut s
: Vec
<_
> = (0..10).collect();
250 let mut v
: Vec
<_
> = s
.clone();
251 for len
in 1..s
.len() + 2 {
252 let expected
: Vec
<_
> = v
.rchunks_exact_mut(len
).collect();
253 map_triples(expected
.len() + 1, |i
, j
, k
| {
254 Split
::forward(s
.par_rchunks_exact_mut(len
), i
, j
, k
, &expected
);
255 Split
::reverse(s
.par_rchunks_exact_mut(len
), i
, j
, k
, &expected
);
262 let s
: Vec
<_
> = (0..10).collect();
263 let v
: Vec
<_
> = s
.windows(2).collect();
264 check(&v
, || s
.par_windows(2));
269 let v
: Vec
<_
> = (0..10).collect();
270 check(&v
, || v
.clone());
273 // **** Adaptors ****
277 let v
: Vec
<_
> = (0..10).collect();
278 check(&v
, || (0..5).into_par_iter().chain(5..10));
283 let v
: Vec
<_
> = (0..10).collect();
284 check(&v
, || v
.par_iter().cloned());
289 let v
: Vec
<_
> = (0..10).collect();
290 check(&v
, || v
.par_iter().copied());
295 let v
: Vec
<_
> = (0..10).enumerate().collect();
296 check(&v
, || (0..10).into_par_iter().enumerate());
301 let v
: Vec
<_
> = (0..10).step_by(2).collect();
302 check(&v
, || (0..10).into_par_iter().step_by(2))
306 fn step_by_unaligned() {
307 let v
: Vec
<_
> = (0..10).step_by(3).collect();
308 check(&v
, || (0..10).into_par_iter().step_by(3))
313 let v
: Vec
<_
> = (0..10).collect();
314 check(&v
, || (0..10).into_par_iter().inspect(|_
| ()));
319 let v
: Vec
<_
> = (0..10).collect();
320 check(&v
, || (0..10).into_par_iter().update(|_
| ()));
325 let v
= [0, 10, 1, 11, 2, 12, 3, 4];
326 check(&v
, || (0..5).into_par_iter().interleave(10..13));
327 check(&v
[..6], || (0..3).into_par_iter().interleave(10..13));
329 let v
= [0, 10, 1, 11, 2, 12, 13, 14];
330 check(&v
, || (0..3).into_par_iter().interleave(10..15));
335 let v
= [0, -1, 1, -1, 2, -1, 3, -1, 4];
336 check(&v
, || (0..5).into_par_iter().intersperse(-1));
341 let s
: Vec
<_
> = (0..10).collect();
342 let v
: Vec
<_
> = s
.chunks(2).map(|c
| c
.to_vec()).collect();
343 check(&v
, || s
.par_iter().cloned().chunks(2));
348 let v
: Vec
<_
> = (0..10).collect();
349 check(&v
, || v
.par_iter().map(Clone
::clone
));
354 let v
: Vec
<_
> = (0..10).collect();
355 check(&v
, || v
.par_iter().map_with(vec
![0], |_
, &x
| x
));
360 let v
: Vec
<_
> = (0..10).collect();
361 check(&v
, || v
.par_iter().map_init(|| vec
![0], |_
, &x
| x
));
366 let v
: Vec
<_
> = (0..10).collect();
367 check(&v
, || (0..10).into_par_iter().panic_fuse());
372 let v
: Vec
<_
> = (0..10).rev().collect();
373 check(&v
, || (0..10).into_par_iter().rev());
378 let v
: Vec
<_
> = (0..10).collect();
379 check(&v
, || (0..10).into_par_iter().with_max_len(1));
384 let v
: Vec
<_
> = (0..10).collect();
385 check(&v
, || (0..10).into_par_iter().with_min_len(1));
390 let v
: Vec
<_
> = (0..10).zip(10..20).collect();
391 check(&v
, || (0..10).into_par_iter().zip(10..20));
392 check(&v
[..5], || (0..5).into_par_iter().zip(10..20));
393 check(&v
[..5], || (0..10).into_par_iter().zip(10..15));