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