use rand_core::{Error, RngCore, SeedableRng};
use super::Mt19937GenRand64;
impl SeedableRng for Mt19937GenRand64 {
type Seed = [u8; 8];
#[inline]
fn from_seed(seed: Self::Seed) -> Self {
Self::from(seed)
}
}
impl RngCore for Mt19937GenRand64 {
#[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::Mt19937GenRand64;
use crate::vectors::mt64::{STATE_SEEDED_BY_U64, TEST_OUTPUT};
#[test]
fn seeded_state_from_u64_seed() {
let mt = Mt19937GenRand64::new(0x0123_4567_89ab_cdef_u64);
let mt_from_seed = Mt19937GenRand64::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 = Mt19937GenRand64::new_with_key(key.iter().copied());
for &x in TEST_OUTPUT.iter() {
assert_eq!(x, RngCore::next_u64(&mut mt));
}
}
}