diff --git a/lib.rs b/lib.rs index c6642a6..09f925f 100644 --- a/lib.rs +++ b/lib.rs @@ -1340,18 +1340,16 @@ impl Extend for SmallVec { self.reserve(lower_size_bound); unsafe { - let len = self.len(); - let ptr = self.as_mut_ptr().offset(len as isize); - let mut count = 0; - while count < lower_size_bound { + let (ptr, len_ptr, cap) = self.triple_mut(); + let mut len = SetLenOnDrop::new(len_ptr); + while len.get() < cap { if let Some(out) = iter.next() { - ptr::write(ptr.offset(count as isize), out); - count += 1; + ptr::write(ptr.offset(len.get() as isize), out); + len.increment_len(1); } else { break; } } - self.set_len(len + count); } for elem in iter { @@ -1560,6 +1558,11 @@ impl<'a> SetLenOnDrop<'a> { SetLenOnDrop { local_len: *len, len: len } } + #[inline] + fn get(&self) -> usize { + self.local_len + } + #[inline] fn increment_len(&mut self, increment: usize) { self.local_len += increment;