Skip to content

Commit 4fdacf8

Browse files
committed
add specialization for vec::IntoIter to extend_front
1 parent c5dfa22 commit 4fdacf8

File tree

1 file changed

+47
-12
lines changed

1 file changed

+47
-12
lines changed

library/alloc/src/collections/vec_deque/spec_extend.rs

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
#[cfg(not(test))]
2-
use core::iter::Rev;
3-
use core::iter::TrustedLen;
1+
use core::iter::{Rev, TrustedLen};
42
use core::slice;
53

64
use super::VecDeque;
@@ -160,20 +158,57 @@ where
160158
}
161159
}
162160

161+
#[cfg(not(test))]
162+
impl<T, A: Allocator> SpecExtendFront<T, vec::IntoIter<T>> for VecDeque<T, A> {
163+
#[track_caller]
164+
fn spec_extend_front(&mut self, mut iterator: vec::IntoIter<T>) {
165+
let slice = iterator.as_mut_slice();
166+
slice.reverse();
167+
unsafe { prepend(self, slice) };
168+
iterator.forget_remaining_elements();
169+
}
170+
}
171+
163172
#[cfg(not(test))]
164173
impl<T, A: Allocator> SpecExtendFront<T, Rev<vec::IntoIter<T>>> for VecDeque<T, A> {
165174
#[track_caller]
166175
fn spec_extend_front(&mut self, iterator: Rev<vec::IntoIter<T>>) {
167176
let mut iterator = iterator.into_inner();
168-
169-
let slice = iterator.as_slice();
170-
self.reserve(slice.len());
171-
172-
unsafe {
173-
self.head = self.wrap_sub(self.head, slice.len());
174-
self.copy_slice(self.head, slice);
175-
self.len += slice.len();
176-
}
177+
unsafe { prepend(self, iterator.as_slice()) };
177178
iterator.forget_remaining_elements();
178179
}
179180
}
181+
182+
// impl<T, A: Allocator> SpecExtendFront<T, Copied<slice::Iter<'_, T>>> for VecDeque<T, A>
183+
// where
184+
// T: Copy,
185+
// {
186+
// #[track_caller]
187+
// fn spec_extend_front(&mut self, _iter: Copied<slice::Iter<'_, T>>) {
188+
// // unsafe { prepend(self, slice) };
189+
// // reverse in place?
190+
// }
191+
// }
192+
193+
// impl<T, A: Allocator> SpecExtendFront<T, Rev<Copied<slice::Iter<'_, T>>>> for VecDeque<T, A>
194+
// where
195+
// T: Copy,
196+
// {
197+
// #[track_caller]
198+
// fn spec_extend_front(&mut self, iter: Rev<Copied<slice::Iter<'_, T>>>) {
199+
// unsafe { prepend(self, iter.into_inner().it.as_slice()) };
200+
// }
201+
// }
202+
203+
/// # Safety
204+
///
205+
/// `slice` will be copied into the deque, make sure to forget the items if `T` is not `Copy`.
206+
unsafe fn prepend<T, A: Allocator>(deque: &mut VecDeque<T, A>, slice: &[T]) {
207+
deque.reserve(slice.len());
208+
209+
unsafe {
210+
deque.head = deque.wrap_sub(deque.head, slice.len());
211+
deque.copy_slice(deque.head, slice);
212+
deque.len += slice.len();
213+
}
214+
}

0 commit comments

Comments
 (0)