@@ -42,7 +42,7 @@ pub struct Buffer<T: Copy> {
4242 data : * mut T ,
4343 len : usize ,
4444 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 > ,
4646 drop : extern "C" fn ( Buffer < T > ) ,
4747}
4848
@@ -82,17 +82,28 @@ impl<T: Copy> Buffer<T> {
8282 }
8383
8484 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 ;
93106 }
94- let b = self . take ( ) ;
95- * self = ( b. extend_from_slice ) ( b, Slice :: from ( xs) ) ;
96107 }
97108}
98109
@@ -134,16 +145,16 @@ impl<T: Copy> From<Vec<T>> for Buffer<T> {
134145 }
135146 }
136147
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 > {
138149 let mut v = to_vec ( b) ;
139- v. extend_from_slice ( & xs ) ;
150+ v. reserve ( additional ) ;
140151 Buffer :: from ( v)
141152 }
142153
143154 extern "C" fn drop < T : Copy > ( b : Buffer < T > ) {
144155 mem:: drop ( to_vec ( b) ) ;
145156 }
146157
147- Buffer { data, len, capacity, extend_from_slice , drop }
158+ Buffer { data, len, capacity, reserve , drop }
148159 }
149160}
0 commit comments