use rand_core::{Infallible, SeedableRng, TryRng};
use super::Mt64;
impl SeedableRng for Mt64 {
type Seed = [u8; 8];
#[inline]
fn from_seed(seed: Self::Seed) -> Self {
Self::from(seed)
}
}
impl TryRng for Mt64 {
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::Mt64;
use crate::vectors::mt64::{STATE_SEEDED_BY_U64, TEST_OUTPUT};
#[test]
fn seeded_state_from_u64_seed() {
let mt = Mt64::new(0x0123_4567_89ab_cdef_u64);
let mt_from_seed = Mt64::from_seed(0x0123_4567_89ab_cdef_u64.to_le_bytes());
assert_eq!(mt.state, mt_from_seed.state);
for (&Wrapping(x), &y) in mt.state.iter().zip(STATE_SEEDED_BY_U64.iter()) {
assert_eq!(x, y);
}
for (&Wrapping(x), &y) in mt_from_seed.state.iter().zip(STATE_SEEDED_BY_U64.iter()) {
assert_eq!(x, y);
}
}
#[test]
fn output_from_u64_slice_key() {
let key = [0x12345_u64, 0x23456_u64, 0x34567_u64, 0x45678_u64];
let mut mt = Mt64::new_with_key(key.iter().copied());
for &x in &TEST_OUTPUT {
assert_eq!(x, Rng::next_u64(&mut mt));
}
}
}