Skip to content

Commit 6c20348

Browse files
authored
Rollup merge of rust-lang#123947 - zopsicle:vec_deque-Iter-as_slices, r=Amanieu
Add vec_deque::Iter::as_slices and friends Add the following methods, that work similarly to VecDeque::as_slices: - alloc::collections::vec_deque::Iter::as_slices - alloc::collections::vec_deque::IterMut::into_slices - alloc::collections::vec_deque::IterMut::as_slices - alloc::collections::vec_deque::IterMut::as_mut_slices Obtaining slices from a VecDeque iterator was not previously possible.
2 parents cdf5486 + ff1212e commit 6c20348

File tree

3 files changed

+142
-0
lines changed

3 files changed

+142
-0
lines changed

alloc/src/collections/vec_deque/iter.rs

+34
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,40 @@ impl<'a, T> Iter<'a, T> {
1919
pub(super) fn new(i1: slice::Iter<'a, T>, i2: slice::Iter<'a, T>) -> Self {
2020
Self { i1, i2 }
2121
}
22+
23+
/// Views the underlying data as a pair of subslices of the original data.
24+
///
25+
/// The slices contain, in order, the contents of the deque not yet yielded
26+
/// by the iterator.
27+
///
28+
/// This has the same lifetime as the original `VecDeque`, and so the
29+
/// iterator can continue to be used while this exists.
30+
///
31+
/// # Examples
32+
///
33+
/// ```
34+
/// #![feature(vec_deque_iter_as_slices)]
35+
///
36+
/// use std::collections::VecDeque;
37+
///
38+
/// let mut deque = VecDeque::new();
39+
/// deque.push_back(0);
40+
/// deque.push_back(1);
41+
/// deque.push_back(2);
42+
/// deque.push_front(10);
43+
/// deque.push_front(9);
44+
/// deque.push_front(8);
45+
///
46+
/// let mut iter = deque.iter();
47+
/// iter.next();
48+
/// iter.next_back();
49+
///
50+
/// assert_eq!(iter.as_slices(), (&[9, 10][..], &[0, 1][..]));
51+
/// ```
52+
#[unstable(feature = "vec_deque_iter_as_slices", issue = "123947")]
53+
pub fn as_slices(&self) -> (&'a [T], &'a [T]) {
54+
(self.i1.as_slice(), self.i2.as_slice())
55+
}
2256
}
2357

2458
#[stable(feature = "collection_debug", since = "1.17.0")]

alloc/src/collections/vec_deque/iter_mut.rs

+107
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,113 @@ impl<'a, T> IterMut<'a, T> {
1919
pub(super) fn new(i1: slice::IterMut<'a, T>, i2: slice::IterMut<'a, T>) -> Self {
2020
Self { i1, i2 }
2121
}
22+
23+
/// Views the underlying data as a pair of subslices of the original data.
24+
///
25+
/// The slices contain, in order, the contents of the deque not yet yielded
26+
/// by the iterator.
27+
///
28+
/// To avoid creating `&mut` references that alias, this is forced to
29+
/// consume the iterator.
30+
///
31+
/// # Examples
32+
///
33+
/// ```
34+
/// #![feature(vec_deque_iter_as_slices)]
35+
///
36+
/// use std::collections::VecDeque;
37+
///
38+
/// let mut deque = VecDeque::new();
39+
/// deque.push_back(0);
40+
/// deque.push_back(1);
41+
/// deque.push_back(2);
42+
/// deque.push_front(10);
43+
/// deque.push_front(9);
44+
/// deque.push_front(8);
45+
///
46+
/// let mut iter = deque.iter_mut();
47+
/// iter.next();
48+
/// iter.next_back();
49+
///
50+
/// let slices = iter.into_slices();
51+
/// slices.0[0] = 42;
52+
/// slices.1[0] = 24;
53+
/// assert_eq!(deque.as_slices(), (&[8, 42, 10][..], &[24, 1, 2][..]));
54+
/// ```
55+
#[unstable(feature = "vec_deque_iter_as_slices", issue = "123947")]
56+
pub fn into_slices(self) -> (&'a mut [T], &'a mut [T]) {
57+
(self.i1.into_slice(), self.i2.into_slice())
58+
}
59+
60+
/// Views the underlying data as a pair of subslices of the original data.
61+
///
62+
/// The slices contain, in order, the contents of the deque not yet yielded
63+
/// by the iterator.
64+
///
65+
/// To avoid creating `&mut [T]` references that alias, the returned slices
66+
/// borrow their lifetimes from the iterator the method is applied on.
67+
///
68+
/// # Examples
69+
///
70+
/// ```
71+
/// #![feature(vec_deque_iter_as_slices)]
72+
///
73+
/// use std::collections::VecDeque;
74+
///
75+
/// let mut deque = VecDeque::new();
76+
/// deque.push_back(0);
77+
/// deque.push_back(1);
78+
/// deque.push_back(2);
79+
/// deque.push_front(10);
80+
/// deque.push_front(9);
81+
/// deque.push_front(8);
82+
///
83+
/// let mut iter = deque.iter_mut();
84+
/// iter.next();
85+
/// iter.next_back();
86+
///
87+
/// assert_eq!(iter.as_slices(), (&[9, 10][..], &[0, 1][..]));
88+
/// ```
89+
#[unstable(feature = "vec_deque_iter_as_slices", issue = "123947")]
90+
pub fn as_slices(&self) -> (&[T], &[T]) {
91+
(self.i1.as_slice(), self.i2.as_slice())
92+
}
93+
94+
/// Views the underlying data as a pair of subslices of the original data.
95+
///
96+
/// The slices contain, in order, the contents of the deque not yet yielded
97+
/// by the iterator.
98+
///
99+
/// To avoid creating `&mut [T]` references that alias, the returned slices
100+
/// borrow their lifetimes from the iterator the method is applied on.
101+
///
102+
/// # Examples
103+
///
104+
/// ```
105+
/// #![feature(vec_deque_iter_as_slices)]
106+
///
107+
/// use std::collections::VecDeque;
108+
///
109+
/// let mut deque = VecDeque::new();
110+
/// deque.push_back(0);
111+
/// deque.push_back(1);
112+
/// deque.push_back(2);
113+
/// deque.push_front(10);
114+
/// deque.push_front(9);
115+
/// deque.push_front(8);
116+
///
117+
/// let mut iter = deque.iter_mut();
118+
/// iter.next();
119+
/// iter.next_back();
120+
///
121+
/// iter.as_mut_slices().0[0] = 42;
122+
/// iter.as_mut_slices().1[0] = 24;
123+
/// assert_eq!(deque.as_slices(), (&[8, 42, 10][..], &[24, 1, 2][..]));
124+
/// ```
125+
#[unstable(feature = "vec_deque_iter_as_slices", issue = "123947")]
126+
pub fn as_mut_slices(&mut self) -> (&mut [T], &mut [T]) {
127+
(self.i1.as_mut_slice(), self.i2.as_mut_slice())
128+
}
22129
}
23130

24131
#[stable(feature = "collection_debug", since = "1.17.0")]

alloc/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@
143143
#![feature(sized_type_properties)]
144144
#![feature(slice_from_ptr_range)]
145145
#![feature(slice_index_methods)]
146+
#![feature(slice_iter_mut_as_mut_slice)]
146147
#![feature(slice_ptr_get)]
147148
#![feature(slice_range)]
148149
#![feature(std_internals)]

0 commit comments

Comments
 (0)