Skip to content

Commit

Permalink
Add float conversions to and from bytes
Browse files Browse the repository at this point in the history
Use the same API as for integers.

Fixes #57492.
  • Loading branch information
tbu- authored and tesuji committed Jul 8, 2019
1 parent db592f4 commit ad47f08
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 0 deletions.
70 changes: 70 additions & 0 deletions src/libcore/num/f32.rs
Expand Up @@ -461,4 +461,74 @@ impl f32 {
// It turns out the safety issues with sNaN were overblown! Hooray!
unsafe { mem::transmute(v) }
}

/// Return the floating point value as a byte array in big-endian byte order.
///
/// # Examples
///
/// ```
/// assert_eq!(0.0f32.to_be_bytes(), [0b0000_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000]);
/// assert_eq!(1.0f32.to_be_bytes(), [0b0111_1111, 0b1000_0000, 0b0000_0000, 0b0000_0000]);
/// ```
#[unstable(feature = "float_to_from_bytes", issue = "60446")]
#[inline]
pub fn to_be_bytes(self) -> [u8; 4] {
self.to_bits().to_be_bytes()
}

/// Return the floating point value as a byte array in little-endian byte order.
///
/// # Examples
///
/// ```
/// assert_eq!(0.0f32.to_le_bytes(), [0b0000_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000]);
/// assert_eq!(1.0f32.to_le_bytes(), [0b0000_0000, 0b0000_0000, 0b1000_0000, 0b0111_1111]);
/// ```
#[unstable(feature = "float_to_from_bytes", issue = "60446")]
#[inline]
pub fn to_le_bytes(self) -> [u8; 4] {
self.to_bits().to_le_bytes()
}

/// Return the floating point value 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.
///
/// # Examples
///
/// ```
/// assert_eq!(
/// u32::from_ne_bytes(0.0f32.to_ne_bytes()),
/// 0b0000_0000_0000_0000_0000_0000_0000_0000,
/// );
/// assert_eq!(
/// u32::from_ne_bytes(1.0f32.to_ne_bytes()),
/// 0b0111_1111_1000_0000_0000_0000_0000_0000,
/// );
/// ```
#[unstable(feature = "float_to_from_bytes", issue = "60446")]
#[inline]
pub fn to_ne_bytes(self) -> [u8; 4] {
self.to_bits().to_ne_bytes()
}

#[unstable(feature = "float_to_from_bytes", issue = "60446")]
#[inline]
pub fn from_be_bytes(bytes: [u8; 4]) -> Self {
Self::from_bits(u32::from_be_bytes(bytes))
}

#[unstable(feature = "float_to_from_bytes", issue = "60446")]
#[inline]
pub fn from_le_bytes(bytes: [u8; 4]) -> Self {
Self::from_bits(u32::from_le_bytes(bytes))
}

#[unstable(feature = "float_to_from_bytes", issue = "60446")]
#[inline]
pub fn from_ne_bytes(bytes: [u8; 4]) -> Self {
Self::from_bits(u32::from_ne_bytes(bytes))
}
}
36 changes: 36 additions & 0 deletions src/libcore/num/f64.rs
Expand Up @@ -474,4 +474,40 @@ impl f64 {
// It turns out the safety issues with sNaN were overblown! Hooray!
unsafe { mem::transmute(v) }
}

#[unstable(feature = "float_to_from_bytes", issue = "60446")]
#[inline]
pub fn to_be_bytes(self) -> [u8; 8] {
self.to_bits().to_be_bytes()
}

#[unstable(feature = "float_to_from_bytes", issue = "60446")]
#[inline]
pub fn to_le_bytes(self) -> [u8; 8] {
self.to_bits().to_le_bytes()
}

#[unstable(feature = "float_to_from_bytes", issue = "60446")]
#[inline]
pub fn to_ne_bytes(self) -> [u8; 8] {
self.to_bits().to_ne_bytes()
}

#[unstable(feature = "float_to_from_bytes", issue = "60446")]
#[inline]
pub fn from_be_bytes(bytes: [u8; 8]) -> Self {
Self::from_bits(u64::from_be_bytes(bytes))
}

#[unstable(feature = "float_to_from_bytes", issue = "60446")]
#[inline]
pub fn from_le_bytes(bytes: [u8; 8]) -> Self {
Self::from_bits(u64::from_le_bytes(bytes))
}

#[unstable(feature = "float_to_from_bytes", issue = "60446")]
#[inline]
pub fn from_ne_bytes(bytes: [u8; 8]) -> Self {
Self::from_bits(u64::from_ne_bytes(bytes))
}
}

0 comments on commit ad47f08

Please sign in to comment.