#[inline]
pub unsafe fn as_raw_bytes_mut<T>(slice: &mut [T]) -> &mut [u8] {
unsafe {
let data = slice.as_mut_ptr().cast();
let len = size_of_val(slice);
core::slice::from_raw_parts_mut(data, len)
}
}
#[inline(never)]
pub fn state_from_seed<const SIZE: usize>(seed: u64) -> [u64; SIZE] {
let mut state = [0; SIZE];
let mut x = seed;
for v in &mut state {
x = x.wrapping_add(0x9E3779B97F4A7C15);
let mut z = x;
z = (z ^ (z >> 30)).wrapping_mul(0xBF58476D1CE4E5B9);
z = (z ^ (z >> 27)).wrapping_mul(0x94D049BB133111EB);
*v = z ^ (z >> 31);
}
state
}
#[inline]
pub fn state_from_entropy<const SIZE: usize>() -> Result<[u64; SIZE], getrandom::Error> {
let mut state = [0; SIZE];
let state_as_bytes = unsafe { as_raw_bytes_mut(&mut state) };
getrandom::fill(state_as_bytes)?;
Ok(state)
}
#[inline]
pub fn wide_mul(x: u64, y: u64) -> (u64, u64) {
let product = (x as u128).wrapping_mul(y as u128);
let high = (product >> u64::BITS) as u64;
let low = product as u64;
(high, low)
}