2023-12-09 16:40:41 +00:00
|
|
|
use std::{any::{TypeId, type_name}, alloc::{Layout, LayoutError}};
|
|
|
|
|
2023-12-09 17:23:10 +00:00
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
2023-12-09 16:40:41 +00:00
|
|
|
pub struct MemoryLayout {
|
|
|
|
pub size: usize,
|
|
|
|
pub alignment: usize
|
|
|
|
}
|
|
|
|
|
|
|
|
impl TryInto<Layout> for MemoryLayout {
|
|
|
|
type Error = LayoutError;
|
|
|
|
|
|
|
|
fn try_into(self) -> Result<Layout, Self::Error> {
|
|
|
|
Layout::from_size_align(self.size, self.alignment)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<Layout> for MemoryLayout {
|
|
|
|
fn from(value: Layout) -> Self {
|
|
|
|
Self {
|
|
|
|
size: value.size(),
|
|
|
|
alignment: value.align(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl MemoryLayout {
|
|
|
|
pub fn new(size: usize, alignment: usize) -> Self {
|
|
|
|
MemoryLayout {
|
|
|
|
size,
|
|
|
|
alignment
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub unsafe fn into_layout_unchecked(self) -> Layout {
|
|
|
|
Layout::from_size_align_unchecked(self.size, self.alignment)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// 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 Into<DynTypeId> for u128 {
|
|
|
|
fn into(self) -> DynTypeId {
|
|
|
|
DynTypeId::Unknown(self)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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>())
|
|
|
|
}
|
|
|
|
}
|
2023-11-25 23:43:11 +00:00
|
|
|
|
2023-12-09 17:23:10 +00:00
|
|
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
2023-11-25 23:43:11 +00:00
|
|
|
pub struct ComponentInfo {
|
2023-12-09 16:40:41 +00:00
|
|
|
pub type_id: DynTypeId,
|
2023-11-25 23:43:11 +00:00
|
|
|
pub name: String,
|
2023-12-09 16:40:41 +00:00
|
|
|
pub layout: MemoryLayout,
|
2023-11-25 23:43:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl ComponentInfo {
|
|
|
|
pub fn new<T: 'static>() -> Self {
|
|
|
|
Self {
|
2023-12-09 16:40:41 +00:00
|
|
|
type_id: DynTypeId::from(TypeId::of::<T>()),
|
2023-11-25 23:43:11 +00:00
|
|
|
name: type_name::<T>().to_string(),
|
2023-12-09 16:40:41 +00:00
|
|
|
layout: MemoryLayout::from(Layout::new::<T>()),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Create ComponentInfo from a type that is not known to rust
|
|
|
|
pub fn new_unknown<D>(type_id: D, name: &str, layout: MemoryLayout) -> Self
|
|
|
|
where
|
|
|
|
D: Into<DynTypeId>,
|
|
|
|
{
|
|
|
|
Self {
|
|
|
|
type_id: type_id.into(),
|
|
|
|
name: name.to_string(),
|
|
|
|
layout,
|
2023-11-25 23:43:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|