Skip to main content

rajac_types/
field_arena.rs

1use crate::{FieldId, FieldSignature};
2
3/// Arena storage for field signatures.
4#[derive(Debug, Clone)]
5pub struct FieldArena {
6    fields: Vec<FieldSignature>,
7}
8
9impl FieldArena {
10    pub fn new() -> Self {
11        Self { fields: Vec::new() }
12    }
13
14    pub fn alloc(&mut self, field: FieldSignature) -> FieldId {
15        let id = FieldId(self.fields.len() as u32);
16        self.fields.push(field);
17        id
18    }
19
20    pub fn get(&self, id: FieldId) -> &FieldSignature {
21        &self.fields[id.0 as usize]
22    }
23
24    pub fn get_mut(&mut self, id: FieldId) -> &mut FieldSignature {
25        &mut self.fields[id.0 as usize]
26    }
27
28    pub fn len(&self) -> usize {
29        self.fields.len()
30    }
31
32    pub fn is_empty(&self) -> bool {
33        self.fields.is_empty()
34    }
35}
36
37impl Default for FieldArena {
38    fn default() -> Self {
39        Self::new()
40    }
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46    use crate::FieldModifiers;
47    use rajac_base::shared_string::SharedString;
48
49    #[test]
50    fn allocates_and_returns_field_signatures() {
51        let mut arena = FieldArena::new();
52        let signature = FieldSignature::new(
53            SharedString::new("count"),
54            crate::TypeId(0),
55            FieldModifiers(FieldModifiers::PUBLIC),
56        );
57
58        let id = arena.alloc(signature.clone());
59
60        assert_eq!(arena.get(id), &signature);
61        assert_eq!(arena.len(), 1);
62    }
63}