aboutsummaryrefslogtreecommitdiff
path: root/src/vec.rs
diff options
context:
space:
mode:
authorJoel Galenson <jgalenson@google.com>2021-05-19 16:31:56 -0700
committerJoel Galenson <jgalenson@google.com>2021-05-19 16:31:56 -0700
commitdd2305def6fff1d9f1149ecb73b02e37eb8a18b0 (patch)
treea915bf2398b238dbd70ae338a6bb643a7372de84 /src/vec.rs
parent698313e1f73ce48237108f63ba85b3000f9d0ff1 (diff)
downloadrayon-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.rs39
1 files changed, 33 insertions, 6 deletions
diff --git a/src/vec.rs b/src/vec.rs
index 686673b..1e68aa0 100644
--- a/src/vec.rs
+++ b/src/vec.rs
@@ -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) })
}
}