Merge pull request #159 from paulkernfeld/try-from-slice

Implement TryFrom<Slice> for ArrayVec
This commit is contained in:
bluss
2020-05-12 21:11:13 +02:00
committed by GitHub
2 changed files with 38 additions and 0 deletions
+29
View File
@@ -708,6 +708,35 @@ impl<A: Array> From<A> for ArrayVec<A> {
}
/// Try to create an `ArrayVec` from a slice. This will return an error if the slice was too big to
/// fit.
///
/// ```
/// use arrayvec::ArrayVec;
/// use std::convert::TryInto as _;
///
/// let array: ArrayVec<[_; 4]> = (&[1, 2, 3] as &[_]).try_into().unwrap();
/// assert_eq!(array.len(), 3);
/// assert_eq!(array.capacity(), 4);
/// ```
impl<A: Array> std::convert::TryFrom<&[A::Item]> for ArrayVec<A>
where
A::Item: Clone,
{
type Error = CapacityError;
fn try_from(slice: &[A::Item]) -> Result<Self, Self::Error> {
if A::CAPACITY < slice.len() {
Err(CapacityError::new(()))
} else {
let mut array = Self::new();
array.extend(slice.iter().cloned());
Ok(array)
}
}
}
/// Iterate the `ArrayVec` with references to each element.
///
/// ```
+9
View File
@@ -65,6 +65,15 @@ fn test_extend_from_slice_error() {
assert_matches!(res, Err(_));
}
#[test]
fn test_try_from_slice_error() {
use arrayvec::ArrayVec;
use std::convert::TryInto as _;
let res: Result<ArrayVec<[_; 2]>, _> = (&[1, 2, 3] as &[_]).try_into();
assert_matches!(res, Err(_));
}
#[test]
fn test_u16_index() {
const N: usize = 4096;