|
1 | | -#[cfg(not(test))] |
2 | | -use core::iter::Rev; |
3 | | -use core::iter::TrustedLen; |
| 1 | +use core::iter::{Rev, TrustedLen}; |
4 | 2 | use core::slice; |
5 | 3 |
|
6 | 4 | use super::VecDeque; |
@@ -160,20 +158,57 @@ where |
160 | 158 | } |
161 | 159 | } |
162 | 160 |
|
| 161 | +#[cfg(not(test))] |
| 162 | +impl<T, A: Allocator> SpecExtendFront<T, vec::IntoIter<T>> for VecDeque<T, A> { |
| 163 | + #[track_caller] |
| 164 | + fn spec_extend_front(&mut self, mut iterator: vec::IntoIter<T>) { |
| 165 | + let slice = iterator.as_mut_slice(); |
| 166 | + slice.reverse(); |
| 167 | + unsafe { prepend(self, slice) }; |
| 168 | + iterator.forget_remaining_elements(); |
| 169 | + } |
| 170 | +} |
| 171 | + |
163 | 172 | #[cfg(not(test))] |
164 | 173 | impl<T, A: Allocator> SpecExtendFront<T, Rev<vec::IntoIter<T>>> for VecDeque<T, A> { |
165 | 174 | #[track_caller] |
166 | 175 | fn spec_extend_front(&mut self, iterator: Rev<vec::IntoIter<T>>) { |
167 | 176 | let mut iterator = iterator.into_inner(); |
168 | | - |
169 | | - let slice = iterator.as_slice(); |
170 | | - self.reserve(slice.len()); |
171 | | - |
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 | + unsafe { prepend(self, iterator.as_slice()) }; |
177 | 178 | iterator.forget_remaining_elements(); |
178 | 179 | } |
179 | 180 | } |
| 181 | + |
| 182 | +// impl<T, A: Allocator> SpecExtendFront<T, Copied<slice::Iter<'_, T>>> for VecDeque<T, A> |
| 183 | +// where |
| 184 | +// T: Copy, |
| 185 | +// { |
| 186 | +// #[track_caller] |
| 187 | +// fn spec_extend_front(&mut self, _iter: Copied<slice::Iter<'_, T>>) { |
| 188 | +// // unsafe { prepend(self, slice) }; |
| 189 | +// // reverse in place? |
| 190 | +// } |
| 191 | +// } |
| 192 | + |
| 193 | +// impl<T, A: Allocator> SpecExtendFront<T, Rev<Copied<slice::Iter<'_, T>>>> for VecDeque<T, A> |
| 194 | +// where |
| 195 | +// T: Copy, |
| 196 | +// { |
| 197 | +// #[track_caller] |
| 198 | +// fn spec_extend_front(&mut self, iter: Rev<Copied<slice::Iter<'_, T>>>) { |
| 199 | +// unsafe { prepend(self, iter.into_inner().it.as_slice()) }; |
| 200 | +// } |
| 201 | +// } |
| 202 | + |
| 203 | +/// # Safety |
| 204 | +/// |
| 205 | +/// `slice` will be copied into the deque, make sure to forget the items if `T` is not `Copy`. |
| 206 | +unsafe fn prepend<T, A: Allocator>(deque: &mut VecDeque<T, A>, slice: &[T]) { |
| 207 | + deque.reserve(slice.len()); |
| 208 | + |
| 209 | + unsafe { |
| 210 | + deque.head = deque.wrap_sub(deque.head, slice.len()); |
| 211 | + deque.copy_slice(deque.head, slice); |
| 212 | + deque.len += slice.len(); |
| 213 | + } |
| 214 | +} |
0 commit comments