charon_lib/ids/
generator.rs1use index_vec::Idx;
2use std::marker::PhantomData;
3
4#[derive(Debug, Clone, Copy)]
5pub struct Generator<I: Idx> {
6 counter: usize,
7 phantom: PhantomData<I>,
8}
9
10impl<I: Idx> Generator<I> {
11 pub fn new() -> Self {
12 Self::new_with_init_value(I::from_usize(0))
13 }
14
15 pub fn new_with_init_value(index: I) -> Self {
16 Generator {
17 counter: index.index(),
18 phantom: PhantomData,
19 }
20 }
21
22 pub fn fresh_id(&mut self) -> I {
24 let index = self.next_id();
25 self.advance(1);
26 index
27 }
28
29 pub fn next_id(&self) -> I {
31 I::from_usize(self.counter)
32 }
33
34 pub fn advance(&mut self, by: usize) {
36 self.counter = self.counter.checked_add(by).unwrap();
41 }
42}
43
44impl<I: Idx> Default for Generator<I> {
46 fn default() -> Self {
47 Self {
48 counter: Default::default(),
49 phantom: Default::default(),
50 }
51 }
52}