From 29565d76bb97d949162d451b45abd0870f14458b Mon Sep 17 00:00:00 2001 From: Paolo Barbolini Date: Sat, 30 Nov 2024 05:25:23 +0000 Subject: [PATCH] Use `iter::repeat_n` to implement `Vec::extend_with` --- library/alloc/src/vec/mod.rs | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/library/alloc/src/vec/mod.rs b/library/alloc/src/vec/mod.rs index 5bd82560da7ed..50ce897ea97d6 100644 --- a/library/alloc/src/vec/mod.rs +++ b/library/alloc/src/vec/mod.rs @@ -3189,31 +3189,7 @@ impl Vec { #[track_caller] /// Extend the vector by `n` clones of value. fn extend_with(&mut self, n: usize, value: T) { - self.reserve(n); - - unsafe { - let mut ptr = self.as_mut_ptr().add(self.len()); - // Use SetLenOnDrop to work around bug where compiler - // might not realize the store through `ptr` through self.set_len() - // don't alias. - let mut local_len = SetLenOnDrop::new(&mut self.len); - - // Write all elements except the last one - for _ in 1..n { - ptr::write(ptr, value.clone()); - ptr = ptr.add(1); - // Increment the length in every step in case clone() panics - local_len.increment_len(1); - } - - if n > 0 { - // We can write the last element directly without cloning needlessly - ptr::write(ptr, value); - local_len.increment_len(1); - } - - // len set by scope guard - } + self.extend_trusted(iter::repeat_n(value, n)); } }