From 6ea2d1afcb89d3414312521a63a591d34ae5f8dd Mon Sep 17 00:00:00 2001 From: Wesley Norris Date: Thu, 23 Jan 2020 17:58:27 -0500 Subject: [PATCH] Add From<&[T]> and From<&mut [T]> for TinyVec This adds the From trait impls for `&[T]` and `&mut [T]` to `TinyVec`, though unfortunately until we get lazy normalization, it currently requires that the `A: Array` bound also be `Default`, so it does not work for array sizes > 32. --- src/tinyvec.rs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/tinyvec.rs b/src/tinyvec.rs index ab4e5e4..c28e3ad 100644 --- a/src/tinyvec.rs +++ b/src/tinyvec.rs @@ -665,6 +665,37 @@ impl From> for TinyVec { } } +impl From<&'_ [T]> for TinyVec +where + T: Clone + Default, + A: Array + Default, +{ + #[inline] + #[must_use] + fn from(slice: &[T]) -> Self { + if slice.len() > A::CAPACITY { + TinyVec::Heap(slice.into()) + } else { + let mut arr = ArrayVec::new(); + arr.extend_from_slice(slice); + + TinyVec::Inline(arr) + } + } +} + +impl From<&'_ mut [T]> for TinyVec +where + T: Clone + Default, + A: Array + Default, +{ + #[inline] + #[must_use] + fn from(slice: &mut [T]) -> Self { + Self::from(&*slice) + } +} + impl FromIterator for TinyVec { #[inline] #[must_use]