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}