1 //! Densely numbered entity references as set keys. 2 3 use crate::EntityRef; 4 use crate::keys::Keys; 5 use core::fmt; 6 use core::marker::PhantomData; 7 use cranelift_bitset::CompoundBitSet; 8 9 /// A set of `K` for densely indexed entity references. 10 /// 11 /// The `EntitySet` data structure uses the dense index space to implement a set with a bitvector. 12 /// Like `SecondaryMap`, an `EntitySet` is used to associate secondary information with entities. 13 #[derive(Clone, PartialEq, Eq)] 14 #[cfg_attr( 15 feature = "enable-serde", 16 derive(serde_derive::Serialize, serde_derive::Deserialize) 17 )] 18 pub struct EntitySet<K> 19 where 20 K: EntityRef, 21 { 22 bitset: CompoundBitSet, 23 unused: PhantomData<K>, 24 } 25 26 impl<K> fmt::Debug for EntitySet<K> 27 where 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 35 impl<K: EntityRef> Default for EntitySet<K> { 36 fn default() -> Self { 37 Self { 38 bitset: CompoundBitSet::default(), 39 unused: PhantomData, 40 } 41 } 42 } 43 44 impl<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 52 /// Shared `EntitySet` implementation for all value types. 53 impl<K> EntitySet<K> 54 where 55 K: EntityRef, 56 { 57 /// Create a new empty set. 58 pub fn new() -> Self { 59 Self::default() 60 } 61 62 /// Creates a new empty set with the specified capacity. 63 pub fn with_capacity(capacity: usize) -> Self { 64 Self { 65 bitset: CompoundBitSet::with_capacity(capacity), 66 unused: PhantomData, 67 } 68 } 69 70 /// Ensure that the set has enough capacity to hold `capacity` total 71 /// elements. 72 pub fn ensure_capacity(&mut self, capacity: usize) { 73 self.bitset.ensure_capacity(capacity); 74 } 75 76 /// Get the element at `k` if it exists. 77 pub fn contains(&self, k: K) -> bool { 78 let index = k.index(); 79 self.bitset.contains(index) 80 } 81 82 /// Is this set completely empty? 83 pub fn is_empty(&self) -> bool { 84 self.bitset.is_empty() 85 } 86 87 /// Remove all entries from this set. 88 pub fn clear(&mut self) { 89 self.bitset.clear() 90 } 91 92 /// Iterate over all the keys up to the maximum in this set. 93 /// 94 /// This will yield intermediate keys on the way up to the max key, even if 95 /// they are not contained within the set. 96 /// 97 /// ``` 98 /// use cranelift_entity::{entity_impl, EntityRef, EntitySet}; 99 /// 100 /// #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] 101 /// struct Entity(u32); 102 /// entity_impl!(Entity); 103 /// 104 /// let mut set = EntitySet::new(); 105 /// set.insert(Entity::new(2)); 106 /// 107 /// let mut keys = set.keys(); 108 /// assert_eq!(keys.next(), Some(Entity::new(0))); 109 /// assert_eq!(keys.next(), Some(Entity::new(1))); 110 /// assert_eq!(keys.next(), Some(Entity::new(2))); 111 /// assert!(keys.next().is_none()); 112 /// ``` 113 pub fn keys(&self) -> Keys<K> { 114 Keys::with_len(self.bitset.max().map_or(0, |x| x + 1)) 115 } 116 117 /// Iterate over the elements of this set. 118 /// 119 /// ``` 120 /// use cranelift_entity::{entity_impl, EntityRef, EntitySet}; 121 /// 122 /// #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] 123 /// struct Entity(u32); 124 /// entity_impl!(Entity); 125 /// 126 /// let mut set = EntitySet::new(); 127 /// set.insert(Entity::new(2)); 128 /// set.insert(Entity::new(3)); 129 /// 130 /// let mut iter = set.iter(); 131 /// assert_eq!(iter.next(), Some(Entity::new(2))); 132 /// assert_eq!(iter.next(), Some(Entity::new(3))); 133 /// assert!(iter.next().is_none()); 134 /// ``` 135 pub fn iter(&self) -> SetIter<'_, K> { 136 SetIter { 137 inner: self.bitset.iter(), 138 _phantom: PhantomData, 139 } 140 } 141 142 /// Insert the element at `k`. 143 /// 144 /// Returns `true` if `k` was not present in the set, i.e. this is a 145 /// newly-added element. Returns `false` otherwise. 146 pub fn insert(&mut self, k: K) -> bool { 147 let index = k.index(); 148 self.bitset.insert(index) 149 } 150 151 /// Remove `k` from this bitset. 152 /// 153 /// Returns whether `k` was previously in this set or not. 154 pub fn remove(&mut self, k: K) -> bool { 155 let index = k.index(); 156 self.bitset.remove(index) 157 } 158 159 /// Removes and returns the entity from the set if it exists. 160 pub fn pop(&mut self) -> Option<K> { 161 let index = self.bitset.pop()?; 162 Some(K::new(index)) 163 } 164 } 165 166 /// An iterator over the elements in an `EntitySet`. 167 pub struct SetIter<'a, K> { 168 inner: cranelift_bitset::compound::Iter<'a>, 169 _phantom: PhantomData<K>, 170 } 171 172 impl<K> Iterator for SetIter<'_, K> 173 where 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)] 186 mod tests { 187 use super::*; 188 use alloc::vec::Vec; 189 use core::u32; 190 191 // `EntityRef` impl for testing. 192 #[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 } 297