Skip to content

Commit 22995ae

Browse files
committed
add specialization for vec::IntoIter to extend_front
1 parent c5dfa22 commit 22995ae

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
@@ -160,20 +160,58 @@ where
160160
}
161161
}
162162

163+
#[cfg(not(test))]
164+
impl<T, A: Allocator> SpecExtendFront<T, vec::IntoIter<T>> for VecDeque<T, A> {
165+
#[track_caller]
166+
fn spec_extend_front(&mut self, mut iterator: vec::IntoIter<T>) {
167+
let slice = iterator.as_mut_slice();
168+
slice.reverse();
169+
unsafe { prepend(self, slice) };
170+
iterator.forget_remaining_elements();
171+
}
172+
}
173+
163174
#[cfg(not(test))]
164175
impl<T, A: Allocator> SpecExtendFront<T, Rev<vec::IntoIter<T>>> for VecDeque<T, A> {
165176
#[track_caller]
166177
fn spec_extend_front(&mut self, iterator: Rev<vec::IntoIter<T>>) {
167178
let mut iterator = iterator.into_inner();
179+
unsafe { prepend(self, iterator.as_slice()) };
180+
iterator.forget_remaining_elements();
181+
}
182+
}
168183

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

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-
iterator.forget_remaining_elements();
212+
unsafe {
213+
deque.head = deque.wrap_sub(deque.head, slice.len());
214+
deque.copy_slice(deque.head, slice);
215+
deque.len += slice.len();
178216
}
179217
}

0 commit comments

Comments
 (0)