Skip to content

Commit 253cd89

Browse files
bors[bot]dbrgn
andauthored
Merge #151
151: Implement Vec::from_slice r=korken89 a=dbrgn Fixes #150. Co-authored-by: Danilo Bargen <mail@dbrgn.ch>
2 parents 4d613da + 779564c commit 253cd89

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

src/vec.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,28 @@ where
197197
Vec(crate::i::Vec::new())
198198
}
199199

200+
/// Constructs a new vector with a fixed capacity of `N` and fills it
201+
/// with the provided slice.
202+
///
203+
/// This is equivalent to the following code:
204+
///
205+
/// ```
206+
/// use heapless::Vec;
207+
/// use heapless::consts::*;
208+
///
209+
/// let mut v: Vec<u8, U16> = Vec::new();
210+
/// v.extend_from_slice(&[1, 2, 3]).unwrap();
211+
/// ```
212+
#[inline]
213+
pub fn from_slice(other: &[T]) -> Result<Self, ()>
214+
where
215+
T: Clone,
216+
{
217+
let mut v = Vec::new();
218+
v.extend_from_slice(other)?;
219+
Ok(v)
220+
}
221+
200222
/* Public API */
201223
/// Returns the maximum number of elements the vector can hold
202224
pub fn capacity(&self) -> usize {
@@ -644,6 +666,7 @@ where
644666

645667
#[cfg(test)]
646668
mod tests {
669+
use as_slice::AsSlice;
647670
use crate::{consts::*, Vec};
648671

649672
#[test]
@@ -911,4 +934,30 @@ mod tests {
911934
v.resize_default(1).unwrap();
912935
assert_eq!(v[0], 0);
913936
}
937+
938+
#[test]
939+
fn extend_from_slice() {
940+
let mut v: Vec<u8, U4> = Vec::new();
941+
assert_eq!(v.len(), 0);
942+
v.extend_from_slice(&[1, 2]).unwrap();
943+
assert_eq!(v.len(), 2);
944+
assert_eq!(v.as_slice(), &[1, 2]);
945+
v.extend_from_slice(&[3]).unwrap();
946+
assert_eq!(v.len(), 3);
947+
assert_eq!(v.as_slice(), &[1, 2, 3]);
948+
assert!(v.extend_from_slice(&[4, 5]).is_err());
949+
assert_eq!(v.len(), 3);
950+
assert_eq!(v.as_slice(), &[1, 2, 3]);
951+
}
952+
953+
#[test]
954+
fn from_slice() {
955+
// Successful construction
956+
let v: Vec<u8, U4> = Vec::from_slice(&[1, 2, 3]).unwrap();
957+
assert_eq!(v.len(), 3);
958+
assert_eq!(v.as_slice(), &[1, 2, 3]);
959+
960+
// Slice too large
961+
assert!(Vec::<u8, U2>::from_slice(&[1, 2, 3]).is_err());
962+
}
914963
}

0 commit comments

Comments
 (0)