ruby_math/sampling/rng/
mod.rs

1#![allow(dead_code)]
2
3use std::fmt::Display;
4
5mod pcg32;
6pub use pcg32::Pcg32;
7
8#[derive(Clone, Copy, PartialEq, Debug)]
9pub enum Rng {
10    Pcg32(Pcg32),
11    Default,
12}
13
14pub fn rng_pcg32() -> Rng {
15    Rng::Pcg32(Pcg32::default())
16}
17
18impl Display for Rng {
19    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
20        match self {
21            Rng::Pcg32(rng) => write!(f, "Rng(rng: {})", rng),
22            Rng::Default => write!(f, "Rng(default)"),
23        }
24    }
25}
26
27impl Default for Rng {
28    fn default() -> Self {
29        Self::Default
30    }
31}
32
33impl Rng {
34    pub fn next_u32(&mut self) -> u32 {
35        match self {
36            Rng::Pcg32(rng) => rng.next_u32(),
37            Rng::Default => panic!("`rmath::sampling::Rng::next_u32`: empty rng."),
38        }
39    }
40
41    pub fn next_u64(&mut self) -> u64 {
42        match self {
43            Rng::Pcg32(rng) => rng.next_u64(),
44            Rng::Default => panic!("`rmath::sampling::Rng::next_u64`: empty rng."),
45        }
46    }
47
48    pub fn next_f32(&mut self) -> f32 {
49        match self {
50            Rng::Pcg32(rng) => rng.next_f32(),
51            Rng::Default => panic!("`rmath::sampling::Rng::next_f32`: empty rng."),
52        }
53    }
54
55    pub fn next_f64(&mut self) -> f64 {
56        match self {
57            Rng::Pcg32(rng) => rng.next_f64(),
58            Rng::Default => panic!("`rmath::sampling::Rng::next_f64`: empty rng."),
59        }
60    }
61
62    pub fn advance(&mut self, steps: u64) {
63        match self {
64            Rng::Pcg32(rng) => rng.advance(steps),
65            Rng::Default => panic!("`rmath::sampling::Rng::advance`: empty rng."),
66        }
67    }
68}