use rand_core::{Infallible, SeedableRng, TryRng};
use super::Mt;
impl SeedableRng for Mt {
type Seed = [u8; 4];
#[inline]
fn from_seed(seed: Self::Seed) -> Self {
Self::from(seed)
}
}
impl TryRng for Mt {
type Error = Infallible;
#[inline]
fn try_next_u64(&mut self) -> Result<u64, Self::Error> {
Ok(Self::next_u64(self))
}
#[inline]
fn try_next_u32(&mut self) -> Result<u32, Self::Error> {
Ok(Self::next_u32(self))
}
#[inline]
fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Self::Error> {
Self::fill_bytes(self, dest);
Ok(())
}
}
#[cfg(test)]
mod tests {
use core::num::Wrapping;
use rand_core::{Rng, SeedableRng};
use super::Mt;
use crate::vectors::mt::{STATE_SEEDED_BY_U32, TEST_OUTPUT};
#[test]
fn seeded_state_from_u32_seed() {
let rng = Mt::new(0x1234_5678_u32);
let rng_from_seed = Mt::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 = Mt::new_with_key(key.iter().copied());
for &x in &TEST_OUTPUT {
assert_eq!(x, Rng::next_u32(&mut rng));
}
}
}