radiate_utils/
arena.rs

1#[derive(Clone, Copy, PartialEq, Eq, Hash)]
2#[repr(transparent)]
3pub struct ArenaKey(usize);
4
5impl AsRef<usize> for ArenaKey {
6    fn as_ref(&self) -> &usize {
7        &self.0
8    }
9}
10
11pub struct Arena<T> {
12    items: Vec<T>,
13}
14
15impl<T> Arena<T> {
16    pub fn new() -> Self {
17        Self { items: Vec::new() }
18    }
19
20    pub fn with_capacity(capacity: usize) -> Self {
21        Self {
22            items: Vec::with_capacity(capacity),
23        }
24    }
25
26    pub fn insert(&mut self, item: T) -> ArenaKey {
27        self.items.push(item);
28        ArenaKey(self.items.len() - 1)
29    }
30
31    pub fn get(&self, index: &ArenaKey) -> Option<&T> {
32        self.items.get(*index.as_ref())
33    }
34
35    pub fn get_mut(&mut self, index: &ArenaKey) -> Option<&mut T> {
36        self.items.get_mut(*index.as_ref())
37    }
38
39    pub fn len(&self) -> usize {
40        self.items.len()
41    }
42
43    pub fn is_empty(&self) -> bool {
44        self.items.is_empty()
45    }
46}
47
48impl<T> std::ops::Index<usize> for Arena<T> {
49    type Output = T;
50
51    fn index(&self, index: usize) -> &Self::Output {
52        &self.items[index]
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use super::Arena;
59
60    #[test]
61    fn test_arena_insert_and_get() {
62        let mut arena = Arena::new();
63        let key1 = arena.insert(10);
64        let key2 = arena.insert(20);
65
66        assert_eq!(arena.get(&key1), Some(&10));
67        assert_eq!(arena.get(&key2), Some(&20));
68        assert_eq!(arena.len(), 2);
69    }
70}