diff options
author | Valentin Popov <valentin@popov.link> | 2024-01-08 00:21:28 +0300 |
---|---|---|
committer | Valentin Popov <valentin@popov.link> | 2024-01-08 00:21:28 +0300 |
commit | 1b6a04ca5504955c571d1c97504fb45ea0befee4 (patch) | |
tree | 7579f518b23313e8a9748a88ab6173d5e030b227 /vendor/rayon/src/par_either.rs | |
parent | 5ecd8cf2cba827454317368b68571df0d13d7842 (diff) | |
download | fparkan-1b6a04ca5504955c571d1c97504fb45ea0befee4.tar.xz fparkan-1b6a04ca5504955c571d1c97504fb45ea0befee4.zip |
Initial vendor packages
Signed-off-by: Valentin Popov <valentin@popov.link>
Diffstat (limited to 'vendor/rayon/src/par_either.rs')
-rw-r--r-- | vendor/rayon/src/par_either.rs | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/vendor/rayon/src/par_either.rs b/vendor/rayon/src/par_either.rs new file mode 100644 index 0000000..a19ce53 --- /dev/null +++ b/vendor/rayon/src/par_either.rs @@ -0,0 +1,74 @@ +use crate::iter::plumbing::*; +use crate::iter::Either::{Left, Right}; +use crate::iter::*; + +/// `Either<L, R>` is a parallel iterator if both `L` and `R` are parallel iterators. +impl<L, R> ParallelIterator for Either<L, R> +where + L: ParallelIterator, + R: ParallelIterator<Item = L::Item>, +{ + type Item = L::Item; + + fn drive_unindexed<C>(self, consumer: C) -> C::Result + where + C: UnindexedConsumer<Self::Item>, + { + match self { + Left(iter) => iter.drive_unindexed(consumer), + Right(iter) => iter.drive_unindexed(consumer), + } + } + + fn opt_len(&self) -> Option<usize> { + self.as_ref().either(L::opt_len, R::opt_len) + } +} + +impl<L, R> IndexedParallelIterator for Either<L, R> +where + L: IndexedParallelIterator, + R: IndexedParallelIterator<Item = L::Item>, +{ + fn drive<C>(self, consumer: C) -> C::Result + where + C: Consumer<Self::Item>, + { + match self { + Left(iter) => iter.drive(consumer), + Right(iter) => iter.drive(consumer), + } + } + + fn len(&self) -> usize { + self.as_ref().either(L::len, R::len) + } + + fn with_producer<CB>(self, callback: CB) -> CB::Output + where + CB: ProducerCallback<Self::Item>, + { + match self { + Left(iter) => iter.with_producer(callback), + Right(iter) => iter.with_producer(callback), + } + } +} + +/// `Either<L, R>` can be extended if both `L` and `R` are parallel extendable. +impl<L, R, T> ParallelExtend<T> for Either<L, R> +where + L: ParallelExtend<T>, + R: ParallelExtend<T>, + T: Send, +{ + fn par_extend<I>(&mut self, par_iter: I) + where + I: IntoParallelIterator<Item = T>, + { + match self.as_mut() { + Left(collection) => collection.par_extend(par_iter), + Right(collection) => collection.par_extend(par_iter), + } + } +} |