1use std::collections::HashMap;
2
3use bevy_ecs::prelude::Entity;
4use codec::EntityId;
5
6#[derive(Debug, Default)]
7pub struct EntityMap {
8 next_id: u32,
9 to_id: HashMap<Entity, EntityId>,
10 to_entity: HashMap<EntityId, Entity>,
11}
12
13impl EntityMap {
14 #[must_use]
15 pub fn new() -> Self {
16 Self::default()
17 }
18
19 #[must_use]
20 pub fn entity_id(&mut self, entity: Entity) -> EntityId {
21 if let Some(id) = self.to_id.get(&entity) {
22 return *id;
23 }
24 let next = self.next_id.saturating_add(1).max(1);
25 self.next_id = next;
26 let id = EntityId::new(next);
27 self.to_id.insert(entity, id);
28 self.to_entity.insert(id, entity);
29 id
30 }
31
32 #[must_use]
33 pub fn entity_id_known(&self, entity: Entity) -> Option<EntityId> {
34 self.to_id.get(&entity).copied()
35 }
36
37 #[must_use]
38 pub fn entity(&self, id: EntityId) -> Option<Entity> {
39 self.to_entity.get(&id).copied()
40 }
41
42 #[must_use]
43 pub fn ids(&self) -> Vec<EntityId> {
44 self.to_entity.keys().copied().collect()
45 }
46
47 pub fn register(&mut self, id: EntityId, entity: Entity) {
48 self.to_id.insert(entity, id);
49 self.to_entity.insert(id, entity);
50 self.next_id = self.next_id.max(id.raw());
51 }
52
53 pub fn unregister(&mut self, id: EntityId) {
54 if let Some(entity) = self.to_entity.remove(&id) {
55 self.to_id.remove(&entity);
56 }
57 }
58}