File tree Expand file tree Collapse file tree 1 file changed +17
-15
lines changed Expand file tree Collapse file tree 1 file changed +17
-15
lines changed Original file line number Diff line number Diff line change @@ -2121,6 +2121,21 @@ where
21212121 }
21222122}
21232123
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+
21242139impl < T > Vec < T > {
21252140 fn extend_desugared < I : Iterator < Item = T > > ( & mut self , mut iterator : I ) {
21262141 // This is the case for a general iterator.
@@ -2133,21 +2148,8 @@ impl<T> Vec<T> {
21332148 let ( lower, _) = iterator. size_hint ( ) ;
21342149 self . reserve ( lower) ;
21352150 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 ,
21512153 Err ( element) => {
21522154 let ( lower, _) = iterator. size_hint ( ) ;
21532155 self . reserve ( lower. saturating_add ( 1 ) ) ;
You can’t perform that action at this time.
0 commit comments