From 400732b1b12295a7764d95865eee57836d1e7ae1 Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Fri, 28 Jun 2024 03:31:24 +0200 Subject: [PATCH] vec: optimize for size a bit by preventing monomorphizing extend_from_slice. --- src/vec.rs | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/vec.rs b/src/vec.rs index 2297087fbb..0378fc608b 100644 --- a/src/vec.rs +++ b/src/vec.rs @@ -341,17 +341,27 @@ impl VecInner { where T: Clone, { - if self.len + other.len() > self.capacity() { - // won't fit in the `Vec`; don't modify anything and return an error - Err(()) - } else { - for elem in other { - unsafe { - self.push_unchecked(elem.clone()); + pub fn extend_from_slice_inner( + len: &mut usize, + buf: &mut [MaybeUninit], + other: &[T], + ) -> Result<(), ()> + where + T: Clone, + { + if *len + other.len() > buf.len() { + // won't fit in the `Vec`; don't modify anything and return an error + Err(()) + } else { + for elem in other { + unsafe { *buf.get_unchecked_mut(*len) = MaybeUninit::new(elem.clone()) } + *len += 1; } + Ok(()) } - Ok(()) } + + extend_from_slice_inner(&mut self.len, self.buffer.borrow_mut(), other) } /// Removes the last element from a vector and returns it, or `None` if it's empty