use crate::iter::plumbing::*; use crate::iter::*; use std::fmt; use std::marker::PhantomData; /// Creates a parallel iterator that produces nothing. /// /// This admits no parallelism on its own, but it could be used for code that /// deals with generic parallel iterators. /// /// # Examples /// /// ``` /// use rayon::prelude::*; /// use rayon::iter::empty; /// /// let pi = (0..1234).into_par_iter() /// .chain(empty()) /// .chain(1234..10_000); /// /// assert_eq!(pi.count(), 10_000); /// ``` pub fn empty() -> Empty { Empty { marker: PhantomData, } } /// Iterator adaptor for [the `empty()` function](fn.empty.html). pub struct Empty { marker: PhantomData, } impl Clone for Empty { fn clone(&self) -> Self { empty() } } impl fmt::Debug for Empty { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.pad("Empty") } } impl ParallelIterator for Empty { type Item = T; fn drive_unindexed(self, consumer: C) -> C::Result where C: UnindexedConsumer, { self.drive(consumer) } fn opt_len(&self) -> Option { Some(0) } } impl IndexedParallelIterator for Empty { fn drive(self, consumer: C) -> C::Result where C: Consumer, { consumer.into_folder().complete() } fn len(&self) -> usize { 0 } fn with_producer(self, callback: CB) -> CB::Output where CB: ProducerCallback, { callback.callback(EmptyProducer(PhantomData)) } } /// Private empty producer struct EmptyProducer(PhantomData); impl Producer for EmptyProducer { type Item = T; type IntoIter = std::iter::Empty; fn into_iter(self) -> Self::IntoIter { std::iter::empty() } fn split_at(self, index: usize) -> (Self, Self) { debug_assert_eq!(index, 0); (self, EmptyProducer(PhantomData)) } fn fold_with(self, folder: F) -> F where F: Folder, { folder } }