]>
git.proxmox.com Git - rustc.git/blob - src/vendor/rustc-rayon/src/iter/reduce.rs
1 use super::ParallelIterator
;
2 use super::plumbing
::*;
4 pub fn reduce
<PI
, R
, ID
, T
>(pi
: PI
, identity
: ID
, reduce_op
: R
) -> T
5 where PI
: ParallelIterator
<Item
= T
>,
6 R
: Fn(T
, T
) -> T
+ Sync
,
10 let consumer
= ReduceConsumer
{
12 reduce_op
: &reduce_op
,
14 pi
.drive_unindexed(consumer
)
17 struct ReduceConsumer
<'r
, R
: 'r
, ID
: 'r
> {
22 impl<'r
, R
, ID
> Copy
for ReduceConsumer
<'r
, R
, ID
> {}
24 impl<'r
, R
, ID
> Clone
for ReduceConsumer
<'r
, R
, ID
> {
25 fn clone(&self) -> Self {
30 impl<'r
, R
, ID
, T
> Consumer
<T
> for ReduceConsumer
<'r
, R
, ID
>
31 where R
: Fn(T
, T
) -> T
+ Sync
,
35 type Folder
= ReduceFolder
<'r
, R
, T
>;
39 fn split_at(self, _index
: usize) -> (Self, Self, Self) {
43 fn into_folder(self) -> Self::Folder
{
45 reduce_op
: self.reduce_op
,
46 item
: (self.identity
)(),
50 fn full(&self) -> bool
{
55 impl<'r
, R
, ID
, T
> UnindexedConsumer
<T
> for ReduceConsumer
<'r
, R
, ID
>
56 where R
: Fn(T
, T
) -> T
+ Sync
,
60 fn split_off_left(&self) -> Self {
64 fn to_reducer(&self) -> Self::Reducer
{
69 impl<'r
, R
, ID
, T
> Reducer
<T
> for ReduceConsumer
<'r
, R
, ID
>
70 where R
: Fn(T
, T
) -> T
+ Sync
72 fn reduce(self, left
: T
, right
: T
) -> T
{
73 (self.reduce_op
)(left
, right
)
77 struct ReduceFolder
<'r
, R
: 'r
, T
> {
82 impl<'r
, R
, T
> Folder
<T
> for ReduceFolder
<'r
, R
, T
>
83 where R
: Fn(T
, T
) -> T
87 fn consume(self, item
: T
) -> Self {
89 reduce_op
: self.reduce_op
,
90 item
: (self.reduce_op
)(self.item
, item
),
94 fn consume_iter
<I
>(self, iter
: I
) -> Self
95 where I
: IntoIterator
<Item
= T
>
98 reduce_op
: self.reduce_op
,
99 item
: iter
.into_iter().fold(self.item
, self.reduce_op
),
103 fn complete(self) -> T
{
107 fn full(&self) -> bool
{