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(&self, key: &Key) -> Option<&T> {
61 self.items.get(key.0)?.as_ref()
62 }
63
64 #[inline]
65 pub fn get_mut(&mut self, key: &Key) -> Option<&mut T> {
66 self.items.get_mut(key.0)?.as_mut()
67 }
68
69 #[inline]
70 pub fn iter(&self) -> impl Iterator<Item = &T> {
71 self.items.iter().filter_map(|x| x.as_ref())
72 }
73
74 #[inline]
75 pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut T> {
76 self.items.iter_mut().filter_map(|x| x.as_mut())
77 }
78
79 #[inline]
80 pub fn len(&self) -> usize {
81 self.items.len() - self.free.len()
82 }
83
84 #[inline]
85 pub fn clear(&mut self) {
86 self.items.clear();
87 self.free.clear();
88 }
89
90 #[inline]
91 pub fn is_empty(&self) -> bool {
92 self.items.is_empty()
93 }
94}
95
96impl<T: fmt::Debug> fmt::Debug for SlotVec<T> {
97 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
98 f.debug_list().entries(self.iter()).finish()
99 }
100}