use rand_core::{Error, RngCore, SeedableRng};
use super::Mt19937GenRand32;
impl SeedableRng for Mt19937GenRand32 {
type Seed = [u8; 4];
#[inline]
fn from_seed(seed: Self::Seed) -> Self {
Self::from(seed)
}
}
impl RngCore for Mt19937GenRand32 {
#[inline]
fn next_u64(&mut self) -> u64 {
Self::next_u64(self)
}
#[inline]
fn next_u32(&mut self) -> u32 {
Self::next_u32(self)
}
#[inline]
fn fill_bytes(&mut self, dest: &mut [u8]) {
Self::fill_bytes(self, dest);
}
#[inline]
fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> {
Self::fill_bytes(self, dest);
Ok(())
}
}
#[cfg(test)]
mod tests {
use core::num::Wrapping;
use rand_core::{RngCore, SeedableRng};
use super::Mt19937GenRand32;
use crate::vectors::mt::{STATE_SEEDED_BY_U32, TEST_OUTPUT};
#[test]
fn seeded_state_from_u32_seed() {
let rng = Mt19937GenRand32::new(0x1234_5678_u32);
let rng_from_seed = Mt19937GenRand32::from_seed(0x1234_5678_u32.to_le_bytes());
assert_eq!(rng.state, rng_from_seed.state);
for (&Wrapping(x), &y) in rng.state.iter().zip(STATE_SEEDED_BY_U32.iter()) {
assert_eq!(x, y);
}
for (&Wrapping(x), &y) in rng_from_seed.state.iter().zip(STATE_SEEDED_BY_U32.iter()) {
assert_eq!(x, y);
}
}
#[test]
fn output_from_u32_slice_key() {
let key = [0x123_u32, 0x234_u32, 0x345_u32, 0x456_u32];
let mut rng = Mt19937GenRand32::new_with_key(key.iter().copied());
for &x in TEST_OUTPUT.iter() {
assert_eq!(x, RngCore::next_u32(&mut rng));
}
}
}