]> git.proxmox.com Git - rustc.git/blob - vendor/rustc-rayon/tests/producer_split_at.rs
New upstream version 1.52.0~beta.3+dfsg1
[rustc.git] / vendor / rustc-rayon / tests / producer_split_at.rs
1 use rayon::iter::plumbing::*;
2 use rayon::prelude::*;
3
4 /// Stress-test indexes for `Producer::split_at`.
5 fn check<F, I>(expected: &[I::Item], mut f: F)
6 where
7 F: FnMut() -> I,
8 I: IntoParallelIterator,
9 I::Iter: IndexedParallelIterator,
10 I::Item: PartialEq + std::fmt::Debug,
11 {
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);
15 });
16 }
17
18 fn map_triples<F>(end: usize, mut f: F)
19 where
20 F: FnMut(usize, usize, usize),
21 {
22 for i in 0..end {
23 for j in i..end {
24 for k in j..end {
25 f(i, j, k);
26 }
27 }
28 }
29 }
30
31 #[derive(Debug)]
32 struct Split {
33 i: usize,
34 j: usize,
35 k: usize,
36 reverse: bool,
37 }
38
39 impl Split {
40 fn forward<I>(iter: I, i: usize, j: usize, k: usize, expected: &[I::Item])
41 where
42 I: IntoParallelIterator,
43 I::Iter: IndexedParallelIterator,
44 I::Item: PartialEq + std::fmt::Debug,
45 {
46 let result = iter.into_par_iter().with_producer(Split {
47 i,
48 j,
49 k,
50 reverse: false,
51 });
52 assert_eq!(result, expected);
53 }
54
55 fn reverse<I>(iter: I, i: usize, j: usize, k: usize, expected: &[I::Item])
56 where
57 I: IntoParallelIterator,
58 I::Iter: IndexedParallelIterator,
59 I::Item: PartialEq + std::fmt::Debug,
60 {
61 let result = iter.into_par_iter().with_producer(Split {
62 i,
63 j,
64 k,
65 reverse: true,
66 });
67 assert!(result.iter().eq(expected.iter().rev()));
68 }
69 }
70
71 impl<T> ProducerCallback<T> for Split {
72 type Output = Vec<T>;
73
74 fn callback<P>(self, producer: P) -> Self::Output
75 where
76 P: Producer<Item = T>,
77 {
78 println!("{:?}", self);
79
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);
85
86 let a = a.into_iter();
87 let b = b.into_iter();
88 let c = c.into_iter();
89 let d = d.into_iter();
90
91 check_len(&a, self.i);
92 check_len(&b, self.j - self.i);
93 check_len(&c, self.k - self.j);
94
95 let chain = a.chain(b).chain(c).chain(d);
96 if self.reverse {
97 chain.rev().collect()
98 } else {
99 chain.collect()
100 }
101 }
102 }
103
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);
107 }
108
109 // **** Base Producers ****
110
111 #[test]
112 fn empty() {
113 let v = vec![42];
114 check(&v[..0], rayon::iter::empty);
115 }
116
117 #[test]
118 fn once() {
119 let v = vec![42];
120 check(&v, || rayon::iter::once(42));
121 }
122
123 #[test]
124 fn option() {
125 let v = vec![42];
126 check(&v, || Some(42));
127 }
128
129 #[test]
130 fn range() {
131 let v: Vec<_> = (0..10).collect();
132 check(&v, || 0..10);
133 }
134
135 #[test]
136 fn range_inclusive() {
137 let v: Vec<_> = (0u16..=10).collect();
138 check(&v, || 0u16..=10);
139 }
140
141 #[test]
142 fn repeatn() {
143 let v: Vec<_> = std::iter::repeat(1).take(5).collect();
144 check(&v, || rayon::iter::repeatn(1, 5));
145 }
146
147 #[test]
148 fn slice_iter() {
149 let s: Vec<_> = (0..10).collect();
150 let v: Vec<_> = s.iter().collect();
151 check(&v, || &s);
152 }
153
154 #[test]
155 fn slice_iter_mut() {
156 let mut s: Vec<_> = (0..10).collect();
157 let mut v: Vec<_> = s.clone();
158 let expected: Vec<_> = v.iter_mut().collect();
159
160 map_triples(expected.len() + 1, |i, j, k| {
161 Split::forward(s.par_iter_mut(), i, j, k, &expected);
162 Split::reverse(s.par_iter_mut(), i, j, k, &expected);
163 });
164 }
165
166 #[test]
167 fn slice_chunks() {
168 let s: Vec<_> = (0..10).collect();
169 for len in 1..s.len() + 2 {
170 let v: Vec<_> = s.chunks(len).collect();
171 check(&v, || s.par_chunks(len));
172 }
173 }
174
175 #[test]
176 fn slice_chunks_mut() {
177 let mut s: Vec<_> = (0..10).collect();
178 let mut v: Vec<_> = s.clone();
179 for len in 1..s.len() + 2 {
180 let expected: Vec<_> = v.chunks_mut(len).collect();
181 map_triples(expected.len() + 1, |i, j, k| {
182 Split::forward(s.par_chunks_mut(len), i, j, k, &expected);
183 Split::reverse(s.par_chunks_mut(len), i, j, k, &expected);
184 });
185 }
186 }
187
188 #[test]
189 fn slice_windows() {
190 let s: Vec<_> = (0..10).collect();
191 let v: Vec<_> = s.windows(2).collect();
192 check(&v, || s.par_windows(2));
193 }
194
195 #[test]
196 fn vec() {
197 let v: Vec<_> = (0..10).collect();
198 check(&v, || v.clone());
199 }
200
201 // **** Adaptors ****
202
203 #[test]
204 fn chain() {
205 let v: Vec<_> = (0..10).collect();
206 check(&v, || (0..5).into_par_iter().chain(5..10));
207 }
208
209 #[test]
210 fn cloned() {
211 let v: Vec<_> = (0..10).collect();
212 check(&v, || v.par_iter().cloned());
213 }
214
215 #[test]
216 fn copied() {
217 let v: Vec<_> = (0..10).collect();
218 check(&v, || v.par_iter().copied());
219 }
220
221 #[test]
222 fn enumerate() {
223 let v: Vec<_> = (0..10).enumerate().collect();
224 check(&v, || (0..10).into_par_iter().enumerate());
225 }
226
227 #[test]
228 fn inspect() {
229 let v: Vec<_> = (0..10).collect();
230 check(&v, || (0..10).into_par_iter().inspect(|_| ()));
231 }
232
233 #[test]
234 fn update() {
235 let v: Vec<_> = (0..10).collect();
236 check(&v, || (0..10).into_par_iter().update(|_| ()));
237 }
238
239 #[test]
240 fn interleave() {
241 let v = [0, 10, 1, 11, 2, 12, 3, 4];
242 check(&v, || (0..5).into_par_iter().interleave(10..13));
243 check(&v[..6], || (0..3).into_par_iter().interleave(10..13));
244
245 let v = [0, 10, 1, 11, 2, 12, 13, 14];
246 check(&v, || (0..3).into_par_iter().interleave(10..15));
247 }
248
249 #[test]
250 fn intersperse() {
251 let v = [0, -1, 1, -1, 2, -1, 3, -1, 4];
252 check(&v, || (0..5).into_par_iter().intersperse(-1));
253 }
254
255 #[test]
256 fn chunks() {
257 let s: Vec<_> = (0..10).collect();
258 let v: Vec<_> = s.chunks(2).map(|c| c.to_vec()).collect();
259 check(&v, || s.par_iter().cloned().chunks(2));
260 }
261
262 #[test]
263 fn map() {
264 let v: Vec<_> = (0..10).collect();
265 check(&v, || v.par_iter().map(Clone::clone));
266 }
267
268 #[test]
269 fn map_with() {
270 let v: Vec<_> = (0..10).collect();
271 check(&v, || v.par_iter().map_with(vec![0], |_, &x| x));
272 }
273
274 #[test]
275 fn map_init() {
276 let v: Vec<_> = (0..10).collect();
277 check(&v, || v.par_iter().map_init(|| vec![0], |_, &x| x));
278 }
279
280 #[test]
281 fn panic_fuse() {
282 let v: Vec<_> = (0..10).collect();
283 check(&v, || (0..10).into_par_iter().panic_fuse());
284 }
285
286 #[test]
287 fn rev() {
288 let v: Vec<_> = (0..10).rev().collect();
289 check(&v, || (0..10).into_par_iter().rev());
290 }
291
292 #[test]
293 fn with_max_len() {
294 let v: Vec<_> = (0..10).collect();
295 check(&v, || (0..10).into_par_iter().with_max_len(1));
296 }
297
298 #[test]
299 fn with_min_len() {
300 let v: Vec<_> = (0..10).collect();
301 check(&v, || (0..10).into_par_iter().with_min_len(1));
302 }
303
304 #[test]
305 fn zip() {
306 let v: Vec<_> = (0..10).zip(10..20).collect();
307 check(&v, || (0..10).into_par_iter().zip(10..20));
308 check(&v[..5], || (0..5).into_par_iter().zip(10..20));
309 check(&v[..5], || (0..10).into_par_iter().zip(10..15));
310 }