|
13 | 13 | /// This is a version of the [`azip`] macro that requires the crate feature
|
14 | 14 | /// `rayon` to be enabled.
|
15 | 15 | ///
|
| 16 | +/// See the [`azip`] macro for more details about the macro syntax! |
| 17 | +/// |
16 | 18 | /// This example:
|
17 | 19 | ///
|
18 | 20 | /// ```rust,ignore
|
19 |
| -/// par_azip!(mut a, b, c in { *a = b + c }) |
| 21 | +/// par_azip!((a in &mut a, &b in &b, &c in &c) { *a = b + c }) |
20 | 22 | /// ```
|
21 | 23 | ///
|
22 | 24 | /// Is equivalent to:
|
|
47 | 49 | /// // Compute a simple ternary operation:
|
48 | 50 | /// // elementwise addition of b and c, stored in a
|
49 | 51 | ///
|
50 |
| -/// par_azip!(mut a, b, c in { *a = b + c }); |
| 52 | +/// par_azip!((a in &mut a, &b in &b, &c in &c) *a = b + c); |
51 | 53 | ///
|
52 | 54 | /// assert_eq!(a, &b + &c);
|
53 | 55 | /// }
|
54 | 56 | /// ```
|
55 | 57 | macro_rules! par_azip {
|
56 |
| - // Build Zip Rule (index) |
57 |
| - (@parse [index => $a:expr, $($aa:expr,)*] $t1:tt in $t2:tt) => { |
58 |
| - $crate::par_azip!(@finish ($crate::Zip::indexed($a)) [$($aa,)*] $t1 in $t2) |
59 |
| - }; |
60 |
| - // Build Zip Rule (no index) |
61 |
| - (@parse [$a:expr, $($aa:expr,)*] $t1:tt in $t2:tt) => { |
62 |
| - $crate::par_azip!(@finish ($crate::Zip::from($a)) [$($aa,)*] $t1 in $t2) |
63 |
| - }; |
64 |
| - // Build Finish Rule (both) |
65 |
| - (@finish ($z:expr) [$($aa:expr,)*] [$($p:pat,)+] in { $($t:tt)*}) => { |
66 |
| - use $crate::parallel::prelude::*; |
67 |
| - #[allow(unused_mut)] |
68 |
| - ($z) |
69 |
| - $( |
70 |
| - .and($aa) |
71 |
| - )* |
72 |
| - .par_apply(|$($p),+| { |
73 |
| - $($t)* |
74 |
| - }) |
75 |
| - }; |
76 |
| - // parsing stack: [expressions] [patterns] (one per operand) |
77 |
| - // index uses empty [] -- must be first |
78 |
| - (@parse [] [] index $i:pat, $($t:tt)*) => { |
79 |
| - $crate::par_azip!(@parse [index =>] [$i,] $($t)*); |
80 |
| - }; |
81 |
| - (@parse [$($exprs:tt)*] [$($pats:tt)*] mut $x:ident ($e:expr) $($t:tt)*) => { |
82 |
| - $crate::par_azip!(@parse [$($exprs)* $e,] [$($pats)* mut $x,] $($t)*); |
83 |
| - }; |
84 |
| - (@parse [$($exprs:tt)*] [$($pats:tt)*] mut $x:ident $($t:tt)*) => { |
85 |
| - $crate::par_azip!(@parse [$($exprs)* &mut $x,] [$($pats)* mut $x,] $($t)*); |
86 |
| - }; |
87 |
| - (@parse [$($exprs:tt)*] [$($pats:tt)*] , $($t:tt)*) => { |
88 |
| - $crate::par_azip!(@parse [$($exprs)*] [$($pats)*] $($t)*); |
89 |
| - }; |
90 |
| - (@parse [$($exprs:tt)*] [$($pats:tt)*] ref $x:ident ($e:expr) $($t:tt)*) => { |
91 |
| - $crate::par_azip!(@parse [$($exprs)* $e,] [$($pats)* $x,] $($t)*); |
92 |
| - }; |
93 |
| - (@parse [$($exprs:tt)*] [$($pats:tt)*] ref $x:ident $($t:tt)*) => { |
94 |
| - $crate::par_azip!(@parse [$($exprs)* &$x,] [$($pats)* $x,] $($t)*); |
95 |
| - }; |
96 |
| - (@parse [$($exprs:tt)*] [$($pats:tt)*] $x:ident ($e:expr) $($t:tt)*) => { |
97 |
| - $crate::par_azip!(@parse [$($exprs)* $e,] [$($pats)* &$x,] $($t)*); |
98 |
| - }; |
99 |
| - (@parse [$($exprs:tt)*] [$($pats:tt)*] $x:ident $($t:tt)*) => { |
100 |
| - $crate::par_azip!(@parse [$($exprs)* &$x,] [$($pats)* &$x,] $($t)*); |
101 |
| - }; |
102 |
| - (@parse [$($exprs:tt)*] [$($pats:tt)*] $($t:tt)*) => { }; |
103 | 58 | ($($t:tt)*) => {
|
104 |
| - $crate::par_azip!(@parse [] [] $($t)*); |
105 |
| - } |
| 59 | + $crate::azip!(@build par_apply $($t)*) |
| 60 | + }; |
106 | 61 | }
|
0 commit comments