markdown_ppp/ast_specialized/
element_id.rs1#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
8#[cfg_attr(feature = "ast-serde", derive(serde::Serialize, serde::Deserialize))]
9pub struct ElementId(pub u64);
10
11impl ElementId {
12 pub fn new(id: u64) -> Self {
14 Self(id)
15 }
16
17 pub fn id(&self) -> u64 {
19 self.0
20 }
21}
22
23impl From<u64> for ElementId {
24 fn from(id: u64) -> Self {
25 Self(id)
26 }
27}
28
29impl From<ElementId> for u64 {
30 fn from(element_id: ElementId) -> Self {
31 element_id.0
32 }
33}
34
35#[derive(Debug, Clone)]
37pub struct IdGenerator {
38 next_id: u64,
39}
40
41impl IdGenerator {
42 pub fn new() -> Self {
44 Self { next_id: 1 }
45 }
46
47 pub fn starting_from(start_id: u64) -> Self {
49 Self { next_id: start_id }
50 }
51
52 pub fn generate(&mut self) -> ElementId {
54 let id = ElementId::new(self.next_id);
55 self.next_id += 1;
56 id
57 }
58
59 pub fn peek(&self) -> ElementId {
61 ElementId::new(self.next_id)
62 }
63
64 pub fn reset(&mut self) {
66 self.next_id = 1;
67 }
68}
69
70impl Default for IdGenerator {
71 fn default() -> Self {
72 Self::new()
73 }
74}
75
76#[cfg(test)]
77mod tests {
78 use super::*;
79
80 #[test]
81 fn test_element_id_basic() {
82 let id = ElementId::new(42);
83 assert_eq!(id.id(), 42);
84 assert_eq!(u64::from(id.clone()), 42);
85 assert_eq!(ElementId::from(42), id);
86 }
87
88 #[test]
89 fn test_id_generator() {
90 let mut gen = IdGenerator::new();
91 assert_eq!(gen.generate().id(), 1);
92 assert_eq!(gen.generate().id(), 2);
93 assert_eq!(gen.peek().id(), 3);
94 assert_eq!(gen.generate().id(), 3);
95
96 gen.reset();
97 assert_eq!(gen.generate().id(), 1);
98 }
99
100 #[test]
101 fn test_id_generator_starting_from() {
102 let mut gen = IdGenerator::starting_from(100);
103 assert_eq!(gen.generate().id(), 100);
104 assert_eq!(gen.generate().id(), 101);
105 }
106}