/rust/registry/src/index.crates.io-6f17d22bba15001f/rayon-1.10.0/src/iter/reduce.rs
Line | Count | Source (jump to first uncovered line) |
1 | | use super::plumbing::*; |
2 | | use super::ParallelIterator; |
3 | | |
4 | 0 | pub(super) fn reduce<PI, R, ID, T>(pi: PI, identity: ID, reduce_op: R) -> T |
5 | 0 | where |
6 | 0 | PI: ParallelIterator<Item = T>, |
7 | 0 | R: Fn(T, T) -> T + Sync, |
8 | 0 | ID: Fn() -> T + Sync, |
9 | 0 | T: Send, |
10 | 0 | { |
11 | 0 | let consumer = ReduceConsumer { |
12 | 0 | identity: &identity, |
13 | 0 | reduce_op: &reduce_op, |
14 | 0 | }; |
15 | 0 | pi.drive_unindexed(consumer) |
16 | 0 | } |
17 | | |
18 | | struct ReduceConsumer<'r, R, ID> { |
19 | | identity: &'r ID, |
20 | | reduce_op: &'r R, |
21 | | } |
22 | | |
23 | | impl<'r, R, ID> Copy for ReduceConsumer<'r, R, ID> {} |
24 | | |
25 | | impl<'r, R, ID> Clone for ReduceConsumer<'r, R, ID> { |
26 | 0 | fn clone(&self) -> Self { |
27 | 0 | *self |
28 | 0 | } |
29 | | } |
30 | | |
31 | | impl<'r, R, ID, T> Consumer<T> for ReduceConsumer<'r, R, ID> |
32 | | where |
33 | | R: Fn(T, T) -> T + Sync, |
34 | | ID: Fn() -> T + Sync, |
35 | | T: Send, |
36 | | { |
37 | | type Folder = ReduceFolder<'r, R, T>; |
38 | | type Reducer = Self; |
39 | | type Result = T; |
40 | | |
41 | 0 | fn split_at(self, _index: usize) -> (Self, Self, Self) { |
42 | 0 | (self, self, self) |
43 | 0 | } |
44 | | |
45 | 0 | fn into_folder(self) -> Self::Folder { |
46 | 0 | ReduceFolder { |
47 | 0 | reduce_op: self.reduce_op, |
48 | 0 | item: (self.identity)(), |
49 | 0 | } |
50 | 0 | } |
51 | | |
52 | 0 | fn full(&self) -> bool { |
53 | 0 | false |
54 | 0 | } |
55 | | } |
56 | | |
57 | | impl<'r, R, ID, T> UnindexedConsumer<T> for ReduceConsumer<'r, R, ID> |
58 | | where |
59 | | R: Fn(T, T) -> T + Sync, |
60 | | ID: Fn() -> T + Sync, |
61 | | T: Send, |
62 | | { |
63 | 0 | fn split_off_left(&self) -> Self { |
64 | 0 | *self |
65 | 0 | } |
66 | | |
67 | 0 | fn to_reducer(&self) -> Self::Reducer { |
68 | 0 | *self |
69 | 0 | } |
70 | | } |
71 | | |
72 | | impl<'r, R, ID, T> Reducer<T> for ReduceConsumer<'r, R, ID> |
73 | | where |
74 | | R: Fn(T, T) -> T + Sync, |
75 | | { |
76 | 0 | fn reduce(self, left: T, right: T) -> T { |
77 | 0 | (self.reduce_op)(left, right) |
78 | 0 | } |
79 | | } |
80 | | |
81 | | struct ReduceFolder<'r, R, T> { |
82 | | reduce_op: &'r R, |
83 | | item: T, |
84 | | } |
85 | | |
86 | | impl<'r, R, T> Folder<T> for ReduceFolder<'r, R, T> |
87 | | where |
88 | | R: Fn(T, T) -> T, |
89 | | { |
90 | | type Result = T; |
91 | | |
92 | 0 | fn consume(self, item: T) -> Self { |
93 | 0 | ReduceFolder { |
94 | 0 | reduce_op: self.reduce_op, |
95 | 0 | item: (self.reduce_op)(self.item, item), |
96 | 0 | } |
97 | 0 | } |
98 | | |
99 | 0 | fn consume_iter<I>(self, iter: I) -> Self |
100 | 0 | where |
101 | 0 | I: IntoIterator<Item = T>, |
102 | 0 | { |
103 | 0 | ReduceFolder { |
104 | 0 | reduce_op: self.reduce_op, |
105 | 0 | item: iter.into_iter().fold(self.item, self.reduce_op), |
106 | 0 | } |
107 | 0 | } |
108 | | |
109 | 0 | fn complete(self) -> T { |
110 | 0 | self.item |
111 | 0 | } |
112 | | |
113 | 0 | fn full(&self) -> bool { |
114 | 0 | false |
115 | 0 | } |
116 | | } |