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();
}
}
}