diff --git a/src/lib.rs b/src/lib.rs index cadb5d8..e9bf8e0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2016,10 +2016,18 @@ impl From> for SmallVec { } } -impl From for SmallVec { +impl> From for SmallVec { #[inline] - fn from(array: A) -> SmallVec { - SmallVec::from_buf(array) + fn from(array: A2) -> SmallVec { + let m = A2::size(); + let mut this = Self::with_capacity(m); + let array = mem::ManuallyDrop::new(array); + // SAFETY: m <= this.capacity() + unsafe { + ptr::copy_nonoverlapping(&*array as *const A2 as *const A2::Item, this.as_mut_ptr(), m); + this.set_len(m); + } + this } } diff --git a/src/tests.rs b/src/tests.rs index 3eab846..fe3f6e6 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -623,6 +623,16 @@ fn test_from() { let small_vec: SmallVec<[u8; 128]> = SmallVec::from(array); assert_eq!(&*small_vec, vec![99u8; 128].as_slice()); drop(small_vec); + + let array = [1; 128]; + let small_vec: SmallVec<[u8; 1]> = SmallVec::from(array); + assert_eq!(&*small_vec, vec![1; 128].as_slice()); + drop(small_vec); + + let array = [99]; + let small_vec: SmallVec<[u8; 128]> = SmallVec::from(array); + assert_eq!(&*small_vec, &[99u8]); + drop(small_vec); } #[test]