| // 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<T, U>() |
| where |
| T: crate::sealed::Simd, |
| U: crate::sealed::Simd<LanesType = T::LanesType>, |
| { |
| } |
| 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); |
| )* |
| } |
| } |