Coverage Report

Created: 2025-02-21 07:11

/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
}