Skip to content

Commit 552e6f1

Browse files
committed
add specialization for vec::IntoIter to extend_front
1 parent a1bfdfa commit 552e6f1

File tree

1 file changed

+46
-8
lines changed

1 file changed

+46
-8
lines changed

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

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,20 +154,58 @@ where
154154
}
155155
}
156156

157+
#[cfg(not(test))]
158+
impl<T, A: Allocator> SpecExtendFront<T, vec::IntoIter<T>> for VecDeque<T, A> {
159+
#[track_caller]
160+
fn spec_extend_front(&mut self, mut iterator: vec::IntoIter<T>) {
161+
let slice = iterator.as_mut_slice();
162+
slice.reverse();
163+
unsafe { prepend(self, slice) };
164+
iterator.forget_remaining_elements();
165+
}
166+
}
167+
157168
#[cfg(not(test))]
158169
impl<T, A: Allocator> SpecExtendFront<T, Rev<vec::IntoIter<T>>> for VecDeque<T, A> {
159170
#[track_caller]
160171
fn spec_extend_front(&mut self, iterator: Rev<vec::IntoIter<T>>) {
161172
let mut iterator = iterator.into_inner();
173+
unsafe { prepend(self, iterator.as_slice()) };
174+
iterator.forget_remaining_elements();
175+
}
176+
}
162177

163-
let slice = iterator.as_slice();
164-
self.reserve(slice.len());
178+
// impl<T, A: Allocator> SpecExtendFront<T, Copied<slice::Iter<'_, T>>> for VecDeque<T, A>
179+
// where
180+
// T: Copy,
181+
// {
182+
// #[track_caller]
183+
// fn spec_extend_front(&mut self, _iter: Copied<slice::Iter<'_, T>>) {
184+
// // unsafe { prepend(self, slice) };
185+
// // reverse in place?
186+
// }
187+
// }
188+
189+
// impl<T, A: Allocator> SpecExtendFront<T, Rev<Copied<slice::Iter<'_, T>>>> for VecDeque<T, A>
190+
// where
191+
// T: Copy,
192+
// {
193+
// #[track_caller]
194+
// fn spec_extend_front(&mut self, iter: Rev<Copied<slice::Iter<'_, T>>>) {
195+
// unsafe { prepend(self, iter.into_inner().it.as_slice()) };
196+
// }
197+
// }
198+
199+
/// # Safety
200+
///
201+
/// `slice` will be copied into the deque, make sure to forget the items if `T` is not `Copy`.
202+
#[cfg(not(test))]
203+
unsafe fn prepend<T, A: Allocator>(deque: &mut VecDeque<T, A>, slice: &[T]) {
204+
deque.reserve(slice.len());
165205

166-
unsafe {
167-
self.head = self.wrap_sub(self.head, slice.len());
168-
self.copy_slice(self.head, slice);
169-
self.len += slice.len();
170-
}
171-
iterator.forget_remaining_elements();
206+
unsafe {
207+
deque.head = deque.wrap_sub(deque.head, slice.len());
208+
deque.copy_slice(deque.head, slice);
209+
deque.len += slice.len();
172210
}
173211
}

0 commit comments

Comments
 (0)