From 0ac71b4bf221805ac0f4f425266e229b868d76e4 Mon Sep 17 00:00:00 2001 From: a222red <73256177+a222red@users.noreply.github.com> Date: Tue, 11 Apr 2023 20:02:49 -0500 Subject: [PATCH] Add `From<[T; LEN]>` for `ArrayVec` --- src/arrayvec.rs | 52 ++++++++++++++++++++++--------------------------- tests/tests.rs | 23 +++++++++++----------- 2 files changed, 35 insertions(+), 40 deletions(-) diff --git a/src/arrayvec.rs b/src/arrayvec.rs index a21bbb3..f3c13d8 100644 --- a/src/arrayvec.rs +++ b/src/arrayvec.rs @@ -103,7 +103,7 @@ impl ArrayVec { /// ``` /// use arrayvec::ArrayVec; /// - /// let mut array = ArrayVec::from([1, 2, 3]); + /// let mut array = ArrayVec::<_, 3>::from([1, 2, 3]); /// array.pop(); /// assert_eq!(array.len(), 2); /// ``` @@ -115,7 +115,7 @@ impl ArrayVec { /// ``` /// use arrayvec::ArrayVec; /// - /// let mut array = ArrayVec::from([1]); + /// let mut array = ArrayVec::<_, 1>::from([1]); /// array.pop(); /// assert_eq!(array.is_empty(), true); /// ``` @@ -127,7 +127,7 @@ impl ArrayVec { /// ``` /// use arrayvec::ArrayVec; /// - /// let array = ArrayVec::from([1, 2, 3]); + /// let array = ArrayVec::<_, 3>::from([1, 2, 3]); /// assert_eq!(array.capacity(), 3); /// ``` #[inline(always)] @@ -150,7 +150,7 @@ impl ArrayVec { /// ``` /// use arrayvec::ArrayVec; /// - /// let mut array = ArrayVec::from([1, 2, 3]); + /// let mut array = ArrayVec::<_, 3>::from([1, 2, 3]); /// array.pop(); /// assert_eq!(array.remaining_capacity(), 1); /// ``` @@ -236,7 +236,7 @@ impl ArrayVec { /// ``` /// use arrayvec::ArrayVec; /// - /// let mut array = ArrayVec::from([1, 2, 3, 4, 5]); + /// let mut array = ArrayVec::<_, 5>::from([1, 2, 3, 4, 5]); /// array.truncate(3); /// assert_eq!(&array[..], &[1, 2, 3]); /// array.truncate(4); @@ -356,7 +356,7 @@ impl ArrayVec { /// ``` /// use arrayvec::ArrayVec; /// - /// let mut array = ArrayVec::from([1, 2, 3]); + /// let mut array = ArrayVec::<_, 3>::from([1, 2, 3]); /// /// assert_eq!(array.swap_remove(0), 1); /// assert_eq!(&array[..], &[3, 2]); @@ -381,7 +381,7 @@ impl ArrayVec { /// ``` /// use arrayvec::ArrayVec; /// - /// let mut array = ArrayVec::from([1, 2, 3]); + /// let mut array = ArrayVec::<_, 3>::from([1, 2, 3]); /// /// assert_eq!(array.swap_pop(0), Some(1)); /// assert_eq!(&array[..], &[3, 2]); @@ -406,7 +406,7 @@ impl ArrayVec { /// ``` /// use arrayvec::ArrayVec; /// - /// let mut array = ArrayVec::from([1, 2, 3]); + /// let mut array = ArrayVec::<_, 3>::from([1, 2, 3]); /// /// let removed_elt = array.remove(0); /// assert_eq!(removed_elt, 1); @@ -427,7 +427,7 @@ impl ArrayVec { /// ``` /// use arrayvec::ArrayVec; /// - /// let mut array = ArrayVec::from([1, 2, 3]); + /// let mut array = ArrayVec::<_, 3>::from([1, 2, 3]); /// /// assert!(array.pop_at(0).is_some()); /// assert_eq!(&array[..], &[2, 3]); @@ -452,7 +452,7 @@ impl ArrayVec { /// ``` /// use arrayvec::ArrayVec; /// - /// let mut array = ArrayVec::from([1, 2, 3, 4]); + /// let mut array = ArrayVec::<_, 4>::from([1, 2, 3, 4]); /// array.retain(|x| *x & 1 != 0 ); /// assert_eq!(&array[..], &[1, 3]); /// ``` @@ -592,7 +592,7 @@ impl ArrayVec { /// ``` /// use arrayvec::ArrayVec; /// - /// let mut v1 = ArrayVec::from([1, 2, 3]); + /// let mut v1 = ArrayVec::<_, 3>::from([1, 2, 3]); /// let v2: ArrayVec<_, 3> = v1.drain(0..2).collect(); /// assert_eq!(&v1[..], &[3]); /// assert_eq!(&v2[..], &[1, 2]); @@ -673,7 +673,7 @@ impl ArrayVec { /// ``` /// use arrayvec::ArrayVec; /// - /// let mut v = ArrayVec::from([0, 1, 2, 3]); + /// let mut v = ArrayVec::<_, 4>::from([0, 1, 2, 3]); /// assert_eq!([0, 1, 2, 3], v.take().into_inner().unwrap()); /// assert!(v.is_empty()); /// ``` @@ -737,25 +737,19 @@ impl DerefMut for ArrayVec { } } +impl From<[T; LEN]> for ArrayVec { + fn from(array: [T; LEN]) -> Self { + assert!(LEN <= CAP); -/// Create an `ArrayVec` from an array. -/// -/// ``` -/// use arrayvec::ArrayVec; -/// -/// let mut array = ArrayVec::from([1, 2, 3]); -/// assert_eq!(array.len(), 3); -/// assert_eq!(array.capacity(), 3); -/// ``` -impl From<[T; CAP]> for ArrayVec { - fn from(array: [T; CAP]) -> Self { let array = ManuallyDrop::new(array); let mut vec = >::new(); + unsafe { - (&*array as *const [T; CAP] as *const [MaybeUninit; CAP]) - .copy_to_nonoverlapping(&mut vec.xs as *mut [MaybeUninit; CAP], 1); - vec.set_len(CAP); + (&*array as *const [T; LEN] as *const MaybeUninit) + .copy_to_nonoverlapping(&mut vec.xs as *mut MaybeUninit, LEN); + vec.set_len(LEN); } + vec } } @@ -794,7 +788,7 @@ impl std::convert::TryFrom<&[T]> for ArrayVec /// ``` /// use arrayvec::ArrayVec; /// -/// let array = ArrayVec::from([1, 2, 3]); +/// let array = ArrayVec::<_, 3>::from([1, 2, 3]); /// /// for elt in &array { /// // ... @@ -811,7 +805,7 @@ impl<'a, T: 'a, const CAP: usize> IntoIterator for &'a ArrayVec { /// ``` /// use arrayvec::ArrayVec; /// -/// let mut array = ArrayVec::from([1, 2, 3]); +/// let mut array = ArrayVec::<_, 3>::from([1, 2, 3]); /// /// for elt in &mut array { /// // ... @@ -830,7 +824,7 @@ impl<'a, T: 'a, const CAP: usize> IntoIterator for &'a mut ArrayVec { /// ``` /// use arrayvec::ArrayVec; /// -/// for elt in ArrayVec::from([1, 2, 3]) { +/// for elt in ArrayVec::<_, 3>::from([1, 2, 3]) { /// // ... /// } /// ``` diff --git a/tests/tests.rs b/tests/tests.rs index 2f8a5ef..522c4ba 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -13,7 +13,7 @@ use std::collections::HashMap; fn test_simple() { use std::ops::Add; - let mut vec: ArrayVec, 3> = ArrayVec::new(); + let mut vec: ArrayVec, 3> = ArrayVec::new(); vec.push(vec![1, 2, 3, 4]); vec.push(vec![10]); @@ -87,7 +87,7 @@ fn test_u16_index() { #[test] fn test_iter() { - let mut iter = ArrayVec::from([1, 2, 3]).into_iter(); + let mut iter = ArrayVec::<_, 3>::from([1, 2, 3]).into_iter(); assert_eq!(iter.size_hint(), (3, Some(3))); assert_eq!(iter.next_back(), Some(3)); assert_eq!(iter.next(), Some(1)); @@ -333,7 +333,7 @@ fn test_still_works_with_option_arrayvec() { #[test] fn test_drain() { - let mut v = ArrayVec::from([0; 8]); + let mut v = ArrayVec::<_, 8>::from([0; 8]); v.pop(); v.drain(0..7); assert_eq!(&v[..], &[]); @@ -350,7 +350,7 @@ fn test_drain() { #[test] fn test_drain_range_inclusive() { - let mut v = ArrayVec::from([0; 8]); + let mut v = ArrayVec::<_, 8>::from([0; 8]); v.drain(0..=7); assert_eq!(&v[..], &[]); @@ -367,13 +367,13 @@ fn test_drain_range_inclusive() { #[test] #[should_panic] fn test_drain_range_inclusive_oob() { - let mut v = ArrayVec::from([0; 0]); + let mut v = ArrayVec::<_, 0>::from([0; 0]); v.drain(0..=0); } #[test] fn test_retain() { - let mut v = ArrayVec::from([0; 8]); + let mut v = ArrayVec::<_, 8>::from([0; 8]); for (i, elt) in v.iter_mut().enumerate() { *elt = i; } @@ -391,7 +391,7 @@ fn test_retain() { #[test] #[should_panic] fn test_drain_oob() { - let mut v = ArrayVec::from([0; 8]); + let mut v = ArrayVec::<_, 8>::from([0; 8]); v.pop(); v.drain(0..8); } @@ -429,7 +429,7 @@ fn test_drop_panic_into_iter() { #[test] fn test_insert() { - let mut v = ArrayVec::from([]); + let mut v = ArrayVec::<_, 0>::from([]); assert_matches!(v.try_push(1), Err(_)); let mut v = ArrayVec::<_, 3>::new(); @@ -445,7 +445,7 @@ fn test_insert() { assert_eq!(&v[..], &[0, 1, 2]); assert_matches!(ret2, Err(_)); - let mut v = ArrayVec::from([2]); + let mut v = ArrayVec::<_, 1>::from([2]); assert_matches!(v.try_insert(0, 1), Err(CapacityError { .. })); assert_matches!(v.try_insert(1, 1), Err(CapacityError { .. })); //assert_matches!(v.try_insert(2, 1), Err(CapacityError { .. })); @@ -453,7 +453,7 @@ fn test_insert() { #[test] fn test_into_inner_1() { - let mut v = ArrayVec::from([1, 2]); + let mut v = ArrayVec::<_, 2>::from([1, 2]); v.pop(); let u = v.clone(); assert_eq!(v.into_inner(), Err(u)); @@ -681,7 +681,8 @@ fn test_pop_at() { #[test] fn test_sizes() { - let v = ArrayVec::from([0u8; 1 << 16]); + const LEN: usize = 1 << 16; + let v = ArrayVec::<_, LEN>::from([0u8; LEN]); assert_eq!(vec![0u8; v.len()], &v[..]); }