diff options
| author | Corey Farwell <coreyf@rwell.org> | 2018-08-17 08:23:40 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-08-17 08:23:40 -0700 |
| commit | f0764433f7551afe4ba29c409abad48e121ab69f (patch) | |
| tree | bed8b8c4747d9808235edc60be62b938b43aeaf6 | |
| parent | 18122e0db06cb0411d994fe24e4dbbf3b8d35180 (diff) | |
| parent | f5556a6a28683e3dd0f039948964a5361a70a498 (diff) | |
| download | rust-f0764433f7551afe4ba29c409abad48e121ab69f.tar.gz rust-f0764433f7551afe4ba29c409abad48e121ab69f.zip | |
Rollup merge of #53358 - SimonSapin:int-bytes, r=shepmaster
`{to,from}_{ne,le,be}_bytes` for unsigned integer types
Same as https://github.com/rust-lang/rust/pull/51919 did for signed integers.
Tracking issue: https://github.com/rust-lang/rust/issues/52963
| -rw-r--r-- | src/libcore/num/mod.rs | 108 |
1 files changed, 90 insertions, 18 deletions
diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index eb63966354b..37856dc5469 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -1891,7 +1891,7 @@ $EndFeature, " /// ``` /// #![feature(int_to_from_bytes)] /// - /// let bytes = 0x12345678i32.to_be_bytes(); + /// let bytes = 0x12_34_56_78_i32.to_be_bytes(); /// assert_eq!(bytes, [0x12, 0x34, 0x56, 0x78]); /// ``` #[unstable(feature = "int_to_from_bytes", issue = "52963")] @@ -1908,7 +1908,7 @@ $EndFeature, " /// ``` /// #![feature(int_to_from_bytes)] /// - /// let bytes = 0x12345678i32.to_le_bytes(); + /// let bytes = 0x12_34_56_78_i32.to_le_bytes(); /// assert_eq!(bytes, [0x78, 0x56, 0x34, 0x12]); /// ``` #[unstable(feature = "int_to_from_bytes", issue = "52963")] @@ -3568,47 +3568,119 @@ $EndFeature, " } } - /// Return the memory representation of this integer as a byte array. + /// Return the memory representation of this integer as a byte array in + /// big-endian (network) byte order. + /// + /// # Examples /// - /// The target platform’s native endianness is used. - /// Portable code likely wants to use this after [`to_be`] or [`to_le`]. + /// ``` + /// #![feature(int_to_from_bytes)] /// - /// [`to_be`]: #method.to_be - /// [`to_le`]: #method.to_le + /// let bytes = 0x12_34_56_78_i32.to_be_bytes(); + /// assert_eq!(bytes, [0x12, 0x34, 0x56, 0x78]); + /// ``` + #[unstable(feature = "int_to_from_bytes", issue = "52963")] + #[inline] + pub fn to_be_bytes(self) -> [u8; mem::size_of::<Self>()] { + self.to_be().to_ne_bytes() + } + + /// Return the memory representation of this integer as a byte array in + /// little-endian byte order. /// /// # Examples /// /// ``` /// #![feature(int_to_from_bytes)] /// - /// let bytes = 0x1234_5678_u32.to_be().to_bytes(); - /// assert_eq!(bytes, [0x12, 0x34, 0x56, 0x78]); + /// let bytes = 0x12_34_56_78_i32.to_le_bytes(); + /// assert_eq!(bytes, [0x78, 0x56, 0x34, 0x12]); + /// ``` + #[unstable(feature = "int_to_from_bytes", issue = "52963")] + #[inline] + pub fn to_le_bytes(self) -> [u8; mem::size_of::<Self>()] { + self.to_le().to_ne_bytes() + } + + /// Return the memory representation of this integer 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 + /// + /// ``` + /// #![feature(int_to_from_bytes)] + /// + /// let bytes = i32::min_value().to_be().to_ne_bytes(); + /// assert_eq!(bytes, [0x80, 0, 0, 0]); /// ``` #[unstable(feature = "int_to_from_bytes", issue = "52963")] #[inline] - pub fn to_bytes(self) -> [u8; mem::size_of::<Self>()] { + pub fn to_ne_bytes(self) -> [u8; mem::size_of::<Self>()] { unsafe { mem::transmute(self) } } - /// Create an integer value from its memory representation as a byte array. + /// Create an integer value from its representation as a byte array in + /// big endian. + /// + /// # Examples /// - /// The target platform’s native endianness is used. - /// Portable code likely wants to use [`to_be`] or [`to_le`] after this. + /// ``` + /// #![feature(int_to_from_bytes)] /// - /// [`to_be`]: #method.to_be - /// [`to_le`]: #method.to_le + /// let int = i32::from_be_bytes([0x12, 0x34, 0x56, 0x78]); + /// assert_eq!(int, 0x12_34_56_78); + /// ``` + #[unstable(feature = "int_to_from_bytes", issue = "52963")] + #[inline] + pub fn from_be_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self { + Self::from_be(Self::from_ne_bytes(bytes)) + } + + /// Create an integer value from its representation as a byte array in + /// little endian. /// /// # Examples /// /// ``` /// #![feature(int_to_from_bytes)] /// - /// let int = u32::from_be(u32::from_bytes([0x12, 0x34, 0x56, 0x78])); - /// assert_eq!(int, 0x1234_5678_u32); + /// let int = i32::from_le_bytes([0x12, 0x34, 0x56, 0x78]); + /// assert_eq!(int, 0x78_56_34_12); /// ``` #[unstable(feature = "int_to_from_bytes", issue = "52963")] #[inline] - pub fn from_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self { + pub fn from_le_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self { + Self::from_le(Self::from_ne_bytes(bytes)) + } + + /// Create an integer value 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 + /// + /// ``` + /// #![feature(int_to_from_bytes)] + /// + /// let int = i32::from_be(i32::from_ne_bytes([0x80, 0, 0, 0])); + /// assert_eq!(int, i32::min_value()); + /// ``` + #[unstable(feature = "int_to_from_bytes", issue = "52963")] + #[inline] + pub fn from_ne_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self { unsafe { mem::transmute(bytes) } } } |
