@@ -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) ]
646668mod 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