evobench_tools/utillib/rayon_util/
par_run.rs1pub trait ParRun {
5 type Output;
6 fn par_run(self) -> Self::Output;
7}
8
9impl<F1, F2, T1, T2> ParRun for (F1, F2)
10where
11 F1: FnOnce() -> T1 + Send,
12 F2: FnOnce() -> T2 + Send,
13 T1: Send,
14 T2: Send,
15{
16 type Output = (T1, T2);
17
18 fn par_run(self) -> Self::Output {
19 let (f1, f2) = self;
20 rayon::join(f1, f2)
21 }
22}
23
24impl<F1, F2, F3, T1, T2, T3> ParRun for (F1, F2, F3)
25where
26 F1: FnOnce() -> T1 + Send,
27 F2: FnOnce() -> T2 + Send,
28 F3: FnOnce() -> T3 + Send,
29 T1: Send,
30 T2: Send,
31 T3: Send,
32{
33 type Output = (T1, T2, T3);
34
35 fn par_run(self) -> Self::Output {
36 let (f1, f2, f3) = self;
37 let (v1, (v2, v3)) = rayon::join(f1, || rayon::join(f2, f3));
38 (v1, v2, v3)
39 }
40}
41
42impl<F1, F2, F3, F4, T1, T2, T3, T4> ParRun for (F1, F2, F3, F4)
43where
44 F1: FnOnce() -> T1 + Send,
45 F2: FnOnce() -> T2 + Send,
46 F3: FnOnce() -> T3 + Send,
47 F4: FnOnce() -> T4 + Send,
48 T1: Send,
49 T2: Send,
50 T3: Send,
51 T4: Send,
52{
53 type Output = (T1, T2, T3, T4);
54
55 fn par_run(self) -> Self::Output {
56 let (f1, f2, f3, f4) = self;
57 let ((v1, v2), (v3, v4)) = rayon::join(|| rayon::join(f1, f2), || rayon::join(f3, f4));
58 (v1, v2, v3, v4)
59 }
60}
61
62impl<F1, F2, F3, F4, F5, T1, T2, T3, T4, T5> ParRun for (F1, F2, F3, F4, F5)
63where
64 F1: FnOnce() -> T1 + Send,
65 F2: FnOnce() -> T2 + Send,
66 F3: FnOnce() -> T3 + Send,
67 F4: FnOnce() -> T4 + Send,
68 F5: FnOnce() -> T5 + Send,
69 T1: Send,
70 T2: Send,
71 T3: Send,
72 T4: Send,
73 T5: Send,
74{
75 type Output = (T1, T2, T3, T4, T5);
76
77 fn par_run(self) -> Self::Output {
78 let (f1, f2, f3, f4, f5) = self;
79 let ((v1, v2), (v3, (v4, v5))) = rayon::join(
80 || rayon::join(f1, f2),
81 || rayon::join(f3, || rayon::join(f4, f5)),
82 );
83 (v1, v2, v3, v4, v5)
84 }
85}