@@ -160,20 +160,58 @@ where
160
160
}
161
161
}
162
162
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
+
163
174
#[ cfg( not( test) ) ]
164
175
impl < T , A : Allocator > SpecExtendFront < T , Rev < vec:: IntoIter < T > > > for VecDeque < T , A > {
165
176
#[ track_caller]
166
177
fn spec_extend_front ( & mut self , iterator : Rev < vec:: IntoIter < T > > ) {
167
178
let mut iterator = iterator. into_inner ( ) ;
179
+ unsafe { prepend ( self , iterator. as_slice ( ) ) } ;
180
+ iterator. forget_remaining_elements ( ) ;
181
+ }
182
+ }
168
183
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 ( ) ) ;
171
211
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 ( ) ;
178
216
}
179
217
}
0 commit comments