use std::marker::PhantomData; use std::mem::size_of; use crate::api; use crate::system::{DynSystemCard, SystemCard}; pub struct SystemHandle { pub(crate) _card: PhantomData, pub(crate) id: api::SysId, } impl SystemHandle { pub(crate) fn new(id: api::SysId) -> Self { Self { _card: PhantomData, id } } pub fn id(&self) -> api::SysId { self.id } } impl Clone for SystemHandle { fn clone(&self) -> Self { Self::new(self.id) } } pub trait DynSystemHandle { fn id(&self) -> api::SysId; fn get_card(&self) -> &dyn DynSystemCard; } pub fn leak_card() -> &'static T { const { if 0 != size_of::() { panic!("Attempted to leak positively sized Card. Card types must always be zero-sized"); } } Box::leak(Box::default()) } impl DynSystemHandle for SystemHandle { fn id(&self) -> api::SysId { self.id } fn get_card(&self) -> &'static dyn DynSystemCard { leak_card::() } }