@@ -39,7 +39,7 @@ pub struct Buffer<T: Copy> {
39
39
data: *mut T,
40
40
len: usize,
41
41
capacity: usize,
42
- extend_from_slice : extern "C" fn(Buffer<T>, Slice<'_, T> ) -> Buffer<T>,
42
+ reserve : extern "C" fn(Buffer<T>, usize ) -> Buffer<T>,
43
43
drop: extern "C" fn(Buffer<T>),
44
44
}
45
45
@@ -79,32 +79,28 @@ impl<T: Copy> Buffer<T> {
79
79
}
80
80
81
81
pub(super) fn extend_from_slice(&mut self, xs: &[T]) {
82
- // Fast path to avoid going through an FFI call.
83
- if let Some(final_len) = self.len.checked_add(xs.len()) {
84
- if final_len <= self.capacity {
85
- let dst = unsafe { slice::from_raw_parts_mut(self.data, self.capacity) };
86
- dst[self.len..][..xs.len()].copy_from_slice(xs);
87
- self.len = final_len;
88
- return;
89
- }
82
+ if xs.len() > self.capacity.wrapping_sub(self.len) {
83
+ let b = self.take();
84
+ *self = (b.reserve)(b, xs.len());
85
+ }
86
+ unsafe {
87
+ xs.as_ptr().copy_to_nonoverlapping(self.data.add(self.len), xs.len());
88
+ self.len += xs.len();
90
89
}
91
- let b = self.take();
92
- *self = (b.extend_from_slice)(b, Slice::from(xs));
93
90
}
94
91
95
92
pub(super) fn push(&mut self, v: T) {
96
- // Fast path to avoid going through an FFI call.
97
- if let Some(final_len) = self.len.checked_add(1) {
98
- if final_len <= self.capacity {
99
- unsafe {
100
- *self.data.add(self.len) = v;
101
- }
102
- self.len = final_len;
103
- return;
104
- }
93
+ // The code here is taken from Vec::push, and we know that reserve()
94
+ // will panic if we're exceeding isize::MAX bytes and so there's no need
95
+ // to check for overflow.
96
+ if self.len == self.capacity {
97
+ let b = self.take();
98
+ *self = (b.reserve)(b, 1);
99
+ }
100
+ unsafe {
101
+ *self.data.add(self.len) = v;
102
+ self.len += 1;
105
103
}
106
- let b = self.take();
107
- *self = (b.extend_from_slice)(b, Slice::from(std::slice::from_ref(&v)));
108
104
}
109
105
}
110
106
@@ -146,16 +142,16 @@ impl<T: Copy> From<Vec<T>> for Buffer<T> {
146
142
}
147
143
}
148
144
149
- extern "C" fn extend_from_slice <T: Copy>(b: Buffer<T>, xs: Slice<'_, T> ) -> Buffer<T> {
145
+ extern "C" fn reserve <T: Copy>(b: Buffer<T>, additional: usize ) -> Buffer<T> {
150
146
let mut v = to_vec(b);
151
- v.extend_from_slice(&xs );
147
+ v.reserve(additional );
152
148
Buffer::from(v)
153
149
}
154
150
155
151
extern "C" fn drop<T: Copy>(b: Buffer<T>) {
156
152
mem::drop(to_vec(b));
157
153
}
158
154
159
- Buffer { data, len, capacity, extend_from_slice , drop }
155
+ Buffer { data, len, capacity, reserve , drop }
160
156
}
161
157
}
0 commit comments