usesuper::plumbing::*; usesuper::*; use std::iter; use std::ops::Range; use std::usize;
/// `Enumerate` is an iterator that returns the current count along with the element. /// This struct is created by the [`enumerate()`] method on [`IndexedParallelIterator`] /// /// [`enumerate()`]: trait.IndexedParallelIterator.html#method.enumerate /// [`IndexedParallelIterator`]: trait.IndexedParallelIterator.html #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[derive(Debug, Clone)] pubstruct Enumerate<I: IndexedParallelIterator> {
base: I,
}
impl<I> Enumerate<I> where
I: IndexedParallelIterator,
{ /// Creates a new `Enumerate` iterator. pub(super) fn new(base: I) -> Self {
Enumerate { base }
}
}
impl<I> ParallelIterator for Enumerate<I> where
I: IndexedParallelIterator,
{ type Item = (usize, I::Item);
fn drive_unindexed<C>(self, consumer: C) -> C::Result where
C: UnindexedConsumer<Self::Item>,
{
bridge(self, consumer)
}
impl<P> Producer for EnumerateProducer<P> where
P: Producer,
{ type Item = (usize, P::Item); type IntoIter = iter::Zip<Range<usize>, P::IntoIter>;
fn into_iter(self) -> Self::IntoIter { // Enumerate only works for IndexedParallelIterators. Since those // have a max length of usize::MAX, their max index is // usize::MAX - 1, so the range 0..usize::MAX includes all // possible indices. // // However, we should to use a precise end to the range, otherwise // reversing the iterator may have to walk back a long ways before // `Zip::next_back` can produce anything. let base = self.base.into_iter(); let end = self.offset + base.len();
(self.offset..end).zip(base)
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.