]>
Commit | Line | Data |
---|---|---|
2c00a5a8 XL |
1 | //! This module contains the parallel iterator types for double-ended queues |
2 | //! (`VecDeque<T>`). You will rarely need to interact with it directly | |
3 | //! unless you have need to name one of the iterator types. | |
4 | ||
5 | use std::collections::VecDeque; | |
6 | ||
6a06907d XL |
7 | use crate::iter::plumbing::*; |
8 | use crate::iter::*; | |
2c00a5a8 | 9 | |
6a06907d XL |
10 | use crate::slice; |
11 | use crate::vec; | |
2c00a5a8 XL |
12 | |
13 | /// Parallel iterator over a double-ended queue | |
14 | #[derive(Debug, Clone)] | |
15 | pub struct IntoIter<T: Send> { | |
16 | inner: vec::IntoIter<T>, | |
17 | } | |
18 | ||
532ac7d7 | 19 | into_par_vec! { |
2c00a5a8 XL |
20 | VecDeque<T> => IntoIter<T>, |
21 | impl<T: Send> | |
22 | } | |
23 | ||
532ac7d7 | 24 | delegate_indexed_iterator! { |
2c00a5a8 XL |
25 | IntoIter<T> => T, |
26 | impl<T: Send> | |
27 | } | |
28 | ||
2c00a5a8 XL |
29 | /// Parallel iterator over an immutable reference to a double-ended queue |
30 | #[derive(Debug)] | |
6a06907d | 31 | pub struct Iter<'a, T: Sync> { |
2c00a5a8 XL |
32 | inner: Chain<slice::Iter<'a, T>, slice::Iter<'a, T>>, |
33 | } | |
34 | ||
35 | impl<'a, T: Sync> Clone for Iter<'a, T> { | |
36 | fn clone(&self) -> Self { | |
532ac7d7 XL |
37 | Iter { |
38 | inner: self.inner.clone(), | |
39 | } | |
2c00a5a8 XL |
40 | } |
41 | } | |
42 | ||
43 | impl<'a, T: Sync> IntoParallelIterator for &'a VecDeque<T> { | |
44 | type Item = &'a T; | |
45 | type Iter = Iter<'a, T>; | |
46 | ||
47 | fn into_par_iter(self) -> Self::Iter { | |
48 | let (a, b) = self.as_slices(); | |
532ac7d7 XL |
49 | Iter { |
50 | inner: a.into_par_iter().chain(b), | |
51 | } | |
2c00a5a8 XL |
52 | } |
53 | } | |
54 | ||
532ac7d7 | 55 | delegate_indexed_iterator! { |
2c00a5a8 XL |
56 | Iter<'a, T> => &'a T, |
57 | impl<'a, T: Sync + 'a> | |
58 | } | |
59 | ||
2c00a5a8 XL |
60 | /// Parallel iterator over a mutable reference to a double-ended queue |
61 | #[derive(Debug)] | |
6a06907d | 62 | pub struct IterMut<'a, T: Send> { |
2c00a5a8 XL |
63 | inner: Chain<slice::IterMut<'a, T>, slice::IterMut<'a, T>>, |
64 | } | |
65 | ||
66 | impl<'a, T: Send> IntoParallelIterator for &'a mut VecDeque<T> { | |
67 | type Item = &'a mut T; | |
68 | type Iter = IterMut<'a, T>; | |
69 | ||
70 | fn into_par_iter(self) -> Self::Iter { | |
71 | let (a, b) = self.as_mut_slices(); | |
532ac7d7 XL |
72 | IterMut { |
73 | inner: a.into_par_iter().chain(b), | |
74 | } | |
2c00a5a8 XL |
75 | } |
76 | } | |
77 | ||
532ac7d7 | 78 | delegate_indexed_iterator! { |
2c00a5a8 XL |
79 | IterMut<'a, T> => &'a mut T, |
80 | impl<'a, T: Send + 'a> | |
81 | } |