diff --git a/src/vec.rs b/src/vec.rs index 274b06c55bb7579165d6edbf2e279ebf66dfe898..c8ea1219dac61218afa13b43da1cf110b5fcb568 100644 --- a/src/vec.rs +++ b/src/vec.rs @@ -86,6 +86,29 @@ where } } } + + /// Resizes the Vec in-place so that len is equal to new_len. + /// + /// If new_len is greater than len, the Vec is extended by the + /// difference, with each additional slot filled with value. If + /// new_len is less than len, the Vec is simply truncated. + pub fn resize(&mut self, new_len: usize, value: T) + -> Result<(), BufferFullError> + where T: Clone { + if new_len > self.capacity() { + return Err(BufferFullError); + } + + if new_len > self.len { + while self.len < new_len { + self.push(value.clone())?; + } + } else { + self.truncate(new_len); + } + + Ok(()) + } } impl<T, A> Drop for Vec<T, A> @@ -252,4 +275,64 @@ mod tests { assert_eq!(v.pop(), None); assert_eq!(v.len(), 0); } + + #[test] + fn resize_size_limit() { + let mut v: Vec<u8, [u8; 4]> = Vec::new(); + + v.resize(0, 0).unwrap(); + v.resize(4, 0).unwrap(); + v.resize(5, 0).err().expect("BufferFullError"); + } + + #[test] + fn resize_length_cases() { + let mut v: Vec<u8, [u8; 4]> = Vec::new(); + + assert_eq!(v.len(), 0); + + // Grow by 1 + v.resize(1, 0).unwrap(); + assert_eq!(v.len(), 1); + + // Grow by 2 + v.resize(3, 0).unwrap(); + assert_eq!(v.len(), 3); + + // Resize to current size + v.resize(3, 0).unwrap(); + assert_eq!(v.len(), 3); + + // Shrink by 1 + v.resize(2, 0).unwrap(); + assert_eq!(v.len(), 2); + + + // Shrink by 2 + v.resize(0, 0).unwrap(); + assert_eq!(v.len(), 0); + } + + #[test] + fn resize_contents() { + let mut v: Vec<u8, [u8; 4]> = Vec::new(); + + // New entries take supplied value when growing + v.resize(1, 17).unwrap(); + assert_eq!(v[0], 17); + + // Old values aren't changed when growing + v.resize(2, 18).unwrap(); + assert_eq!(v[0], 17); + assert_eq!(v[1], 18); + + // Old values aren't changed when length unchanged + v.resize(2, 0).unwrap(); + assert_eq!(v[0], 17); + assert_eq!(v[1], 18); + + // Old values aren't changed when shrinking + v.resize(1, 0).unwrap(); + assert_eq!(v[0], 17); + } }