diff options
Diffstat (limited to 'vendor/num-traits/src/ops/bytes.rs')
-rw-r--r-- | vendor/num-traits/src/ops/bytes.rs | 403 |
1 files changed, 0 insertions, 403 deletions
diff --git a/vendor/num-traits/src/ops/bytes.rs b/vendor/num-traits/src/ops/bytes.rs deleted file mode 100644 index 4df9ecd..0000000 --- a/vendor/num-traits/src/ops/bytes.rs +++ /dev/null @@ -1,403 +0,0 @@ -use core::borrow::{Borrow, BorrowMut}; -use core::cmp::{Eq, Ord, PartialEq, PartialOrd}; -use core::fmt::Debug; -use core::hash::Hash; -#[cfg(not(has_int_to_from_bytes))] -use core::mem::transmute; - -pub trait NumBytes: - Debug - + AsRef<[u8]> - + AsMut<[u8]> - + PartialEq - + Eq - + PartialOrd - + Ord - + Hash - + Borrow<[u8]> - + BorrowMut<[u8]> -{ -} - -impl<T> NumBytes for T where - T: Debug - + AsRef<[u8]> - + AsMut<[u8]> - + PartialEq - + Eq - + PartialOrd - + Ord - + Hash - + Borrow<[u8]> - + BorrowMut<[u8]> - + ?Sized -{ -} - -pub trait ToBytes { - type Bytes: NumBytes; - - /// Return the memory representation of this number as a byte array in big-endian byte order. - /// - /// # Examples - /// - /// ``` - /// use num_traits::ToBytes; - /// - /// let bytes = ToBytes::to_be_bytes(&0x12345678u32); - /// assert_eq!(bytes, [0x12, 0x34, 0x56, 0x78]); - /// ``` - fn to_be_bytes(&self) -> Self::Bytes; - - /// Return the memory representation of this number as a byte array in little-endian byte order. - /// - /// # Examples - /// - /// ``` - /// use num_traits::ToBytes; - /// - /// let bytes = ToBytes::to_le_bytes(&0x12345678u32); - /// assert_eq!(bytes, [0x78, 0x56, 0x34, 0x12]); - /// ``` - fn to_le_bytes(&self) -> Self::Bytes; - - /// Return the memory representation of this number as a byte array in native byte order. - /// - /// As the target platform's native endianness is used, - /// portable code should use [`to_be_bytes`] or [`to_le_bytes`], as appropriate, instead. - /// - /// [`to_be_bytes`]: #method.to_be_bytes - /// [`to_le_bytes`]: #method.to_le_bytes - /// - /// # Examples - /// - /// ``` - /// use num_traits::ToBytes; - /// - /// #[cfg(target_endian = "big")] - /// let expected = [0x12, 0x34, 0x56, 0x78]; - /// - /// #[cfg(target_endian = "little")] - /// let expected = [0x78, 0x56, 0x34, 0x12]; - /// - /// let bytes = ToBytes::to_ne_bytes(&0x12345678u32); - /// assert_eq!(bytes, expected) - /// ``` - fn to_ne_bytes(&self) -> Self::Bytes { - #[cfg(target_endian = "big")] - let bytes = self.to_be_bytes(); - #[cfg(target_endian = "little")] - let bytes = self.to_le_bytes(); - bytes - } -} - -pub trait FromBytes: Sized { - type Bytes: NumBytes + ?Sized; - - /// Create a number from its representation as a byte array in big endian. - /// - /// # Examples - /// - /// ``` - /// use num_traits::FromBytes; - /// - /// let value: u32 = FromBytes::from_be_bytes(&[0x12, 0x34, 0x56, 0x78]); - /// assert_eq!(value, 0x12345678); - /// ``` - fn from_be_bytes(bytes: &Self::Bytes) -> Self; - - /// Create a number from its representation as a byte array in little endian. - /// - /// # Examples - /// - /// ``` - /// use num_traits::FromBytes; - /// - /// let value: u32 = FromBytes::from_le_bytes(&[0x78, 0x56, 0x34, 0x12]); - /// assert_eq!(value, 0x12345678); - /// ``` - fn from_le_bytes(bytes: &Self::Bytes) -> Self; - - /// Create a number from its memory representation as a byte array in native endianness. - /// - /// As the target platform's native endianness is used, - /// portable code likely wants to use [`from_be_bytes`] or [`from_le_bytes`], as appropriate instead. - /// - /// [`from_be_bytes`]: #method.from_be_bytes - /// [`from_le_bytes`]: #method.from_le_bytes - /// - /// # Examples - /// - /// ``` - /// use num_traits::FromBytes; - /// - /// #[cfg(target_endian = "big")] - /// let bytes = [0x12, 0x34, 0x56, 0x78]; - /// - /// #[cfg(target_endian = "little")] - /// let bytes = [0x78, 0x56, 0x34, 0x12]; - /// - /// let value: u32 = FromBytes::from_ne_bytes(&bytes); - /// assert_eq!(value, 0x12345678) - /// ``` - fn from_ne_bytes(bytes: &Self::Bytes) -> Self { - #[cfg(target_endian = "big")] - let this = Self::from_be_bytes(bytes); - #[cfg(target_endian = "little")] - let this = Self::from_le_bytes(bytes); - this - } -} - -macro_rules! float_to_from_bytes_impl { - ($T:ty, $L:expr) => { - #[cfg(has_float_to_from_bytes)] - impl ToBytes for $T { - type Bytes = [u8; $L]; - - #[inline] - fn to_be_bytes(&self) -> Self::Bytes { - <$T>::to_be_bytes(*self) - } - - #[inline] - fn to_le_bytes(&self) -> Self::Bytes { - <$T>::to_le_bytes(*self) - } - - #[inline] - fn to_ne_bytes(&self) -> Self::Bytes { - <$T>::to_ne_bytes(*self) - } - } - - #[cfg(has_float_to_from_bytes)] - impl FromBytes for $T { - type Bytes = [u8; $L]; - - #[inline] - fn from_be_bytes(bytes: &Self::Bytes) -> Self { - <$T>::from_be_bytes(*bytes) - } - - #[inline] - fn from_le_bytes(bytes: &Self::Bytes) -> Self { - <$T>::from_le_bytes(*bytes) - } - - #[inline] - fn from_ne_bytes(bytes: &Self::Bytes) -> Self { - <$T>::from_ne_bytes(*bytes) - } - } - - #[cfg(not(has_float_to_from_bytes))] - impl ToBytes for $T { - type Bytes = [u8; $L]; - - #[inline] - fn to_be_bytes(&self) -> Self::Bytes { - ToBytes::to_be_bytes(&self.to_bits()) - } - - #[inline] - fn to_le_bytes(&self) -> Self::Bytes { - ToBytes::to_le_bytes(&self.to_bits()) - } - - #[inline] - fn to_ne_bytes(&self) -> Self::Bytes { - ToBytes::to_ne_bytes(&self.to_bits()) - } - } - - #[cfg(not(has_float_to_from_bytes))] - impl FromBytes for $T { - type Bytes = [u8; $L]; - - #[inline] - fn from_be_bytes(bytes: &Self::Bytes) -> Self { - Self::from_bits(FromBytes::from_be_bytes(bytes)) - } - - #[inline] - fn from_le_bytes(bytes: &Self::Bytes) -> Self { - Self::from_bits(FromBytes::from_le_bytes(bytes)) - } - - #[inline] - fn from_ne_bytes(bytes: &Self::Bytes) -> Self { - Self::from_bits(FromBytes::from_ne_bytes(bytes)) - } - } - }; -} - -macro_rules! int_to_from_bytes_impl { - ($T:ty, $L:expr) => { - #[cfg(has_int_to_from_bytes)] - impl ToBytes for $T { - type Bytes = [u8; $L]; - - #[inline] - fn to_be_bytes(&self) -> Self::Bytes { - <$T>::to_be_bytes(*self) - } - - #[inline] - fn to_le_bytes(&self) -> Self::Bytes { - <$T>::to_le_bytes(*self) - } - - #[inline] - fn to_ne_bytes(&self) -> Self::Bytes { - <$T>::to_ne_bytes(*self) - } - } - - #[cfg(has_int_to_from_bytes)] - impl FromBytes for $T { - type Bytes = [u8; $L]; - - #[inline] - fn from_be_bytes(bytes: &Self::Bytes) -> Self { - <$T>::from_be_bytes(*bytes) - } - - #[inline] - fn from_le_bytes(bytes: &Self::Bytes) -> Self { - <$T>::from_le_bytes(*bytes) - } - - #[inline] - fn from_ne_bytes(bytes: &Self::Bytes) -> Self { - <$T>::from_ne_bytes(*bytes) - } - } - - #[cfg(not(has_int_to_from_bytes))] - impl ToBytes for $T { - type Bytes = [u8; $L]; - - #[inline] - fn to_be_bytes(&self) -> Self::Bytes { - <$T as ToBytes>::to_ne_bytes(&<$T>::to_be(*self)) - } - - #[inline] - fn to_le_bytes(&self) -> Self::Bytes { - <$T as ToBytes>::to_ne_bytes(&<$T>::to_le(*self)) - } - - #[inline] - fn to_ne_bytes(&self) -> Self::Bytes { - unsafe { transmute(*self) } - } - } - - #[cfg(not(has_int_to_from_bytes))] - impl FromBytes for $T { - type Bytes = [u8; $L]; - - #[inline] - fn from_be_bytes(bytes: &Self::Bytes) -> Self { - Self::from_be(<Self as FromBytes>::from_ne_bytes(bytes)) - } - - #[inline] - fn from_le_bytes(bytes: &Self::Bytes) -> Self { - Self::from_le(<Self as FromBytes>::from_ne_bytes(bytes)) - } - - #[inline] - fn from_ne_bytes(bytes: &Self::Bytes) -> Self { - unsafe { transmute(*bytes) } - } - } - }; -} - -int_to_from_bytes_impl!(u8, 1); -int_to_from_bytes_impl!(u16, 2); -int_to_from_bytes_impl!(u32, 4); -int_to_from_bytes_impl!(u64, 8); -int_to_from_bytes_impl!(u128, 16); -#[cfg(target_pointer_width = "64")] -int_to_from_bytes_impl!(usize, 8); -#[cfg(target_pointer_width = "32")] -int_to_from_bytes_impl!(usize, 4); - -int_to_from_bytes_impl!(i8, 1); -int_to_from_bytes_impl!(i16, 2); -int_to_from_bytes_impl!(i32, 4); -int_to_from_bytes_impl!(i64, 8); -int_to_from_bytes_impl!(i128, 16); -#[cfg(target_pointer_width = "64")] -int_to_from_bytes_impl!(isize, 8); -#[cfg(target_pointer_width = "32")] -int_to_from_bytes_impl!(isize, 4); - -float_to_from_bytes_impl!(f32, 4); -float_to_from_bytes_impl!(f64, 8); - -#[cfg(test)] -mod tests { - use super::*; - - macro_rules! check_to_from_bytes { - ($( $ty:ty )+) => {$({ - let n = 1; - let be = <$ty as ToBytes>::to_be_bytes(&n); - let le = <$ty as ToBytes>::to_le_bytes(&n); - let ne = <$ty as ToBytes>::to_ne_bytes(&n); - - assert_eq!(*be.last().unwrap(), 1); - assert_eq!(*le.first().unwrap(), 1); - if cfg!(target_endian = "big") { - assert_eq!(*ne.last().unwrap(), 1); - } else { - assert_eq!(*ne.first().unwrap(), 1); - } - - assert_eq!(<$ty as FromBytes>::from_be_bytes(&be), n); - assert_eq!(<$ty as FromBytes>::from_le_bytes(&le), n); - if cfg!(target_endian = "big") { - assert_eq!(<$ty as FromBytes>::from_ne_bytes(&be), n); - } else { - assert_eq!(<$ty as FromBytes>::from_ne_bytes(&le), n); - } - })+} - } - - #[test] - fn convert_between_int_and_bytes() { - check_to_from_bytes!(u8 u16 u32 u64 u128 usize); - check_to_from_bytes!(i8 i16 i32 i64 i128 isize); - } - - #[test] - fn convert_between_float_and_bytes() { - macro_rules! check_to_from_bytes { - ($( $ty:ty )+) => {$( - let n: $ty = 3.14; - - let be = <$ty as ToBytes>::to_be_bytes(&n); - let le = <$ty as ToBytes>::to_le_bytes(&n); - let ne = <$ty as ToBytes>::to_ne_bytes(&n); - - assert_eq!(<$ty as FromBytes>::from_be_bytes(&be), n); - assert_eq!(<$ty as FromBytes>::from_le_bytes(&le), n); - if cfg!(target_endian = "big") { - assert_eq!(ne, be); - assert_eq!(<$ty as FromBytes>::from_ne_bytes(&be), n); - } else { - assert_eq!(ne, le); - assert_eq!(<$ty as FromBytes>::from_ne_bytes(&le), n); - } - )+} - } - - check_to_from_bytes!(f32 f64); - } -} |