From c21132b4953274168ec879a882b1fad9eeadaf14 Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sat, 18 Jan 2020 16:23:35 +0100 Subject: [PATCH] Simplify resize with element or function Avoids a call to Clone of the element by using the provided instance as the one inserted last. A similar optimization is used in the standard library. Also changes the iteration to an independent iterator as the number of insert elements must be known in advance. --- src/arrayvec.rs | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/arrayvec.rs b/src/arrayvec.rs index c9285ca..1c007d9 100644 --- a/src/arrayvec.rs +++ b/src/arrayvec.rs @@ -414,14 +414,14 @@ impl ArrayVec { where A::Item: Clone, { - use core::cmp::Ordering; - match new_len.cmp(&self.len) { - Ordering::Less => self.truncate(new_len), - Ordering::Equal => (), - Ordering::Greater => { - while self.len < new_len { + match new_len.checked_sub(self.len) { + None => self.truncate(new_len), + Some(0) => (), + Some(new_elements) => { + for _ in 1..new_elements { self.push(new_val.clone()); } + self.push(new_val); } } } @@ -454,12 +454,10 @@ impl ArrayVec { new_len: usize, mut f: F, ) { - use core::cmp::Ordering; - match new_len.cmp(&self.len) { - Ordering::Less => self.truncate(new_len), - Ordering::Equal => (), - Ordering::Greater => { - while self.len < new_len { + match new_len.checked_sub(self.len) { + None => self.truncate(new_len), + Some(new_elements) => { + for _ in 0..new_elements { self.push(f()); } }