markdown_ppp/ast_specialized/
element_id.rs

1//! Element ID support for AST nodes
2//!
3//! This module provides [`ElementId`] type for uniquely identifying AST elements
4//! and related functionality like ID generation.
5
6/// Unique identifier for an AST element
7#[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    /// Create a new element ID
13    pub fn new(id: u64) -> Self {
14        Self(id)
15    }
16
17    /// Get the raw ID value
18    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/// ID generator for creating unique element IDs
36#[derive(Debug, Clone)]
37pub struct IdGenerator {
38    next_id: u64,
39}
40
41impl IdGenerator {
42    /// Create a new ID generator starting from 1
43    pub fn new() -> Self {
44        Self { next_id: 1 }
45    }
46
47    /// Create a new ID generator starting from a specific value
48    pub fn starting_from(start_id: u64) -> Self {
49        Self { next_id: start_id }
50    }
51
52    /// Generate the next unique ID
53    pub fn generate(&mut self) -> ElementId {
54        let id = ElementId::new(self.next_id);
55        self.next_id += 1;
56        id
57    }
58
59    /// Peek at the next ID without consuming it
60    pub fn peek(&self) -> ElementId {
61        ElementId::new(self.next_id)
62    }
63
64    /// Reset the generator to start from 1 again
65    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}