1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
#![deny(rust_2018_idioms)] #![deny(clippy::all)] mod entity; mod mapstorage; mod no_such_entity; mod register; mod vecstorage; pub use genesis_impl::*; pub use entity::Entities; pub use entity::Entity; pub use mapstorage::MapStorage; pub use no_such_entity::NoSuchEntity; pub use register::Register; pub use vecstorage::VecStorage; #[cfg(test)] mod tests { use super::*; use std::sync::{Arc, RwLock}; #[derive(Debug, Clone, Copy, Eq, PartialEq)] struct VecTestData(i32); #[derive(Debug, Clone, Copy, Eq, PartialEq)] struct MapTestData(i32); struct World { pub entities: Arc<RwLock<Entities>>, pub vec: VecStorage<VecTestData>, pub map: MapStorage<MapTestData>, } impl World { pub fn new(capacity: u32) -> Self { let entities = Arc::new(RwLock::new(Entities::new(capacity))); let vec = VecStorage::new(Arc::clone(&entities), capacity); let map = MapStorage::new(Arc::clone(&entities)); Self { entities, vec, map } } pub fn spawn(&mut self) -> Entity { self.entities.write().unwrap().spawn() } #[allow(unused)] pub fn despawn(&mut self, id: Entity) -> Result<(), NoSuchEntity> { let mut write = self.entities.write().unwrap(); write.despawn(id)?; self.vec.remove_unchecked(id); self.map.remove_unchecked(id); Ok(()) } } #[test] fn test_world() { let mut world = World::new(10); let first_id = world.spawn(); let second_id = world.spawn(); world.vec.set(first_id, VecTestData(1)).unwrap(); world.vec.set(second_id, VecTestData(2)).unwrap(); assert_eq!(world.vec.get(first_id), Some(&VecTestData(1))); let mut inc = 0; for id in world.entities.read().unwrap().iter() { inc += 1; assert_eq!(world.vec.get(id), Some(&VecTestData(inc))); } for id in world.entities.read().unwrap().iter() { world.vec.remove(id).unwrap(); } } }