1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
//! Implementation of `FromCast` and `IntoCast`. #![allow(clippy::module_name_repetitions)] /// Numeric cast from `T` to `Self`. /// /// > Note: This is a temporary workaround until the conversion traits /// specified > in [RFC2484] are implemented. /// /// Numeric cast between vectors with the same number of lanes, such that: /// /// * casting integer vectors whose lane types have the same size (e.g. `i32xN` /// -> `u32xN`) is a **no-op**, /// /// * casting from a larger integer to a smaller integer (e.g. `u32xN` -> /// `u8xN`) will **truncate**, /// /// * casting from a smaller integer to a larger integer (e.g. `u8xN` -> /// `u32xN`) will: /// * **zero-extend** if the source is unsigned, or /// * **sign-extend** if the source is signed, /// /// * casting from a float to an integer will **round the float towards zero**, /// /// * casting from an integer to float will produce the floating point /// representation of the integer, **rounding to nearest, ties to even**, /// /// * casting from an `f32` to an `f64` is perfect and lossless, /// /// * casting from an `f64` to an `f32` **rounds to nearest, ties to even**. /// /// [RFC2484]: https://github.com/rust-lang/rfcs/pull/2484 pub trait FromCast<T>: crate::marker::Sized { /// Numeric cast from `T` to `Self`. fn from_cast(_: T) -> Self; } /// Numeric cast from `Self` to `T`. /// /// > Note: This is a temporary workaround until the conversion traits /// specified > in [RFC2484] are implemented. /// /// Numeric cast between vectors with the same number of lanes, such that: /// /// * casting integer vectors whose lane types have the same size (e.g. `i32xN` /// -> `u32xN`) is a **no-op**, /// /// * casting from a larger integer to a smaller integer (e.g. `u32xN` -> /// `u8xN`) will **truncate**, /// /// * casting from a smaller integer to a larger integer (e.g. `u8xN` -> /// `u32xN`) will: /// * **zero-extend** if the source is unsigned, or /// * **sign-extend** if the source is signed, /// /// * casting from a float to an integer will **round the float towards zero**, /// /// * casting from an integer to float will produce the floating point /// representation of the integer, **rounding to nearest, ties to even**, /// /// * casting from an `f32` to an `f64` is perfect and lossless, /// /// * casting from an `f64` to an `f32` **rounds to nearest, ties to even**. /// /// [RFC2484]: https://github.com/rust-lang/rfcs/pull/2484 pub trait Cast<T>: crate::marker::Sized { /// Numeric cast from `self` to `T`. fn cast(self) -> T; } /// `FromCast` implies `Cast`. impl<T, U> Cast<U> for T where U: FromCast<T>, { #[inline] fn cast(self) -> U { U::from_cast(self) } } /// `FromCast` and `Cast` are reflexive impl<T> FromCast<T> for T { #[inline] fn from_cast(t: Self) -> Self { t } } #[macro_use] mod macros; mod v16; pub use self::v16::*; mod v32; pub use self::v32::*; mod v64; pub use self::v64::*; mod v128; pub use self::v128::*; mod v256; pub use self::v256::*; mod v512; pub use self::v512::*;