Skip to content

Commit 400732b

Browse files
committed
vec: optimize for size a bit by preventing monomorphizing extend_from_slice.
1 parent e9f8bac commit 400732b

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

src/vec.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -341,17 +341,27 @@ impl<T, S: Storage> VecInner<T, S> {
341341
where
342342
T: Clone,
343343
{
344-
if self.len + other.len() > self.capacity() {
345-
// won't fit in the `Vec`; don't modify anything and return an error
346-
Err(())
347-
} else {
348-
for elem in other {
349-
unsafe {
350-
self.push_unchecked(elem.clone());
344+
pub fn extend_from_slice_inner<T>(
345+
len: &mut usize,
346+
buf: &mut [MaybeUninit<T>],
347+
other: &[T],
348+
) -> Result<(), ()>
349+
where
350+
T: Clone,
351+
{
352+
if *len + other.len() > buf.len() {
353+
// won't fit in the `Vec`; don't modify anything and return an error
354+
Err(())
355+
} else {
356+
for elem in other {
357+
unsafe { *buf.get_unchecked_mut(*len) = MaybeUninit::new(elem.clone()) }
358+
*len += 1;
351359
}
360+
Ok(())
352361
}
353-
Ok(())
354362
}
363+
364+
extend_from_slice_inner(&mut self.len, self.buffer.borrow_mut(), other)
355365
}
356366

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

0 commit comments

Comments
 (0)