diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /third_party/rust/rayon/src/par_either.rs | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/rayon/src/par_either.rs')
-rw-r--r-- | third_party/rust/rayon/src/par_either.rs | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/third_party/rust/rayon/src/par_either.rs b/third_party/rust/rayon/src/par_either.rs new file mode 100644 index 0000000000..a19ce53998 --- /dev/null +++ b/third_party/rust/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), + } + } +} |