use crate::{
TraitImplMeta, TraitImplRegistry, TraitQuery, TraitQueryMarker, dyn_constructor::DynCtor,
};
use bevy_ecs::prelude::{Component, World};
pub trait RegisterExt {
fn register_component_as<Trait: ?Sized + TraitQuery, C: Component>(&mut self) -> &mut Self
where
(C,): TraitQueryMarker<Trait, Covered = C>;
}
impl RegisterExt for World {
fn register_component_as<Trait: ?Sized + TraitQuery, C: Component>(&mut self) -> &mut Self
where
(C,): TraitQueryMarker<Trait, Covered = C>,
{
let component_id = self.register_component::<C>();
let registry = self
.get_resource_or_insert_with::<TraitImplRegistry<Trait>>(Default::default)
.into_inner();
let meta = TraitImplMeta {
size_bytes: core::mem::size_of::<C>(),
dyn_ctor: DynCtor { cast: <(C,)>::cast },
};
registry.register::<C>(component_id, meta);
self
}
}
#[cfg(feature = "bevy_app")]
impl RegisterExt for bevy_app::App {
fn register_component_as<Trait: ?Sized + TraitQuery, C: Component>(&mut self) -> &mut Self
where
(C,): TraitQueryMarker<Trait, Covered = C>,
{
self.world_mut().register_component_as::<Trait, C>();
self
}
}