use crate::rng::Word;
pub trait RngW<const WIDTH: usize> {
type Word: crate::rng::Word;
#[must_use]
fn nextu(&mut self) -> [Self::Word; WIDTH];
#[must_use]
#[inline(always)]
fn nextf(&mut self) -> [<Self::Word as crate::rng::Word>::Float; WIDTH] {
self.nextu().map(<Self::Word as crate::rng::Word>::to_f01)
}
#[must_use]
#[inline(always)]
fn randi(
&mut self,
min: <Self::Word as crate::rng::Word>::Int,
max: <Self::Word as crate::rng::Word>::Int,
) -> [<Self::Word as crate::rng::Word>::Int; WIDTH] {
self.nextu().map(|w| w.to_randi(min, max))
}
#[must_use]
#[inline(always)]
fn randf(
&mut self,
min: <Self::Word as crate::rng::Word>::Float,
max: <Self::Word as crate::rng::Word>::Float,
) -> [<Self::Word as crate::rng::Word>::Float; WIDTH] {
self.nextu().map(|w| w.to_randf(min, max))
}
}
#[cfg(test)]
mod tests {
use crate::Seed;
use crate::wide::{Jsf32x4, Pcg32x4, RngW};
#[test]
fn seed_and_default_are_wired() {
let mut a = Jsf32x4::from_seed(1);
let mut b = Jsf32x4::from_seed(1);
assert_eq!(a.nextu(), b.nextu());
let _: Jsf32x4 = Default::default();
let mut c = Pcg32x4::from_seed(1);
let mut d = Pcg32x4::from_seed(1);
assert_eq!(c.nextu(), d.nextu());
let _: Pcg32x4 = Default::default();
}
}