// rustfmt-wrap_comments: true //! Implements `From` and `Into` for vector types. macro_rules! impl_from_vector { ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt | $source:ident) => { impl From<$source> for $id { #[inline] fn from(source: $source) -> Self { fn static_assert_same_number_of_lanes() where T: crate::sealed::Simd, U: crate::sealed::Simd, { } use llvm::simd_cast; static_assert_same_number_of_lanes::<$id, $source>(); Simd(unsafe { simd_cast(source.0) }) } } // FIXME: `Into::into` is not inline, but due to // the blanket impl in `std`, which is not // marked `default`, we cannot override it here with // specialization. /* impl Into<$id> for $source { #[inline] fn into(self) -> $id { unsafe { simd_cast(self) } } } */ test_if!{ $test_tt: interpolate_idents! { mod [$id _from_ $source] { use super::*; #[test] fn from() { assert_eq!($id::lanes(), $source::lanes()); let source: $source = Default::default(); let vec: $id = Default::default(); let e = $id::from(source); assert_eq!(e, vec); let e: $id = source.into(); assert_eq!(e, vec); } } } } }; } macro_rules! impl_from_vectors { ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt | $($source:ident),*) => { $( impl_from_vector!([$elem_ty; $elem_count]: $id | $test_tt | $source); )* } }