rajac_types/
field_arena.rs1use crate::{FieldId, FieldSignature};
2
3#[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}