//! Xorshift RNG used for tests. Based on the `rand_xorshift` crate. use core::num::Wrapping; /// Initial RNG state used in tests. // chosen by fair dice roll. guaranteed to be random. pub(crate) const RNG: XorShiftRng = XorShiftRng { x: Wrapping(0x0787_3B4A), y: Wrapping(0xFAAB_8FFE), z: Wrapping(0x1745_980F), w: Wrapping(0xB0AD_B4F3), }; /// Xorshift RNG instance/ pub(crate) struct XorShiftRng { x: Wrapping, y: Wrapping, z: Wrapping, w: Wrapping, } impl XorShiftRng { pub(crate) fn fill(&mut self, buf: &mut [u8; 1024]) { for chunk in buf.chunks_exact_mut(4) { chunk.copy_from_slice(&self.next_u32().to_le_bytes()); } } fn next_u32(&mut self) -> u32 { let x = self.x; let t = x ^ (x << 11); self.x = self.y; self.y = self.z; self.z = self.w; let w = self.w; self.w = w ^ (w >> 19) ^ (t ^ (t >> 8)); self.w.0 } }