Skip to main content

competitive/tools/
id_generator.rs

1use std::ops::Range;
2
3#[derive(Debug, Default)]
4pub struct IdGenerator {
5    next_id: usize,
6}
7
8impl IdGenerator {
9    pub fn new() -> Self {
10        Default::default()
11    }
12
13    pub fn create(&mut self) -> usize {
14        let id = self.next_id;
15        self.next_id += 1;
16        id
17    }
18
19    pub fn create_n(&mut self, n: usize) -> Range<usize> {
20        let start = self.next_id;
21        self.next_id += n;
22        start..self.next_id
23    }
24
25    pub fn create_vec(&mut self, n: usize) -> Vec<usize> {
26        self.create_n(n).collect()
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use super::IdGenerator;
33    use crate::tools::Xorshift;
34
35    #[test]
36    fn test_id_generator() {
37        let mut rng = Xorshift::default();
38        for _ in 0..100 {
39            let mut g = IdGenerator::new();
40            let mut next = 0;
41            for _ in 0..100 {
42                let n = rng.random(0..=32);
43                match rng.random(0..3) {
44                    0 => {
45                        assert_eq!(g.create(), next);
46                        next += 1;
47                    }
48                    1 => {
49                        assert_eq!(g.create_n(n), next..next + n);
50                        next += n;
51                    }
52                    _ => {
53                        assert_eq!(g.create_vec(n), (next..next + n).collect::<Vec<_>>());
54                        next += n;
55                    }
56                }
57            }
58        }
59    }
60}