@@ -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