| //! Parallel iterator types for [arrays] (`[T; N]`) |
| //! |
| //! You will rarely need to interact with this module directly unless you need |
| //! to name one of the iterator types. |
| //! |
| //! [arrays]: https://doc.rust-lang.org/std/primitive.array.html |
| |
| use crate::iter::plumbing::*; |
| use crate::iter::*; |
| use crate::slice::{Iter, IterMut}; |
| use crate::vec::DrainProducer; |
| use std::mem::ManuallyDrop; |
| |
| impl<'data, T: Sync + 'data, const N: usize> IntoParallelIterator for &'data [T; N] { |
| type Item = &'data T; |
| type Iter = Iter<'data, T>; |
| |
| fn into_par_iter(self) -> Self::Iter { |
| <&[T]>::into_par_iter(self) |
| } |
| } |
| |
| impl<'data, T: Send + 'data, const N: usize> IntoParallelIterator for &'data mut [T; N] { |
| type Item = &'data mut T; |
| type Iter = IterMut<'data, T>; |
| |
| fn into_par_iter(self) -> Self::Iter { |
| <&mut [T]>::into_par_iter(self) |
| } |
| } |
| |
| impl<T: Send, const N: usize> IntoParallelIterator for [T; N] { |
| type Item = T; |
| type Iter = IntoIter<T, N>; |
| |
| fn into_par_iter(self) -> Self::Iter { |
| IntoIter { array: self } |
| } |
| } |
| |
| /// Parallel iterator that moves out of an array. |
| #[derive(Debug, Clone)] |
| pub struct IntoIter<T: Send, const N: usize> { |
| array: [T; N], |
| } |
| |
| impl<T: Send, const N: usize> ParallelIterator for IntoIter<T, N> { |
| type Item = T; |
| |
| fn drive_unindexed<C>(self, consumer: C) -> C::Result |
| where |
| C: UnindexedConsumer<Self::Item>, |
| { |
| bridge(self, consumer) |
| } |
| |
| fn opt_len(&self) -> Option<usize> { |
| Some(N) |
| } |
| } |
| |
| impl<T: Send, const N: usize> IndexedParallelIterator for IntoIter<T, N> { |
| fn drive<C>(self, consumer: C) -> C::Result |
| where |
| C: Consumer<Self::Item>, |
| { |
| bridge(self, consumer) |
| } |
| |
| fn len(&self) -> usize { |
| N |
| } |
| |
| fn with_producer<CB>(self, callback: CB) -> CB::Output |
| where |
| CB: ProducerCallback<Self::Item>, |
| { |
| unsafe { |
| // Drain every item, and then the local array can just fall out of scope. |
| let mut array = ManuallyDrop::new(self.array); |
| let producer = DrainProducer::new(array.as_mut_slice()); |
| callback.callback(producer) |
| } |
| } |
| } |