From 3e6d04be56e910f77048442a3c744298ef856ca1 Mon Sep 17 00:00:00 2001 From: HampusM Date: Fri, 5 Apr 2024 23:06:49 +0200 Subject: feat(ecs): add event loop function to world --- ecs/src/event.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'ecs/src/event.rs') diff --git a/ecs/src/event.rs b/ecs/src/event.rs index 0cf6da7..01d9d80 100644 --- a/ecs/src/event.rs +++ b/ecs/src/event.rs @@ -2,6 +2,8 @@ use std::any::TypeId; use std::fmt::Debug; use std::hash::Hash; +use seq_macro::seq; + pub trait Event: Debug + 'static { fn id(&self) -> Id; @@ -22,3 +24,49 @@ impl Id Self { inner: TypeId::of::() } } } + +pub trait Ids +{ + type Iter<'a>: Iterator + where + Self: 'a; + + fn iter(&self) -> Self::Iter<'_>; +} + +/// A sequence of events. +pub trait Sequence +{ + type Ids: Ids; + + fn ids() -> Self::Ids; +} + +macro_rules! impl_sequence { + ($c: tt) => { + seq!(I in 0..=$c { + impl Ids for [Id; $c + 1] + { + type Iter<'a> = std::slice::Iter<'a, Id>; + + fn iter(&self) -> Self::Iter<'_> { + self.into_iter() + } + } + + impl<#(Event~I: Event,)*> Sequence for (#(Event~I,)*) { + type Ids = [Id; $c + 1]; + + fn ids() -> Self::Ids { + [#( + Id::of::(), + )*] + } + } + }); + }; +} + +seq!(C in 0..=64 { + impl_sequence!(C); +}); -- cgit v1.2.3-18-g5258