@@ -207,6 +207,31 @@ impl<A: Array> SmallVec<A> {
207
207
}
208
208
}
209
209
210
+ /// Construct a new `SmallVec` from a `Vec<A::Item>` without copying
211
+ /// elements.
212
+ ///
213
+ /// ```rust
214
+ /// use smallvec::SmallVec;
215
+ ///
216
+ /// let vec = vec![1, 2, 3, 4, 5];
217
+ /// let small_vec: SmallVec<[_; 3]> = SmallVec::from_vec(vec);
218
+ ///
219
+ /// assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
220
+ /// ```
221
+ #[ inline]
222
+ pub fn from_vec ( mut vec : Vec < A :: Item > ) -> SmallVec < A > {
223
+ let ( ptr, cap, len) = ( vec. as_mut_ptr ( ) , vec. capacity ( ) , vec. len ( ) ) ;
224
+ mem:: forget ( vec) ;
225
+
226
+ SmallVec {
227
+ len : len,
228
+ data : SmallVecData :: Heap {
229
+ ptr : ptr,
230
+ capacity : cap
231
+ }
232
+ }
233
+ }
234
+
210
235
/// Sets the length of a vector.
211
236
///
212
237
/// This will explicitly set the size of the vector, without actually
@@ -1363,4 +1388,37 @@ pub mod tests {
1363
1388
let vec = SmallVec :: < [ u8 ; 2 ] > :: from_iter ( 0 ..3 ) ;
1364
1389
assert_eq ! ( vec. into_vec( ) , vec![ 0 , 1 , 2 ] ) ;
1365
1390
}
1391
+
1392
+ #[ test]
1393
+ fn test_from_vec ( ) {
1394
+ let vec = vec ! [ ] ;
1395
+ let small_vec: SmallVec < [ u8 ; 3 ] > = SmallVec :: from_vec ( vec) ;
1396
+ assert_eq ! ( & * small_vec, & [ ] ) ;
1397
+ drop ( small_vec) ;
1398
+
1399
+ let vec = vec ! [ ] ;
1400
+ let small_vec: SmallVec < [ u8 ; 1 ] > = SmallVec :: from_vec ( vec) ;
1401
+ assert_eq ! ( & * small_vec, & [ ] ) ;
1402
+ drop ( small_vec) ;
1403
+
1404
+ let vec = vec ! [ 1 ] ;
1405
+ let small_vec: SmallVec < [ u8 ; 3 ] > = SmallVec :: from_vec ( vec) ;
1406
+ assert_eq ! ( & * small_vec, & [ 1 ] ) ;
1407
+ drop ( small_vec) ;
1408
+
1409
+ let vec = vec ! [ 1 , 2 , 3 ] ;
1410
+ let small_vec: SmallVec < [ u8 ; 3 ] > = SmallVec :: from_vec ( vec) ;
1411
+ assert_eq ! ( & * small_vec, & [ 1 , 2 , 3 ] ) ;
1412
+ drop ( small_vec) ;
1413
+
1414
+ let vec = vec ! [ 1 , 2 , 3 , 4 , 5 ] ;
1415
+ let small_vec: SmallVec < [ u8 ; 3 ] > = SmallVec :: from_vec ( vec) ;
1416
+ assert_eq ! ( & * small_vec, & [ 1 , 2 , 3 , 4 , 5 ] ) ;
1417
+ drop ( small_vec) ;
1418
+
1419
+ let vec = vec ! [ 1 , 2 , 3 , 4 , 5 ] ;
1420
+ let small_vec: SmallVec < [ u8 ; 1 ] > = SmallVec :: from_vec ( vec) ;
1421
+ assert_eq ! ( & * small_vec, & [ 1 , 2 , 3 , 4 , 5 ] ) ;
1422
+ drop ( small_vec) ;
1423
+ }
1366
1424
}
0 commit comments