rand_sequence/
rand.rs

1use rand::RngCore;
2
3use crate::{RandomSequence, RandomSequenceBuilder};
4
5macro_rules! init_rand {
6    ($type:ident, $tests:ident) => {
7        impl RandomSequenceBuilder<$type> {
8            /// Initialise a RandomSequenceBuilder from a random seed.
9            pub fn rand(rng: &mut impl RngCore) -> Self {
10                let seed_base = rng.next_u64() as $type;
11                let seed_offset = rng.next_u64() as $type;
12                Self::new(seed_base, seed_offset)
13            }
14        }
15
16        impl RandomSequence<$type> {
17            /// Initialise a RandomSequence from a random seed.
18            pub fn rand(rng: &mut impl RngCore) -> Self {
19                RandomSequenceBuilder::<$type>::rand(rng).into_iter()
20            }
21        }
22
23        #[cfg(test)]
24        mod $tests {
25            use rand::rngs::OsRng;
26
27            use super::*;
28
29            #[test]
30            fn test_rand() {
31                let mut rng = OsRng;
32                let config1 = RandomSequenceBuilder::<$type>::rand(&mut rng);
33                let config2 = RandomSequenceBuilder::<$type>::rand(&mut rng);
34                assert_ne!(config1, config2);
35
36                let mut sequence = RandomSequence::<$type>::rand(&mut rng);
37                assert_ne!(sequence.next(), sequence.next());
38            }
39        }
40    };
41}
42
43init_rand!(u8, tests_u8);
44init_rand!(u16, tests_u16);
45init_rand!(u32, tests_u32);
46init_rand!(u64, tests_u64);
47init_rand!(usize, tests_usize);