1use crate::{ComponentId, component_id};
2use std::any::Any;
3
4pub type Entity = usize;
6
7pub trait Component
11where
12 Self: Send + Sync + 'static,
13{
14}
15impl<T: Send + Sync + 'static> Component for T {}
16
17#[derive(Default)]
19#[doc(alias = "EntityComponents")]
20#[doc(alias = "ComponentMap")]
21pub struct EntityData(indexmap::IndexMap<ComponentId, Box<dyn Any + Send + Sync + 'static>>);
22
23impl EntityData {
24 pub fn new() -> Self {
26 Self::default()
27 }
28
29 pub fn add<C: Component>(&mut self, c: C) {
31 let ci = ComponentId::from_value(&c);
32 self.0.insert(ci, Box::new(c));
33 }
34
35 pub fn get<C: Component>(&self) -> Option<&C> {
52 let ci = component_id!(C);
53 self.0.get(&ci).map(|v| v.downcast_ref::<C>().unwrap())
54 }
55
56 pub fn get_mut<C: Component>(&mut self) -> Option<&mut C> {
58 let ci = component_id!(C);
59 self.0.get_mut(&ci).map(|v| v.downcast_mut::<C>().unwrap())
60 }
61
62 pub fn keys(&self) -> Vec<ComponentId> {
64 self.0.keys().copied().collect()
65 }
66
67 pub fn has_component<C: Component>(&self) -> bool {
69 self.0.contains_key(&component_id!(C))
70 }
71
72 pub fn remove<C: Component>(&mut self) {
74 self.0.swap_remove(&component_id!(C));
75 }
76}