diff options
Diffstat (limited to 'ecs/src/uid.rs')
| -rw-r--r-- | ecs/src/uid.rs | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/ecs/src/uid.rs b/ecs/src/uid.rs index feed62c..bb393a1 100644 --- a/ecs/src/uid.rs +++ b/ecs/src/uid.rs @@ -2,8 +2,10 @@ use std::fmt::{Debug, Display, Formatter}; use std::mem::transmute; use std::sync::atomic::{AtomicU32, Ordering}; +use seq_macro::seq; + use crate::component::Component; -use crate::util::{gen_mask_64, BitMask, NumberExt}; +use crate::util::{gen_mask_64, Array, BitMask, NumberExt}; static NEXT: AtomicU32 = AtomicU32::new(Uid::FIRST_UNIQUE_ID); @@ -218,7 +220,7 @@ pub struct PairParams pub target: Uid, } -pub trait With: 'static +pub trait With { fn uid() -> Uid; } @@ -231,13 +233,29 @@ impl<ComponentT: Component> With for ComponentT } } -#[derive(Debug)] -pub enum Wildcard {} - -impl With for Wildcard +pub trait WithUidTuple { - fn uid() -> Uid - { - Uid::wildcard() - } + type UidsArray: Array<Uid>; + + fn uids() -> Self::UidsArray; +} + +macro_rules! impl_with_uid_tuple { + ($c: tt) => { + seq!(I in 0..=$c { + impl<#(WithUid~I: With,)*> WithUidTuple for (#(WithUid~I,)*) + { + type UidsArray = [Uid; $c + 1]; + + fn uids() -> Self::UidsArray + { + [#(WithUid~I::uid(),)*] + } + } + }); + }; } + +seq!(C in 0..=16 { + impl_with_uid_tuple!(C); +}); |
