File tree 1 file changed +17
-15
lines changed
1 file changed +17
-15
lines changed Original file line number Diff line number Diff line change @@ -2121,6 +2121,21 @@ where
2121
2121
}
2122
2122
}
2123
2123
2124
+ fn extend_fold < T > ( self_ : & mut Vec < T > ) -> impl FnMut ( ( ) , T ) -> Result < ( ) , T > + ' _ {
2125
+ move |( ) , element| {
2126
+ let len = self_. len ( ) ;
2127
+ if len < self_. capacity ( ) {
2128
+ unsafe {
2129
+ ptr:: write ( self_. get_unchecked_mut ( len) , element) ;
2130
+ self_. set_len ( len + 1 ) ;
2131
+ Ok ( ( ) )
2132
+ }
2133
+ } else {
2134
+ Err ( element)
2135
+ }
2136
+ }
2137
+ }
2138
+
2124
2139
impl < T > Vec < T > {
2125
2140
fn extend_desugared < I : Iterator < Item = T > > ( & mut self , mut iterator : I ) {
2126
2141
// This is the case for a general iterator.
@@ -2133,21 +2148,8 @@ impl<T> Vec<T> {
2133
2148
let ( lower, _) = iterator. size_hint ( ) ;
2134
2149
self . reserve ( lower) ;
2135
2150
loop {
2136
- let cap = self . capacity ( ) ;
2137
- let result = iterator. try_fold ( ( ) , |( ) , element| {
2138
- let len = self . len ( ) ;
2139
- if len == cap {
2140
- Err ( element)
2141
- } else {
2142
- unsafe {
2143
- ptr:: write ( self . get_unchecked_mut ( len) , element) ;
2144
- self . set_len ( len + 1 ) ;
2145
- Ok ( ( ) )
2146
- }
2147
- }
2148
- } ) ;
2149
- match result {
2150
- Ok ( ( ) ) => return ,
2151
+ match iterator. try_fold ( ( ) , extend_fold ( self ) ) {
2152
+ Ok ( _) => return ,
2151
2153
Err ( element) => {
2152
2154
let ( lower, _) = iterator. size_hint ( ) ;
2153
2155
self . reserve ( lower. saturating_add ( 1 ) ) ;
You can’t perform that action at this time.
0 commit comments