1use crate::EntityRef;
4use crate::keys::Keys;
5use core::fmt;
6use core::marker::PhantomData;
7use cranelift_bitset::CompoundBitSet;
8
9#[derive(Clone, PartialEq, Eq)]
14#[cfg_attr(
15 feature = "enable-serde",
16 derive(serde_derive::Serialize, serde_derive::Deserialize)
17)]
18pub struct EntitySet<K>
19where
20 K: EntityRef,
21{
22 bitset: CompoundBitSet,
23 unused: PhantomData<K>,
24}
25
26impl<K> fmt::Debug for EntitySet<K>
27where
28 K: fmt::Debug + EntityRef,
29{
30 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
31 f.debug_set().entries(self.keys()).finish()
32 }
33}
34
35impl<K: EntityRef> Default for EntitySet<K> {
36 fn default() -> Self {
37 Self {
38 bitset: CompoundBitSet::default(),
39 unused: PhantomData,
40 }
41 }
42}
43
44impl<K: EntityRef> Extend<K> for EntitySet<K> {
45 fn extend<T: IntoIterator<Item = K>>(&mut self, iter: T) {
46 for k in iter {
47 self.insert(k);
48 }
49 }
50}
51
52impl<K> EntitySet<K>
54where
55 K: EntityRef,
56{
57 pub fn new() -> Self {
59 Self::default()
60 }
61
62 pub fn with_capacity(capacity: usize) -> Self {
64 Self {
65 bitset: CompoundBitSet::with_capacity(capacity),
66 unused: PhantomData,
67 }
68 }
69
70 pub fn ensure_capacity(&mut self, capacity: usize) {
73 self.bitset.ensure_capacity(capacity);
74 }
75
76 pub fn contains(&self, k: K) -> bool {
78 let index = k.index();
79 self.bitset.contains(index)
80 }
81
82 pub fn is_empty(&self) -> bool {
84 self.bitset.is_empty()
85 }
86
87 pub fn clear(&mut self) {
89 self.bitset.clear()
90 }
91
92 pub fn keys(&self) -> Keys<K> {
114 Keys::with_len(self.bitset.max().map_or(0, |x| x + 1))
115 }
116
117 pub fn iter(&self) -> SetIter<'_, K> {
136 SetIter {
137 inner: self.bitset.iter(),
138 _phantom: PhantomData,
139 }
140 }
141
142 pub fn insert(&mut self, k: K) -> bool {
147 let index = k.index();
148 self.bitset.insert(index)
149 }
150
151 pub fn remove(&mut self, k: K) -> bool {
155 let index = k.index();
156 self.bitset.remove(index)
157 }
158
159 pub fn pop(&mut self) -> Option<K> {
161 let index = self.bitset.pop()?;
162 Some(K::new(index))
163 }
164}
165
166pub struct SetIter<'a, K> {
168 inner: cranelift_bitset::compound::Iter<'a>,
169 _phantom: PhantomData<K>,
170}
171
172impl<K> Iterator for SetIter<'_, K>
173where
174 K: EntityRef,
175{
176 type Item = K;
177
178 #[inline]
179 fn next(&mut self) -> Option<Self::Item> {
180 let k = self.inner.next()?;
181 Some(K::new(k))
182 }
183}
184
185#[cfg(test)]
186mod tests {
187 use super::*;
188 use alloc::vec::Vec;
189 use core::u32;
190
191 #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
193 struct E(u32);
194
195 impl EntityRef for E {
196 fn new(i: usize) -> Self {
197 E(i as u32)
198 }
199 fn index(self) -> usize {
200 self.0 as usize
201 }
202 }
203
204 #[test]
205 fn basic() {
206 let r0 = E(0);
207 let r1 = E(1);
208 let r2 = E(2);
209 let mut m = EntitySet::new();
210
211 let v: Vec<E> = m.keys().collect();
212 assert_eq!(v, []);
213 assert!(m.is_empty());
214
215 m.insert(r2);
216 m.insert(r1);
217
218 assert!(!m.contains(r0));
219 assert!(m.contains(r1));
220 assert!(m.contains(r2));
221 assert!(!m.contains(E(3)));
222 assert!(!m.is_empty());
223
224 let v: Vec<E> = m.keys().collect();
225 assert_eq!(v, [r0, r1, r2]);
226
227 assert!(!m.contains(E(3)));
228 assert!(!m.contains(E(4)));
229 assert!(!m.contains(E(8)));
230 assert!(!m.contains(E(15)));
231 assert!(!m.contains(E(19)));
232
233 m.insert(E(8));
234 m.insert(E(15));
235 assert!(!m.contains(E(3)));
236 assert!(!m.contains(E(4)));
237 assert!(m.contains(E(8)));
238 assert!(!m.contains(E(9)));
239 assert!(!m.contains(E(14)));
240 assert!(m.contains(E(15)));
241 assert!(!m.contains(E(16)));
242 assert!(!m.contains(E(19)));
243 assert!(!m.contains(E(20)));
244 assert!(!m.contains(E(u32::MAX)));
245
246 m.clear();
247 assert!(m.is_empty());
248 }
249
250 #[test]
251 fn pop_ordered() {
252 let r0 = E(0);
253 let r1 = E(1);
254 let r2 = E(2);
255 let mut m = EntitySet::new();
256 m.insert(r0);
257 m.insert(r1);
258 m.insert(r2);
259
260 assert_eq!(r2, m.pop().unwrap());
261 assert_eq!(r1, m.pop().unwrap());
262 assert_eq!(r0, m.pop().unwrap());
263 assert!(m.pop().is_none());
264 assert!(m.pop().is_none());
265 }
266
267 #[test]
268 fn pop_unordered() {
269 let mut blocks = [
270 E(0),
271 E(1),
272 E(6),
273 E(7),
274 E(5),
275 E(9),
276 E(10),
277 E(2),
278 E(3),
279 E(11),
280 E(12),
281 ];
282
283 let mut m = EntitySet::new();
284 for &block in &blocks {
285 m.insert(block);
286 }
287 assert_eq!(m.bitset.max(), Some(12));
288 blocks.sort();
289
290 for &block in blocks.iter().rev() {
291 assert_eq!(block, m.pop().unwrap());
292 }
293
294 assert!(m.is_empty());
295 }
296}