diff --git a/library/core/src/mem/maybe_uninit.rs b/library/core/src/mem/maybe_uninit.rs index 2ae9636762813..13a16feca2c2f 100644 --- a/library/core/src/mem/maybe_uninit.rs +++ b/library/core/src/mem/maybe_uninit.rs @@ -1201,7 +1201,7 @@ impl MaybeUninit { /// /// let val = 0x12345678i32; /// let mut uninit = MaybeUninit::new(val); - /// let uninit_bytes = uninit.as_bytes_mut(); + /// let uninit_bytes = uninit.as_mut_bytes(); /// if cfg!(target_endian = "little") { /// uninit_bytes[0].write(0xcd); /// } else { @@ -1211,7 +1211,7 @@ impl MaybeUninit { /// assert_eq!(val2, 0x123456cd); /// ``` #[unstable(feature = "maybe_uninit_as_bytes", issue = "93092")] - pub fn as_bytes_mut(&mut self) -> &mut [MaybeUninit] { + pub fn as_mut_bytes(&mut self) -> &mut [MaybeUninit] { // SAFETY: MaybeUninit is always valid, even for padding bytes unsafe { slice::from_raw_parts_mut( @@ -1220,7 +1220,46 @@ impl MaybeUninit { ) } } +} + +impl MaybeUninit<[T; N]> { + /// Transposes a `MaybeUninit<[T; N]>` into a `[MaybeUninit; N]`. + /// + /// # Examples + /// + /// ``` + /// #![feature(maybe_uninit_uninit_array_transpose)] + /// # use std::mem::MaybeUninit; + /// + /// let data: [MaybeUninit; 1000] = MaybeUninit::uninit().transpose(); + /// ``` + #[unstable(feature = "maybe_uninit_uninit_array_transpose", issue = "96097")] + pub fn transpose(self) -> [MaybeUninit; N] { + // SAFETY: T and MaybeUninit have the same layout + unsafe { super::transmute_copy(&ManuallyDrop::new(self)) } + } +} +impl [MaybeUninit; N] { + /// Transposes a `[MaybeUninit; N]` into a `MaybeUninit<[T; N]>`. + /// + /// # Examples + /// + /// ``` + /// #![feature(maybe_uninit_uninit_array_transpose)] + /// # use std::mem::MaybeUninit; + /// + /// let data = [MaybeUninit::::uninit(); 1000]; + /// let data: MaybeUninit<[u8; 1000]> = data.transpose(); + /// ``` + #[unstable(feature = "maybe_uninit_uninit_array_transpose", issue = "96097")] + pub fn transpose(self) -> MaybeUninit<[T; N]> { + // SAFETY: T and MaybeUninit have the same layout + unsafe { super::transmute_copy(&ManuallyDrop::new(self)) } + } +} + +impl [MaybeUninit] { /// Returns the contents of this slice of `MaybeUninit` as a slice of potentially uninitialized /// bytes. /// @@ -1234,19 +1273,19 @@ impl MaybeUninit { /// use std::mem::MaybeUninit; /// /// let uninit = [MaybeUninit::new(0x1234u16), MaybeUninit::new(0x5678u16)]; - /// let uninit_bytes = MaybeUninit::slice_as_bytes(&uninit); + /// let uninit_bytes = uninit.as_bytes(); /// let bytes = unsafe { MaybeUninit::slice_assume_init_ref(&uninit_bytes) }; /// let val1 = u16::from_ne_bytes(bytes[0..2].try_into().unwrap()); /// let val2 = u16::from_ne_bytes(bytes[2..4].try_into().unwrap()); /// assert_eq!(&[val1, val2], &[0x1234u16, 0x5678u16]); /// ``` #[unstable(feature = "maybe_uninit_as_bytes", issue = "93092")] - pub fn slice_as_bytes(this: &[MaybeUninit]) -> &[MaybeUninit] { + pub fn as_bytes(&self) -> &[MaybeUninit] { // SAFETY: MaybeUninit is always valid, even for padding bytes unsafe { slice::from_raw_parts( - this.as_ptr() as *const MaybeUninit, - this.len() * mem::size_of::(), + self.as_ptr() as *const MaybeUninit, + self.len() * mem::size_of::(), ) } } @@ -1264,7 +1303,7 @@ impl MaybeUninit { /// use std::mem::MaybeUninit; /// /// let mut uninit = [MaybeUninit::::uninit(), MaybeUninit::::uninit()]; - /// let uninit_bytes = MaybeUninit::slice_as_bytes_mut(&mut uninit); + /// let uninit_bytes = uninit.as_mut_bytes(); /// MaybeUninit::write_slice(uninit_bytes, &[0x12, 0x34, 0x56, 0x78]); /// let vals = unsafe { MaybeUninit::slice_assume_init_ref(&uninit) }; /// if cfg!(target_endian = "little") { @@ -1274,50 +1313,13 @@ impl MaybeUninit { /// } /// ``` #[unstable(feature = "maybe_uninit_as_bytes", issue = "93092")] - pub fn slice_as_bytes_mut(this: &mut [MaybeUninit]) -> &mut [MaybeUninit] { + pub fn as_mut_bytes(&mut self) -> &mut [MaybeUninit] { // SAFETY: MaybeUninit is always valid, even for padding bytes unsafe { slice::from_raw_parts_mut( - this.as_mut_ptr() as *mut MaybeUninit, - this.len() * mem::size_of::(), + self.as_mut_ptr() as *mut MaybeUninit, + self.len() * mem::size_of::(), ) } } } - -impl MaybeUninit<[T; N]> { - /// Transposes a `MaybeUninit<[T; N]>` into a `[MaybeUninit; N]`. - /// - /// # Examples - /// - /// ``` - /// #![feature(maybe_uninit_uninit_array_transpose)] - /// # use std::mem::MaybeUninit; - /// - /// let data: [MaybeUninit; 1000] = MaybeUninit::uninit().transpose(); - /// ``` - #[unstable(feature = "maybe_uninit_uninit_array_transpose", issue = "96097")] - pub fn transpose(self) -> [MaybeUninit; N] { - // SAFETY: T and MaybeUninit have the same layout - unsafe { super::transmute_copy(&ManuallyDrop::new(self)) } - } -} - -impl [MaybeUninit; N] { - /// Transposes a `[MaybeUninit; N]` into a `MaybeUninit<[T; N]>`. - /// - /// # Examples - /// - /// ``` - /// #![feature(maybe_uninit_uninit_array_transpose)] - /// # use std::mem::MaybeUninit; - /// - /// let data = [MaybeUninit::::uninit(); 1000]; - /// let data: MaybeUninit<[u8; 1000]> = data.transpose(); - /// ``` - #[unstable(feature = "maybe_uninit_uninit_array_transpose", issue = "96097")] - pub fn transpose(self) -> MaybeUninit<[T; N]> { - // SAFETY: T and MaybeUninit have the same layout - unsafe { super::transmute_copy(&ManuallyDrop::new(self)) } - } -}