@@ -313,6 +313,16 @@ impl<A: Array> SmallVec<A> {
313
313
self . set_len ( len + 1 ) ;
314
314
}
315
315
}
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
+ }
316
326
}
317
327
318
328
impl < A : Array > ops:: Deref for SmallVec < A > {
@@ -421,19 +431,10 @@ impl<A: Array> FromIterator<A::Item> for SmallVec<A> {
421
431
}
422
432
423
433
impl < A : Array > Extend < A :: Item > for SmallVec < A > {
434
+ #[ inline]
424
435
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) ;
437
438
}
438
439
}
439
440
@@ -860,6 +861,17 @@ pub mod tests {
860
861
assert_eq ! ( & v. iter( ) . map( |v| * * v) . collect:: <Vec <_>>( ) , & [ 0 , 3 , 2 ] ) ;
861
862
}
862
863
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
+
863
875
#[ test]
864
876
#[ should_panic]
865
877
fn test_drop_panic_smallvec ( ) {
0 commit comments