@@ -202,53 +202,18 @@ impl<T> TypedArena<T> {
202
202
#[ inline]
203
203
pub fn alloc_from_iter < I : IntoIterator < Item = T > > ( & self , iter : I ) -> & mut [ T ] {
204
204
assert ! ( mem:: size_of:: <T >( ) != 0 ) ;
205
- let mut iter = iter. into_iter ( ) ;
206
- let size_hint = iter. size_hint ( ) ;
207
-
208
- match size_hint {
209
- ( min, Some ( max) ) if min == max => {
210
- // We know the exact number of elements the iterator will produce here
211
- let len = min;
212
-
213
- if len == 0 {
214
- return & mut [ ] ;
215
- }
216
-
217
- self . ensure_capacity ( len) ;
218
-
219
- let slice = self . ptr . get ( ) ;
220
-
221
- unsafe {
222
- let mut ptr = self . ptr . get ( ) ;
223
- for _ in 0 ..len {
224
- // Write into uninitialized memory.
225
- ptr:: write ( ptr, iter. next ( ) . unwrap ( ) ) ;
226
- // Advance the pointer.
227
- ptr = ptr. offset ( 1 ) ;
228
- // Update the pointer per iteration so if `iter.next()` panics
229
- // we destroy the correct amount
230
- self . ptr . set ( ptr) ;
231
- }
232
- slice:: from_raw_parts_mut ( slice, len)
233
- }
234
- }
235
- _ => {
236
- cold_path ( move || -> & mut [ T ] {
237
- let mut vec: SmallVec < [ _ ; 8 ] > = iter. collect ( ) ;
238
- if vec. is_empty ( ) {
239
- return & mut [ ] ;
240
- }
241
- // Move the content to the arena by copying it and then forgetting
242
- // the content of the SmallVec
243
- unsafe {
244
- let len = vec. len ( ) ;
245
- let start_ptr = self . alloc_raw_slice ( len) ;
246
- vec. as_ptr ( ) . copy_to_nonoverlapping ( start_ptr, len) ;
247
- vec. set_len ( 0 ) ;
248
- slice:: from_raw_parts_mut ( start_ptr, len)
249
- }
250
- } )
251
- }
205
+ let mut vec: SmallVec < [ _ ; 8 ] > = iter. into_iter ( ) . collect ( ) ;
206
+ if vec. is_empty ( ) {
207
+ return & mut [ ] ;
208
+ }
209
+ // Move the content to the arena by copying it and then forgetting
210
+ // the content of the SmallVec
211
+ unsafe {
212
+ let len = vec. len ( ) ;
213
+ let start_ptr = self . alloc_raw_slice ( len) ;
214
+ vec. as_ptr ( ) . copy_to_nonoverlapping ( start_ptr, len) ;
215
+ vec. set_len ( 0 ) ;
216
+ slice:: from_raw_parts_mut ( start_ptr, len)
252
217
}
253
218
}
254
219
0 commit comments