use crate::Meta;
use crate::ptr_metadata::*;
use std::any::TypeId;
use std::mem::transmute;
pub trait TypedMetadata {
fn from_meta(meta: Meta) -> Self;
fn into_meta<Data: 'static>(self) -> Meta;
}
impl TypedMetadata for () {
fn from_meta(meta: Meta) -> Self {
assert_eq!(meta.meta_id, TypeId::of::<()>(), "Wrong Metadata type");
}
fn into_meta<Data: 'static>(self) -> Meta {
Meta {
meta_raw: 0,
data_id: TypeId::of::<Data>(),
meta_id: TypeId::of::<Self>(),
}
}
}
impl<T> TypedMetadata for DynMetadata<T>
where
T: Pointee<Metadata = Self> + ?Sized + 'static,
{
fn from_meta(meta: Meta) -> Self {
assert_eq!(meta.meta_id, TypeId::of::<Self>(), "Wrong Metadata type");
let typed_meta: Self = unsafe { transmute(meta.meta_raw) };
typed_meta
}
fn into_meta<Data: 'static>(self) -> Meta {
let meta_raw: usize = unsafe { transmute(self) };
Meta {
meta_raw,
data_id: TypeId::of::<Data>(),
meta_id: TypeId::of::<Self>(),
}
}
}