diff options
author | Joel Galenson <jgalenson@google.com> | 2021-05-19 16:31:56 -0700 |
---|---|---|
committer | Joel Galenson <jgalenson@google.com> | 2021-05-19 16:31:56 -0700 |
commit | dd2305def6fff1d9f1149ecb73b02e37eb8a18b0 (patch) | |
tree | a915bf2398b238dbd70ae338a6bb643a7372de84 /src/vec.rs | |
parent | 698313e1f73ce48237108f63ba85b3000f9d0ff1 (diff) | |
download | rayon-dd2305def6fff1d9f1149ecb73b02e37eb8a18b0.tar.gz |
Upgrade rust/crates/rayon to 1.5.1
Test: make
Change-Id: I40c1a4538832871d1f4cd09daf6904d094b5615e
Diffstat (limited to 'src/vec.rs')
-rw-r--r-- | src/vec.rs | 39 |
1 files changed, 33 insertions, 6 deletions
@@ -8,12 +8,31 @@ use crate::iter::plumbing::*; use crate::iter::*; use crate::math::simplify_range; +use crate::slice::{Iter, IterMut}; use std::iter; use std::mem; use std::ops::{Range, RangeBounds}; use std::ptr; use std::slice; +impl<'data, T: Sync + 'data> IntoParallelIterator for &'data Vec<T> { + 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> IntoParallelIterator for &'data mut Vec<T> { + type Item = &'data mut T; + type Iter = IterMut<'data, T>; + + fn into_par_iter(self) -> Self::Iter { + <&mut [T]>::into_par_iter(self) + } +} + /// Parallel iterator that moves out of a vector. #[derive(Debug, Clone)] pub struct IntoIter<T: Send> { @@ -122,12 +141,16 @@ impl<'data, T: Send> IndexedParallelIterator for Drain<'data, T> { let start = self.range.start; self.vec.set_len(start); - // Get a correct borrow lifetime, then extend it to the original length. - let mut slice = &mut self.vec[start..]; - slice = slice::from_raw_parts_mut(slice.as_mut_ptr(), self.range.len()); + // Create the producer as the exclusive "owner" of the slice. + let producer = { + // Get a correct borrow lifetime, then extend it to the original length. + let mut slice = &mut self.vec[start..]; + slice = slice::from_raw_parts_mut(slice.as_mut_ptr(), self.range.len()); + DrainProducer::new(slice) + }; // The producer will move or drop each item from the drained range. - callback.callback(DrainProducer::new(slice)) + callback.callback(producer) } } } @@ -208,7 +231,9 @@ impl<'data, T: 'data> Iterator for SliceDrain<'data, T> { type Item = T; fn next(&mut self) -> Option<T> { - let ptr = self.iter.next()?; + // Coerce the pointer early, so we don't keep the + // reference that's about to be invalidated. + let ptr: *const T = self.iter.next()?; Some(unsafe { ptr::read(ptr) }) } @@ -223,7 +248,9 @@ impl<'data, T: 'data> Iterator for SliceDrain<'data, T> { impl<'data, T: 'data> DoubleEndedIterator for SliceDrain<'data, T> { fn next_back(&mut self) -> Option<Self::Item> { - let ptr = self.iter.next_back()?; + // Coerce the pointer early, so we don't keep the + // reference that's about to be invalidated. + let ptr: *const T = self.iter.next_back()?; Some(unsafe { ptr::read(ptr) }) } } |