@@ -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) ) ]
158169impl < 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