@@ -313,6 +313,16 @@ impl<A: Array> SmallVec<A> {
313313 self . set_len ( len + 1 ) ;
314314 }
315315 }
316+
317+ fn insert_many < I : IntoIterator < Item =A :: Item > > ( & mut self , index : usize , iterable : I ) {
318+ let iter = iterable. into_iter ( ) ;
319+ let ( lower_size_bound, _) = iter. size_hint ( ) ;
320+ self . reserve ( lower_size_bound) ;
321+
322+ for ( off, elem) in iter. enumerate ( ) {
323+ self . insert ( index + off, elem) ;
324+ }
325+ }
316326}
317327
318328impl < A : Array > ops:: Deref for SmallVec < A > {
@@ -421,19 +431,10 @@ impl<A: Array> FromIterator<A::Item> for SmallVec<A> {
421431}
422432
423433impl < A : Array > Extend < A :: Item > for SmallVec < A > {
434+ #[ inline]
424435 fn extend < I : IntoIterator < Item =A :: Item > > ( & mut self , iterable : I ) {
425- let iter = iterable. into_iter ( ) ;
426- let ( lower_size_bound, _) = iter. size_hint ( ) ;
427-
428- let target_len = self . len + lower_size_bound;
429-
430- if target_len > self . capacity ( ) {
431- self . grow ( target_len) ;
432- }
433-
434- for elem in iter {
435- self . push ( elem) ;
436- }
436+ let len = self . len ( ) ;
437+ self . insert_many ( len, iterable) ;
437438 }
438439}
439440
@@ -860,6 +861,17 @@ pub mod tests {
860861 assert_eq ! ( & v. iter( ) . map( |v| * * v) . collect:: <Vec <_>>( ) , & [ 0 , 3 , 2 ] ) ;
861862 }
862863
864+ #[ test]
865+ fn test_insert_many ( ) {
866+ let mut v: SmallVec < [ u8 ; 8 ] > = SmallVec :: new ( ) ;
867+ for x in 0 ..4 {
868+ v. push ( x) ;
869+ }
870+ assert_eq ! ( v. len( ) , 4 ) ;
871+ v. insert_many ( 1 , [ 5 , 6 ] . iter ( ) . cloned ( ) ) ;
872+ assert_eq ! ( & v. iter( ) . map( |v| * v) . collect:: <Vec <_>>( ) , & [ 0 , 5 , 6 , 1 , 2 , 3 ] ) ;
873+ }
874+
863875 #[ test]
864876 #[ should_panic]
865877 fn test_drop_panic_smallvec ( ) {
0 commit comments