@@ -197,6 +197,28 @@ where
197
197
Vec ( crate :: i:: Vec :: new ( ) )
198
198
}
199
199
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
+
200
222
/* Public API */
201
223
/// Returns the maximum number of elements the vector can hold
202
224
pub fn capacity ( & self ) -> usize {
@@ -644,6 +666,7 @@ where
644
666
645
667
#[ cfg( test) ]
646
668
mod tests {
669
+ use as_slice:: AsSlice ;
647
670
use crate :: { consts:: * , Vec } ;
648
671
649
672
#[ test]
@@ -911,4 +934,30 @@ mod tests {
911
934
v. resize_default ( 1 ) . unwrap ( ) ;
912
935
assert_eq ! ( v[ 0 ] , 0 ) ;
913
936
}
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
+ }
914
963
}
0 commit comments