@@ -154,20 +154,58 @@ where
154
154
}
155
155
}
156
156
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
+
157
168
#[ cfg( not( test) ) ]
158
169
impl < T , A : Allocator > SpecExtendFront < T , Rev < vec:: IntoIter < T > > > for VecDeque < T , A > {
159
170
#[ track_caller]
160
171
fn spec_extend_front ( & mut self , iterator : Rev < vec:: IntoIter < T > > ) {
161
172
let mut iterator = iterator. into_inner ( ) ;
173
+ unsafe { prepend ( self , iterator. as_slice ( ) ) } ;
174
+ iterator. forget_remaining_elements ( ) ;
175
+ }
176
+ }
162
177
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 ( ) ) ;
165
205
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 ( ) ;
172
210
}
173
211
}
0 commit comments