summaryrefslogtreecommitdiff
path: root/engine-ecs/src/component.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-06-08 13:37:40 +0200
committerHampusM <hampus@hampusmat.com>2026-06-08 13:37:40 +0200
commit661ef626dd8b78a199aa76c58f788349cbbcbe46 (patch)
tree85e6b3ee0316c85166b1f211a26560f40964cb76 /engine-ecs/src/component.rs
parent04bde94d9088f5a7c2a885d812495fa173cd67c0 (diff)
feat(engine-ecs): add support for dyn Any component handles
Diffstat (limited to 'engine-ecs/src/component.rs')
-rw-r--r--engine-ecs/src/component.rs51
1 files changed, 46 insertions, 5 deletions
diff --git a/engine-ecs/src/component.rs b/engine-ecs/src/component.rs
index 2734731..c163325 100644
--- a/engine-ecs/src/component.rs
+++ b/engine-ecs/src/component.rs
@@ -77,7 +77,7 @@ pub trait Sequence
}
#[derive(Debug)]
-pub struct Handle<'a, DataT: 'static>
+pub struct Handle<'a, DataT: ?Sized + 'static>
{
inner: MappedReadGuard<'a, DataT>,
}
@@ -111,7 +111,25 @@ impl<'comp, DataT: 'static> Handle<'comp, DataT>
}
}
-impl<DataT: 'static> Deref for Handle<'_, DataT>
+impl<'comp> Handle<'comp, dyn Any>
+{
+ pub fn new_any(
+ entity_component_ref: &EntityComponentRef<'comp>,
+ ) -> Result<Self, HandleError>
+ {
+ Ok(Self {
+ inner: ReadGuard::map(
+ entity_component_ref
+ .component()
+ .read_nonblock()
+ .map_err(AcquireLockError)?,
+ |component| &**component,
+ ),
+ })
+ }
+}
+
+impl<DataT: ?Sized + 'static> Deref for Handle<'_, DataT>
{
type Target = DataT;
@@ -122,7 +140,7 @@ impl<DataT: 'static> Deref for Handle<'_, DataT>
}
#[derive(Debug)]
-pub struct HandleMut<'a, DataT: 'static>
+pub struct HandleMut<'a, DataT: ?Sized + 'static>
{
entity_component_ref: EntityComponentRef<'a>,
inner: MappedWriteGuard<'a, DataT>,
@@ -154,7 +172,30 @@ impl<'comp, DataT: 'static> HandleMut<'comp, DataT>
event_submitter: world.event_submitter(),
})
}
+}
+
+impl<'comp> HandleMut<'comp, dyn Any>
+{
+ pub fn new_any(
+ entity_component_ref: &EntityComponentRef<'comp>,
+ world: &'comp World,
+ ) -> Result<Self, HandleError>
+ {
+ let inner = entity_component_ref
+ .component()
+ .write_nonblock()
+ .map_err(AcquireLockError)?;
+
+ Ok(Self {
+ entity_component_ref: entity_component_ref.clone(),
+ inner: WriteGuard::map(inner, |component| &mut **component),
+ event_submitter: world.event_submitter(),
+ })
+ }
+}
+impl<'comp, DataT: ?Sized + 'static> HandleMut<'comp, DataT>
+{
pub fn set_changed(&self)
{
self.event_submitter.submit_event(
@@ -167,7 +208,7 @@ impl<'comp, DataT: 'static> HandleMut<'comp, DataT>
}
}
-impl<DataT: 'static> Deref for HandleMut<'_, DataT>
+impl<DataT: ?Sized + 'static> Deref for HandleMut<'_, DataT>
{
type Target = DataT;
@@ -177,7 +218,7 @@ impl<DataT: 'static> Deref for HandleMut<'_, DataT>
}
}
-impl<DataT: 'static> DerefMut for HandleMut<'_, DataT>
+impl<DataT: ?Sized + 'static> DerefMut for HandleMut<'_, DataT>
{
fn deref_mut(&mut self) -> &mut Self::Target
{