Skip to main content

sdec_bevy/
mapping.rs

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}