slot_vec/
slot_vec.rs

1use std::collections::VecDeque;
2use std::fmt;
3use crate::key::Key;
4
5#[derive(Clone)]
6pub struct SlotVec<T> {
7    items: Vec<Option<T>>,
8    free: VecDeque<usize>,
9}
10
11impl<T> Default for SlotVec<T> {
12    fn default() -> Self {
13        Self {
14            items: Vec::default(),
15            free: VecDeque::default(),
16        }
17    }
18}
19
20impl<T> SlotVec<T> {
21    #[inline]
22    pub fn new() -> Self {
23        Self {
24            items: Vec::new(),
25            free: VecDeque::new(),
26        }
27    }
28
29    pub fn with_capacity(capacity: usize) -> Self {
30        Self {
31            items: Vec::with_capacity(capacity),
32            free: VecDeque::with_capacity(capacity),
33        }
34    }
35
36    #[inline]
37    pub fn insert(&mut self, value: T) -> Key {
38        if let Some(index) = self.free.pop_back() {
39            self.items[index] = Some(value);
40            Key(index)
41        } else {
42            let index = self.items.len();
43            self.items.push(Some(value));
44            Key(index)
45        }
46    }
47
48    #[inline]
49    pub fn remove(&mut self, key: Key) -> Option<T> {
50        if let Some(slot) = self.items.get_mut(key.0) {
51            slot.take().inspect(|_| {
52                self.free.push_back(key.0);
53            })
54        } else {
55            None
56        }
57    }
58
59    #[inline]
60    pub fn get_ptr(&self, key: &Key) -> Option<*const T> {
61        self.items.get(key.0)?.as_ref().map(|item| item as *const T)
62    }
63
64    #[inline]
65    pub fn get(&self, key: &Key) -> Option<&T> {
66        self.items.get(key.0)?.as_ref()
67    }
68
69    #[inline]
70    pub fn get_mut(&mut self, key: &Key) -> Option<&mut T> {
71        self.items.get_mut(key.0)?.as_mut()
72    }
73
74    #[inline]
75    pub fn iter(&self) -> impl Iterator<Item = &T> {
76        self.items.iter().filter_map(|x| x.as_ref())
77    }
78
79    #[inline]
80    pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut T> {
81        self.items.iter_mut().filter_map(|x| x.as_mut())
82    }
83
84    #[inline]
85    pub fn len(&self) -> usize {
86        self.items.len() - self.free.len()
87    }
88
89    #[inline]
90    pub fn clear(&mut self) {
91        self.items.clear();
92        self.free.clear();
93    }
94
95    #[inline]
96    pub fn is_empty(&self) -> bool {
97        self.items.is_empty()
98    }
99}
100
101impl<T: fmt::Debug> fmt::Debug for SlotVec<T> {
102    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
103        f.debug_list().entries(self.iter()).finish()
104    }
105}