xref: /aosp_15_r20/external/cronet/third_party/rust/chromium_crates_io/vendor/getrandom-0.2.14/src/util.rs (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 #![allow(dead_code)]
2 use core::{mem::MaybeUninit, ptr};
3 
4 /// Polyfill for `maybe_uninit_slice` feature's
5 /// `MaybeUninit::slice_assume_init_mut`. Every element of `slice` must have
6 /// been initialized.
7 #[inline(always)]
slice_assume_init_mut<T>(slice: &mut [MaybeUninit<T>]) -> &mut [T]8 pub unsafe fn slice_assume_init_mut<T>(slice: &mut [MaybeUninit<T>]) -> &mut [T] {
9     // SAFETY: `MaybeUninit<T>` is guaranteed to be layout-compatible with `T`.
10     &mut *(slice as *mut [MaybeUninit<T>] as *mut [T])
11 }
12 
13 #[inline]
uninit_slice_fill_zero(slice: &mut [MaybeUninit<u8>]) -> &mut [u8]14 pub fn uninit_slice_fill_zero(slice: &mut [MaybeUninit<u8>]) -> &mut [u8] {
15     unsafe { ptr::write_bytes(slice.as_mut_ptr(), 0, slice.len()) };
16     unsafe { slice_assume_init_mut(slice) }
17 }
18 
19 #[inline(always)]
slice_as_uninit<T>(slice: &[T]) -> &[MaybeUninit<T>]20 pub fn slice_as_uninit<T>(slice: &[T]) -> &[MaybeUninit<T>] {
21     // SAFETY: `MaybeUninit<T>` is guaranteed to be layout-compatible with `T`.
22     // There is no risk of writing a `MaybeUninit<T>` into the result since
23     // the result isn't mutable.
24     unsafe { &*(slice as *const [T] as *const [MaybeUninit<T>]) }
25 }
26 
27 /// View an mutable initialized array as potentially-uninitialized.
28 ///
29 /// This is unsafe because it allows assigning uninitialized values into
30 /// `slice`, which would be undefined behavior.
31 #[inline(always)]
slice_as_uninit_mut<T>(slice: &mut [T]) -> &mut [MaybeUninit<T>]32 pub unsafe fn slice_as_uninit_mut<T>(slice: &mut [T]) -> &mut [MaybeUninit<T>] {
33     // SAFETY: `MaybeUninit<T>` is guaranteed to be layout-compatible with `T`.
34     &mut *(slice as *mut [T] as *mut [MaybeUninit<T>])
35 }
36