ruby_math/sampling/rng/
mod.rs1#![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}