From 779564cb9f1c3289906c2c314caadafe32a6bedc Mon Sep 17 00:00:00 2001 From: Danilo Bargen Date: Fri, 17 Apr 2020 10:01:39 +0200 Subject: [PATCH] Implement Vec::from_slice --- src/vec.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/vec.rs b/src/vec.rs index b3dbee7c..1ff94949 100644 --- a/src/vec.rs +++ b/src/vec.rs @@ -197,6 +197,28 @@ where Vec(crate::i::Vec::new()) } + /// Constructs a new vector with a fixed capacity of `N` and fills it + /// with the provided slice. + /// + /// This is equivalent to the following code: + /// + /// ``` + /// use heapless::Vec; + /// use heapless::consts::*; + /// + /// let mut v: Vec = Vec::new(); + /// v.extend_from_slice(&[1, 2, 3]).unwrap(); + /// ``` + #[inline] + pub fn from_slice(other: &[T]) -> Result + where + T: Clone, + { + let mut v = Vec::new(); + v.extend_from_slice(other)?; + Ok(v) + } + /* Public API */ /// Returns the maximum number of elements the vector can hold pub fn capacity(&self) -> usize { @@ -644,6 +666,7 @@ where #[cfg(test)] mod tests { + use as_slice::AsSlice; use crate::{consts::*, Vec}; #[test] @@ -911,4 +934,30 @@ mod tests { v.resize_default(1).unwrap(); assert_eq!(v[0], 0); } + + #[test] + fn extend_from_slice() { + let mut v: Vec = Vec::new(); + assert_eq!(v.len(), 0); + v.extend_from_slice(&[1, 2]).unwrap(); + assert_eq!(v.len(), 2); + assert_eq!(v.as_slice(), &[1, 2]); + v.extend_from_slice(&[3]).unwrap(); + assert_eq!(v.len(), 3); + assert_eq!(v.as_slice(), &[1, 2, 3]); + assert!(v.extend_from_slice(&[4, 5]).is_err()); + assert_eq!(v.len(), 3); + assert_eq!(v.as_slice(), &[1, 2, 3]); + } + + #[test] + fn from_slice() { + // Successful construction + let v: Vec = Vec::from_slice(&[1, 2, 3]).unwrap(); + assert_eq!(v.len(), 3); + assert_eq!(v.as_slice(), &[1, 2, 3]); + + // Slice too large + assert!(Vec::::from_slice(&[1, 2, 3]).is_err()); + } }