@@ -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