diff options
Diffstat (limited to 'third_party/rust/packed_simd/src/api/into_bits.rs')
-rw-r--r-- | third_party/rust/packed_simd/src/api/into_bits.rs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/third_party/rust/packed_simd/src/api/into_bits.rs b/third_party/rust/packed_simd/src/api/into_bits.rs new file mode 100644 index 0000000000..03fbe4bff7 --- /dev/null +++ b/third_party/rust/packed_simd/src/api/into_bits.rs @@ -0,0 +1,59 @@ +//! Implementation of `FromBits` and `IntoBits`. + +/// Safe lossless bitwise conversion from `T` to `Self`. +#[cfg_attr(doc_cfg, doc(cfg(feature = "into_bits")))] +pub trait FromBits<T>: crate::marker::Sized { + /// Safe lossless bitwise transmute from `T` to `Self`. + fn from_bits(t: T) -> Self; +} + +/// Safe lossless bitwise conversion from `Self` to `T`. +#[cfg_attr(doc_cfg, doc(cfg(feature = "into_bits")))] +pub trait IntoBits<T>: crate::marker::Sized { + /// Safe lossless bitwise transmute from `self` to `T`. + fn into_bits(self) -> T; +} + +/// `FromBits` implies `IntoBits`. +impl<T, U> IntoBits<U> for T +where + U: FromBits<T>, +{ + #[inline] + fn into_bits(self) -> U { + debug_assert!(crate::mem::size_of::<Self>() == crate::mem::size_of::<U>()); + U::from_bits(self) + } +} + +/// `FromBits` and `IntoBits` are reflexive +impl<T> FromBits<T> for T { + #[inline] + fn from_bits(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::*; + +mod arch_specific; +pub use self::arch_specific::*; |