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}