Skip to content

Commit 13ab568

Browse files
committed
vec: optimize for size a bit by preventing monomorphizing extend_from_slice.
1 parent 9dce6eb commit 13ab568

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

src/vec.rs

+18-8
Original file line numberDiff line numberDiff line change
@@ -372,17 +372,27 @@ impl<T, S: Storage> VecInner<T, S> {
372372
where
373373
T: Clone,
374374
{
375-
if self.len + other.len() > self.capacity() {
376-
// won't fit in the `Vec`; don't modify anything and return an error
377-
Err(())
378-
} else {
379-
for elem in other {
380-
unsafe {
381-
self.push_unchecked(elem.clone());
375+
pub fn extend_from_slice_inner<T>(
376+
len: &mut usize,
377+
buf: &mut [MaybeUninit<T>],
378+
other: &[T],
379+
) -> Result<(), ()>
380+
where
381+
T: Clone,
382+
{
383+
if *len + other.len() > buf.len() {
384+
// won't fit in the `Vec`; don't modify anything and return an error
385+
Err(())
386+
} else {
387+
for elem in other {
388+
unsafe { *buf.get_unchecked_mut(*len) = MaybeUninit::new(elem.clone()) }
389+
*len += 1;
382390
}
391+
Ok(())
383392
}
384-
Ok(())
385393
}
394+
395+
extend_from_slice_inner(&mut self.len, self.buffer.borrow_mut(), other)
386396
}
387397

388398
/// Removes the last element from a vector and returns it, or `None` if it's empty

0 commit comments

Comments
 (0)