summaryrefslogtreecommitdiffstats
path: root/third_party/rust/rayon/src/par_either.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /third_party/rust/rayon/src/par_either.rs
parentInitial commit. (diff)
downloadfirefox-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.rs74
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),
+ }
+ }
+}