@@ -315,6 +315,16 @@ impl<A: Array> SmallVec<A> {
315
315
self . set_len ( len + 1 ) ;
316
316
}
317
317
}
318
+
319
+ fn insert_many < I : IntoIterator < Item =A :: Item > > ( & mut self , index : usize , iterable : I ) {
320
+ let iter = iterable. into_iter ( ) ;
321
+ let ( lower_size_bound, _) = iter. size_hint ( ) ;
322
+ self . reserve ( lower_size_bound) ;
323
+
324
+ for ( off, elem) in iter. enumerate ( ) {
325
+ self . insert ( index + off, elem) ;
326
+ }
327
+ }
318
328
}
319
329
320
330
impl < A : Array > ops:: Deref for SmallVec < A > {
@@ -423,19 +433,10 @@ impl<A: Array> FromIterator<A::Item> for SmallVec<A> {
423
433
}
424
434
425
435
impl < A : Array > Extend < A :: Item > for SmallVec < A > {
436
+ #[ inline]
426
437
fn extend < I : IntoIterator < Item =A :: Item > > ( & mut self , iterable : I ) {
427
- let iter = iterable. into_iter ( ) ;
428
- let ( lower_size_bound, _) = iter. size_hint ( ) ;
429
-
430
- let target_len = self . len + lower_size_bound;
431
-
432
- if target_len > self . capacity ( ) {
433
- self . grow ( target_len) ;
434
- }
435
-
436
- for elem in iter {
437
- self . push ( elem) ;
438
- }
438
+ let len = self . len ( ) ;
439
+ self . insert_many ( len, iterable) ;
439
440
}
440
441
}
441
442
@@ -869,6 +870,17 @@ pub mod tests {
869
870
assert_eq ! ( & v. iter( ) . map( |v| * * v) . collect:: <Vec <_>>( ) , & [ 0 , 3 , 2 ] ) ;
870
871
}
871
872
873
+ #[ test]
874
+ fn test_insert_many ( ) {
875
+ let mut v: SmallVec < [ u8 ; 8 ] > = SmallVec :: new ( ) ;
876
+ for x in 0 ..4 {
877
+ v. push ( x) ;
878
+ }
879
+ assert_eq ! ( v. len( ) , 4 ) ;
880
+ v. insert_many ( 1 , [ 5 , 6 ] . iter ( ) . cloned ( ) ) ;
881
+ assert_eq ! ( & v. iter( ) . map( |v| * v) . collect:: <Vec <_>>( ) , & [ 0 , 5 , 6 , 1 , 2 , 3 ] ) ;
882
+ }
883
+
872
884
#[ test]
873
885
#[ should_panic]
874
886
fn test_drop_panic_smallvec ( ) {
0 commit comments