alloc/collections/vec_deque/
spec_extend.rs
1use core::iter::TrustedLen;
2use core::slice;
3
4use super::VecDeque;
5use crate::alloc::Allocator;
6use crate::vec;
7
8pub(super) trait SpecExtend<T, I> {
10 #[track_caller]
11 fn spec_extend(&mut self, iter: I);
12}
13
14impl<T, I, A: Allocator> SpecExtend<T, I> for VecDeque<T, A>
15where
16 I: Iterator<Item = T>,
17{
18 #[track_caller]
19 default fn spec_extend(&mut self, mut iter: I) {
20 while let Some(element) = iter.next() {
27 let (lower, _) = iter.size_hint();
28 self.reserve(lower.saturating_add(1));
29
30 unsafe { self.push_unchecked(element) };
32
33 while self.len < self.capacity() {
35 let Some(element) = iter.next() else {
36 return;
37 };
38 unsafe { self.push_unchecked(element) };
40 }
41 }
42 }
43}
44
45impl<T, I, A: Allocator> SpecExtend<T, I> for VecDeque<T, A>
46where
47 I: TrustedLen<Item = T>,
48{
49 #[track_caller]
50 default fn spec_extend(&mut self, iter: I) {
51 let (low, high) = iter.size_hint();
53 if let Some(additional) = high {
54 debug_assert_eq!(
55 low,
56 additional,
57 "TrustedLen iterator's size hint is not exact: {:?}",
58 (low, high)
59 );
60 self.reserve(additional);
61
62 let written = unsafe {
63 self.write_iter_wrapping(self.to_physical_idx(self.len), iter, additional)
64 };
65
66 debug_assert_eq!(
67 additional, written,
68 "The number of items written to VecDeque doesn't match the TrustedLen size hint"
69 );
70 } else {
71 panic!("capacity overflow");
77 }
78 }
79}
80
81impl<T, A: Allocator> SpecExtend<T, vec::IntoIter<T>> for VecDeque<T, A> {
82 #[track_caller]
83 fn spec_extend(&mut self, mut iterator: vec::IntoIter<T>) {
84 let slice = iterator.as_slice();
85 self.reserve(slice.len());
86
87 unsafe {
88 self.copy_slice(self.to_physical_idx(self.len), slice);
89 self.len += slice.len();
90 }
91 iterator.forget_remaining_elements();
92 }
93}
94
95impl<'a, T: 'a, I, A: Allocator> SpecExtend<&'a T, I> for VecDeque<T, A>
96where
97 I: Iterator<Item = &'a T>,
98 T: Copy,
99{
100 #[track_caller]
101 default fn spec_extend(&mut self, iterator: I) {
102 self.spec_extend(iterator.copied())
103 }
104}
105
106impl<'a, T: 'a, A: Allocator> SpecExtend<&'a T, slice::Iter<'a, T>> for VecDeque<T, A>
107where
108 T: Copy,
109{
110 #[track_caller]
111 fn spec_extend(&mut self, iterator: slice::Iter<'a, T>) {
112 let slice = iterator.as_slice();
113 self.reserve(slice.len());
114
115 unsafe {
116 self.copy_slice(self.to_physical_idx(self.len), slice);
117 self.len += slice.len();
118 }
119 }
120}