@@ -317,13 +317,50 @@ impl<T, G: Growth> PinnedVec<T> for SplitVec<T, G> {
317317 let last = & mut self . fragments [ f] ;
318318 let available = last. room ( ) ;
319319
320- if available < slice. len ( ) {
321- last. extend_from_slice ( & slice[ 0 ..available] ) ;
322- slice = & slice[ available..] ;
320+ match available < slice. len ( ) {
321+ true => {
322+ last. extend_from_slice ( & slice[ 0 ..available] ) ;
323+ slice = & slice[ available..] ;
324+ self . add_fragment ( ) ;
325+ }
326+ false => {
327+ last. extend_from_slice ( slice) ;
328+ break ;
329+ }
330+ }
331+ }
332+ }
333+
334+ unsafe fn extend_from_nonoverlapping ( & mut self , mut src : * const T , count : usize ) {
335+ self . len += count;
336+ let mut left = count;
337+ while left > 0 {
338+ if !self . has_capacity_for_one ( ) {
323339 self . add_fragment ( ) ;
324- } else {
325- last. extend_from_slice ( slice) ;
326- break ;
340+ }
341+ let f = self . fragments . len ( ) - 1 ;
342+
343+ let last = & mut self . fragments [ f] ;
344+ let last_len = last. len ( ) ;
345+ let last_available = last. room ( ) ;
346+
347+ let dst = unsafe { last. as_mut_ptr ( ) . add ( last. len ( ) ) } ;
348+ match last_available < left {
349+ true => {
350+ unsafe { dst. copy_from_nonoverlapping ( src, last_available) } ;
351+ unsafe { last. set_len ( last_len + last_available) } ;
352+ debug_assert_eq ! ( last. len( ) , last. capacity( ) ) ;
353+
354+ src = unsafe { src. add ( last_available) } ;
355+ left -= last_available;
356+
357+ self . add_fragment ( ) ;
358+ }
359+ false => {
360+ unsafe { dst. copy_from_nonoverlapping ( src, left) } ;
361+ unsafe { last. set_len ( last_len + left) } ;
362+ break ;
363+ }
327364 }
328365 }
329366 }
0 commit comments