diff options
| author | HampusM <hampus@hampusmat.com> | 2026-06-08 13:37:40 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-06-08 13:37:40 +0200 |
| commit | 661ef626dd8b78a199aa76c58f788349cbbcbe46 (patch) | |
| tree | 85e6b3ee0316c85166b1f211a26560f40964cb76 /engine-ecs/src/component.rs | |
| parent | 04bde94d9088f5a7c2a885d812495fa173cd67c0 (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.rs | 51 |
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 { |
