1use crate::iter::plumbing::*;
9use crate::iter::*;
10use crate::math::simplify_range;
11use crate::slice::{Iter, IterMut};
12use std::iter;
13use std::mem;
14use std::ops::{Range, RangeBounds};
15use std::ptr;
16use std::slice;
17
18impl<'data, T: Sync + 'data> IntoParallelIterator for &'data Vec<T> {
19 type Item = &'data T;
20 type Iter = Iter<'data, T>;
21
22 fn into_par_iter(self) -> Self::Iter {
23 <&[T]>::into_par_iter(self)
24 }
25}
26
27impl<'data, T: Send + 'data> IntoParallelIterator for &'data mut Vec<T> {
28 type Item = &'data mut T;
29 type Iter = IterMut<'data, T>;
30
31 fn into_par_iter(self) -> Self::Iter {
32 <&mut [T]>::into_par_iter(self)
33 }
34}
35
36#[derive(Debug, Clone)]
38pub struct IntoIter<T: Send> {
39 vec: Vec<T>,
40}
41
42impl<T: Send> IntoParallelIterator for Vec<T> {
43 type Item = T;
44 type Iter = IntoIter<T>;
45
46 fn into_par_iter(self) -> Self::Iter {
47 IntoIter { vec: self }
48 }
49}
50
51impl<T: Send> ParallelIterator for IntoIter<T> {
52 type Item = T;
53
54 fn drive_unindexed<C>(self, consumer: C) -> C::Result
55 where
56 C: UnindexedConsumer<Self::Item>,
57 {
58 bridge(self, consumer)
59 }
60
61 fn opt_len(&self) -> Option<usize> {
62 Some(self.len())
63 }
64}
65
66impl<T: Send> IndexedParallelIterator for IntoIter<T> {
67 fn drive<C>(self, consumer: C) -> C::Result
68 where
69 C: Consumer<Self::Item>,
70 {
71 bridge(self, consumer)
72 }
73
74 fn len(&self) -> usize {
75 self.vec.len()
76 }
77
78 fn with_producer<CB>(mut self, callback: CB) -> CB::Output
79 where
80 CB: ProducerCallback<Self::Item>,
81 {
82 self.vec.par_drain(..).with_producer(callback)
84 }
85}
86
87impl<'data, T: Send> ParallelDrainRange<usize> for &'data mut Vec<T> {
88 type Iter = Drain<'data, T>;
89 type Item = T;
90
91 fn par_drain<R: RangeBounds<usize>>(self, range: R) -> Self::Iter {
92 Drain {
93 orig_len: self.len(),
94 range: simplify_range(range, self.len()),
95 vec: self,
96 }
97 }
98}
99
100#[derive(Debug)]
102pub struct Drain<'data, T: Send> {
103 vec: &'data mut Vec<T>,
104 range: Range<usize>,
105 orig_len: usize,
106}
107
108impl<'data, T: Send> ParallelIterator for Drain<'data, T> {
109 type Item = T;
110
111 fn drive_unindexed<C>(self, consumer: C) -> C::Result
112 where
113 C: UnindexedConsumer<Self::Item>,
114 {
115 bridge(self, consumer)
116 }
117
118 fn opt_len(&self) -> Option<usize> {
119 Some(self.len())
120 }
121}
122
123impl<'data, T: Send> IndexedParallelIterator for Drain<'data, T> {
124 fn drive<C>(self, consumer: C) -> C::Result
125 where
126 C: Consumer<Self::Item>,
127 {
128 bridge(self, consumer)
129 }
130
131 fn len(&self) -> usize {
132 self.range.len()
133 }
134
135 fn with_producer<CB>(self, callback: CB) -> CB::Output
136 where
137 CB: ProducerCallback<Self::Item>,
138 {
139 unsafe {
140 let start = self.range.start;
142 self.vec.set_len(start);
143
144 let producer = {
146 let mut slice = &mut self.vec[start..];
148 slice = slice::from_raw_parts_mut(slice.as_mut_ptr(), self.range.len());
149 DrainProducer::new(slice)
150 };
151
152 callback.callback(producer)
154 }
155 }
156}
157
158impl<'data, T: Send> Drop for Drain<'data, T> {
159 fn drop(&mut self) {
160 if self.range.len() > 0 {
161 let Range { start, end } = self.range;
162 if self.vec.len() != start {
163 assert_eq!(self.vec.len(), self.orig_len);
165 self.vec.drain(start..end);
166 } else if end < self.orig_len {
167 unsafe {
170 let ptr = self.vec.as_mut_ptr().add(start);
171 let tail_ptr = self.vec.as_ptr().add(end);
172 let tail_len = self.orig_len - end;
173 ptr::copy(tail_ptr, ptr, tail_len);
174 self.vec.set_len(start + tail_len);
175 }
176 }
177 }
178 }
179}
180
181pub(crate) struct DrainProducer<'data, T: Send> {
184 slice: &'data mut [T],
185}
186
187impl<'data, T: 'data + Send> DrainProducer<'data, T> {
188 pub(crate) unsafe fn new(slice: &'data mut [T]) -> Self {
192 DrainProducer { slice }
193 }
194}
195
196impl<'data, T: 'data + Send> Producer for DrainProducer<'data, T> {
197 type Item = T;
198 type IntoIter = SliceDrain<'data, T>;
199
200 fn into_iter(mut self) -> Self::IntoIter {
201 let slice = mem::replace(&mut self.slice, &mut []);
203 SliceDrain {
204 iter: slice.iter_mut(),
205 }
206 }
207
208 fn split_at(mut self, index: usize) -> (Self, Self) {
209 let slice = mem::replace(&mut self.slice, &mut []);
211 let (left, right) = slice.split_at_mut(index);
212 unsafe { (DrainProducer::new(left), DrainProducer::new(right)) }
213 }
214}
215
216impl<'data, T: 'data + Send> Drop for DrainProducer<'data, T> {
217 fn drop(&mut self) {
218 unsafe { ptr::drop_in_place(self.slice) };
220 }
221}
222
223pub(crate) struct SliceDrain<'data, T> {
227 iter: slice::IterMut<'data, T>,
228}
229
230impl<'data, T: 'data> Iterator for SliceDrain<'data, T> {
231 type Item = T;
232
233 fn next(&mut self) -> Option<T> {
234 let ptr: *const T = self.iter.next()?;
237 Some(unsafe { ptr::read(ptr) })
238 }
239
240 fn size_hint(&self) -> (usize, Option<usize>) {
241 self.iter.size_hint()
242 }
243
244 fn count(self) -> usize {
245 self.iter.len()
246 }
247}
248
249impl<'data, T: 'data> DoubleEndedIterator for SliceDrain<'data, T> {
250 fn next_back(&mut self) -> Option<Self::Item> {
251 let ptr: *const T = self.iter.next_back()?;
254 Some(unsafe { ptr::read(ptr) })
255 }
256}
257
258impl<'data, T: 'data> ExactSizeIterator for SliceDrain<'data, T> {
259 fn len(&self) -> usize {
260 self.iter.len()
261 }
262}
263
264impl<'data, T: 'data> iter::FusedIterator for SliceDrain<'data, T> {}
265
266impl<'data, T: 'data> Drop for SliceDrain<'data, T> {
267 fn drop(&mut self) {
268 let iter = mem::replace(&mut self.iter, [].iter_mut());
270 unsafe { ptr::drop_in_place(iter.into_slice()) };
271 }
272}