@@ -2123,20 +2123,35 @@ where
2123
2123
2124
2124
fn extend_fold < T > ( self_ : & mut Vec < T > ) -> impl FnMut ( ( ) , T ) -> Result < ( ) , T > + ' _ {
2125
2125
move |( ) , element| {
2126
- let len = self_. len ( ) ;
2127
- if len < self_. capacity ( ) {
2126
+ if self_. len ( ) < self_. capacity ( ) {
2128
2127
unsafe {
2129
- ptr:: write ( self_. get_unchecked_mut ( len) , element) ;
2130
- self_. set_len ( len + 1 ) ;
2131
- Ok ( ( ) )
2128
+ self_. push_unchecked ( element) ;
2132
2129
}
2130
+ Ok ( ( ) )
2133
2131
} else {
2134
2132
Err ( element)
2135
2133
}
2136
2134
}
2137
2135
}
2138
2136
2139
2137
impl < T > Vec < T > {
2138
+ unsafe fn push_unchecked ( & mut self , value : T ) {
2139
+ let end = self . as_mut_ptr ( ) . add ( self . len ) ;
2140
+ ptr:: write ( end, value) ;
2141
+ // NB can't overflow since we would have had to alloc the address space
2142
+ self . len += 1 ;
2143
+ }
2144
+
2145
+ #[ cold]
2146
+ #[ inline( never) ]
2147
+ fn extend_desugared_fallback < I : Iterator < Item = T > > ( & mut self , iterator : & I , element : T ) {
2148
+ let ( lower, _) = iterator. size_hint ( ) ;
2149
+ self . reserve ( lower. saturating_add ( 1 ) ) ;
2150
+ unsafe {
2151
+ self . push_unchecked ( element) ;
2152
+ }
2153
+ }
2154
+
2140
2155
fn extend_desugared < I : Iterator < Item = T > > ( & mut self , mut iterator : I ) {
2141
2156
// This is the case for a general iterator.
2142
2157
//
@@ -2147,20 +2162,8 @@ impl<T> Vec<T> {
2147
2162
// }
2148
2163
let ( lower, _) = iterator. size_hint ( ) ;
2149
2164
self . reserve ( lower) ;
2150
- loop {
2151
- match iterator. try_fold ( ( ) , extend_fold ( self ) ) {
2152
- Ok ( _) => return ,
2153
- Err ( element) => {
2154
- let ( lower, _) = iterator. size_hint ( ) ;
2155
- self . reserve ( lower. saturating_add ( 1 ) ) ;
2156
- unsafe {
2157
- let len = self . len ( ) ;
2158
- ptr:: write ( self . get_unchecked_mut ( len) , element) ;
2159
- // NB can't overflow since we would have had to alloc the address space
2160
- self . set_len ( len + 1 ) ;
2161
- }
2162
- }
2163
- }
2165
+ while let Err ( element) = iterator. try_fold ( ( ) , extend_fold ( self ) ) {
2166
+ self . extend_desugared_fallback ( & iterator, element) ;
2164
2167
}
2165
2168
}
2166
2169
0 commit comments