@@ -1009,7 +1009,7 @@ impl<A: Array> SmallVec<A> {
1009
1009
/// Insert multiple elements at position `index`, shifting all following elements toward the
1010
1010
/// back.
1011
1011
pub fn insert_many < I : IntoIterator < Item = A :: Item > > ( & mut self , index : usize , iterable : I ) {
1012
- let iter = iterable. into_iter ( ) ;
1012
+ let mut iter = iterable. into_iter ( ) ;
1013
1013
if index == self . len ( ) {
1014
1014
return self . extend ( iter) ;
1015
1015
}
@@ -1019,11 +1019,13 @@ impl<A: Array> SmallVec<A> {
1019
1019
assert ! ( index + lower_size_bound >= index) ; // Protect against overflow
1020
1020
self . reserve ( lower_size_bound) ;
1021
1021
1022
+ let mut num_added = 0 ;
1023
+ let old_len = self . len ( ) ;
1024
+ assert ! ( index <= old_len) ;
1025
+
1022
1026
unsafe {
1023
- let old_len = self . len ( ) ;
1024
- assert ! ( index <= old_len) ;
1025
1027
let start = self . as_mut_ptr ( ) ;
1026
- let mut ptr = start. add ( index) ;
1028
+ let ptr = start. add ( index) ;
1027
1029
1028
1030
// Move the trailing elements.
1029
1031
ptr:: copy ( ptr, ptr. add ( lower_size_bound) , old_len - index) ;
@@ -1036,26 +1038,16 @@ impl<A: Array> SmallVec<A> {
1036
1038
len : old_len + lower_size_bound,
1037
1039
} ;
1038
1040
1039
- let mut num_added = 0 ;
1040
- for element in iter {
1041
- let mut cur = ptr. add ( num_added) ;
1042
- if num_added >= lower_size_bound {
1043
- // Iterator provided more elements than the hint. Move trailing items again.
1044
- self . reserve ( 1 ) ;
1045
- let start = self . as_mut_ptr ( ) ;
1046
- ptr = start. add ( index) ;
1047
- cur = ptr. add ( num_added) ;
1048
- ptr:: copy ( cur, cur. add ( 1 ) , old_len - index) ;
1049
-
1050
- guard. start = start;
1051
- guard. len += 1 ;
1052
- guard. skip . end += 1 ;
1053
- }
1041
+ while num_added < lower_size_bound {
1042
+ let element = match iter. next ( ) {
1043
+ Some ( x) => x,
1044
+ None => break ,
1045
+ } ;
1046
+ let cur = ptr. add ( num_added) ;
1054
1047
ptr:: write ( cur, element) ;
1055
1048
guard. skip . start += 1 ;
1056
1049
num_added += 1 ;
1057
1050
}
1058
- mem:: forget ( guard) ;
1059
1051
1060
1052
if num_added < lower_size_bound {
1061
1053
// Iterator provided fewer elements than the hint
@@ -1066,12 +1058,26 @@ impl<A: Array> SmallVec<A> {
1066
1058
) ;
1067
1059
}
1068
1060
1061
+ // There are no more duplicate or uninitialized slots, so the guard is not needed.
1069
1062
self . set_len ( old_len + num_added) ;
1063
+ mem:: forget ( guard) ;
1064
+ }
1065
+
1066
+ unsafe {
1067
+ for element in iter {
1068
+ // Iterator provided more elements than the hint. Move trailing items again.
1069
+ self . reserve ( 1 ) ;
1070
+ let cur = self . as_mut_ptr ( ) . add ( index) . add ( num_added) ;
1071
+ ptr:: copy ( cur, cur. add ( 1 ) , old_len - index) ;
1072
+ ptr:: write ( cur, element) ;
1073
+ self . set_len ( self . len ( ) + 1 ) ;
1074
+ num_added += 1 ;
1075
+ }
1070
1076
}
1071
1077
1072
1078
struct DropOnPanic < T > {
1073
1079
start : * mut T ,
1074
- skip : Range < usize > ,
1080
+ skip : Range < usize > , // Space we copied-out-of, but haven't written-to yet.
1075
1081
len : usize ,
1076
1082
}
1077
1083
0 commit comments