diff options
author | Jakub Kotur <qtr@google.com> | 2021-03-16 20:22:30 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-03-16 20:22:30 +0000 |
commit | 4c0b8e0ef78bcd80a4facc34c6a2158d83f96802 (patch) | |
tree | 13641ab7afc7aa43b586606c18d53084dedf7ace /src/delegate.rs | |
parent | a679e9b8b7e4ae27a19b81f216e375ea8a9cdb8e (diff) | |
parent | 7522a9ba008ac88224e0990932bdd298a43a2336 (diff) | |
download | rayon-4c0b8e0ef78bcd80a4facc34c6a2158d83f96802.tar.gz |
Initial import of rayon-1.5.0. am: 041839ceab am: d836dd6404 am: 7522a9ba00
Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/rayon/+/1622436
Change-Id: I94b0e06d9da131d6f98db436ad1a178dfff2ec90
Diffstat (limited to 'src/delegate.rs')
-rw-r--r-- | src/delegate.rs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/delegate.rs b/src/delegate.rs new file mode 100644 index 0000000..a537489 --- /dev/null +++ b/src/delegate.rs @@ -0,0 +1,70 @@ +//! Macros for delegating newtype iterators to inner types. + +// Note: these place `impl` bounds at the end, as token gobbling is the only way +// I know how to consume an arbitrary list of constraints, with `$($args:tt)*`. + +/// Creates a parallel iterator implementation which simply wraps an inner type +/// and delegates all methods inward. The actual struct must already be +/// declared with an `inner` field. +/// +/// The implementation of `IntoParallelIterator` should be added separately. +/// +/// # Example +/// +/// ``` +/// delegate_iterator!{ +/// MyIntoIter<T, U> => (T, U), +/// impl<T: Ord + Send, U: Send> +/// } +/// ``` +macro_rules! delegate_iterator { + ($iter:ty => $item:ty , + impl $( $args:tt )* + ) => { + impl $( $args )* ParallelIterator for $iter { + type Item = $item; + + fn drive_unindexed<C>(self, consumer: C) -> C::Result + where C: UnindexedConsumer<Self::Item> + { + self.inner.drive_unindexed(consumer) + } + + fn opt_len(&self) -> Option<usize> { + self.inner.opt_len() + } + } + } +} + +/// Creates an indexed parallel iterator implementation which simply wraps an +/// inner type and delegates all methods inward. The actual struct must already +/// be declared with an `inner` field. +macro_rules! delegate_indexed_iterator { + ($iter:ty => $item:ty , + impl $( $args:tt )* + ) => { + delegate_iterator!{ + $iter => $item , + impl $( $args )* + } + + impl $( $args )* IndexedParallelIterator for $iter { + fn drive<C>(self, consumer: C) -> C::Result + where C: Consumer<Self::Item> + { + self.inner.drive(consumer) + } + + fn len(&self) -> usize { + self.inner.len() + } + + fn with_producer<CB>(self, callback: CB) -> CB::Output + where CB: ProducerCallback<Self::Item> + { + self.inner.with_producer(callback) + } + } + } +} |