From 44cd47fd67102902b649c98b85c5abb9a0da39f8 Mon Sep 17 00:00:00 2001 From: HampusM Date: Tue, 18 Mar 2025 15:13:35 +0100 Subject: refactor(ecs): add component::Into --- ecs/src/component.rs | 45 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 8 deletions(-) (limited to 'ecs/src') diff --git a/ecs/src/component.rs b/ecs/src/component.rs index dc60995..9257c41 100644 --- a/ecs/src/component.rs +++ b/ecs/src/component.rs @@ -267,10 +267,16 @@ pub trait FromLockedOptional<'comp>: Sized macro_rules! inner { ($c: tt) => { seq!(I in 0..=$c { - impl<#(Comp~I: Component,)*> Sequence for (#(Comp~I,)*) + impl<#(IntoComp~I,)*> Sequence for (#(IntoComp~I,)*) where - #(for<'comp> Comp~I::RefMut<'comp>: FromOptionalMut<'comp>,)* - #(for<'comp> Comp~I::Ref<'comp>: FromOptional<'comp>,)* + #( + for<'comp> IntoComp~I: Into< + Component: Component< + RefMut<'comp>: FromOptionalMut<'comp>, + Ref<'comp>: FromOptional<'comp> + > + >, + )* { const COUNT: usize = $c + 1; @@ -278,7 +284,11 @@ macro_rules! inner { fn into_array(self) -> Self::Array { - [#((Comp~I::id(), Box::new(self.I) as Box),)*] + [#({ + let (id, component) = self.I.into_component(); + + (id, Box::new(component)) + },)*] } fn metadata() -> impl Array @@ -286,8 +296,8 @@ macro_rules! inner { [ #( Metadata { - id: Comp~I::id(), - is_optional: Comp~I::is_optional(), + id: IntoComp~I::Component::id(), + is_optional: IntoComp~I::Component::is_optional(), }, )* ] @@ -296,14 +306,14 @@ macro_rules! inner { fn added_event_ids() -> Vec { vec![ - #(ComponentAddedEvent::::id(),)* + #(ComponentAddedEvent::::id(),)* ] } fn removed_event_ids() -> Vec { vec![ - #(ComponentRemovedEvent::::id(),)* + #(ComponentRemovedEvent::::id(),)* ] } } @@ -398,3 +408,22 @@ impl RefSequence for () { } } + +pub trait Into +{ + type Component; + + fn into_component(self) -> (Uid, Self::Component); +} + +impl Into for ComponentT +where + ComponentT: Component, +{ + type Component = Self; + + fn into_component(self) -> (Uid, Self::Component) + { + (Self::id(), self) + } +} -- cgit v1.2.3-18-g5258