lyra-engine/lyra-ecs/src/component_info.rs

80 lines
1.9 KiB
Rust
Raw Normal View History

2024-03-03 02:20:19 +00:00
use std::{any::TypeId, alloc::Layout};
/// A dynamic type id. Supports types that are not known to Rust.
#[derive(Clone, Copy, Hash, Debug, PartialEq, Eq)]
pub enum DynTypeId {
Rust(TypeId),
Unknown(u128),
}
impl From<u128> for DynTypeId {
fn from(val: u128) -> Self {
DynTypeId::Unknown(val)
}
}
impl From<TypeId> for DynTypeId {
fn from(val: TypeId) -> Self {
DynTypeId::Rust(val)
}
}
/* impl From<TypeId> for DynTypeId {
fn from(value: TypeId) -> Self {
DynTypeId::Rust(value)
}
} */
impl DynTypeId {
pub fn of<T: 'static>() -> Self {
Self::Rust(TypeId::of::<T>())
}
pub fn is<T: 'static>(&self) -> bool {
match self {
DynTypeId::Rust(tyid) => *tyid == TypeId::of::<T>(),
DynTypeId::Unknown(_) => false,
}
}
pub fn is_id<I: Into<DynTypeId>>(&self, id: I) -> bool {
let id = id.into();
*self == id
}
/// Force self into a rust TypeId, will panic if this type is not a Rust type.
pub fn as_rust(&self) -> TypeId {
match self {
DynTypeId::Rust(t) => *t,
DynTypeId::Unknown(_) => panic!("This type is unknown to rust, cannot construct a TypeId from it!"),
}
}
}
2023-11-25 23:43:11 +00:00
2024-03-03 02:20:19 +00:00
/// Some information about a component.
2023-12-09 19:39:01 +00:00
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
2023-11-25 23:43:11 +00:00
pub struct ComponentInfo {
pub type_id: DynTypeId,
2024-03-03 02:20:19 +00:00
pub(crate) layout: Layout,
2023-11-25 23:43:11 +00:00
}
impl ComponentInfo {
pub fn new<T: 'static>() -> Self {
Self {
type_id: TypeId::of::<T>().into(),
2024-03-03 02:20:19 +00:00
layout: Layout::new::<T>(),
}
}
/// Create ComponentInfo from a type that is not known to rust
2024-03-03 02:20:19 +00:00
pub fn new_unknown<D>(type_id: D, name: &str, layout: Layout) -> Self
where
D: Into<DynTypeId>,
{
let _ = name; // would be used at some point
Self {
type_id: type_id.into(),
layout,
2023-11-25 23:43:11 +00:00
}
}
}