multi_any/
typed_metadata.rs1use crate::Meta;
2use crate::ptr_metadata::*;
3use std::any::TypeId;
4use std::mem::transmute;
5
6pub trait TypedMetadata {
10 fn from_meta(meta: Meta) -> Self;
12
13 fn into_meta<Data: 'static>(self) -> Meta;
15}
16
17impl TypedMetadata for () {
18 fn from_meta(meta: Meta) -> Self {
19 assert_eq!(meta.meta_id, TypeId::of::<()>(), "Wrong Metadata type");
20 }
21
22 fn into_meta<Data: 'static>(self) -> Meta {
23 Meta {
24 meta_raw: 0,
25 data_id: TypeId::of::<Data>(),
26 meta_id: TypeId::of::<Self>(),
27 }
28 }
29}
30
31impl<T> TypedMetadata for DynMetadata<T>
32where
33 T: Pointee<Metadata = Self> + ?Sized + 'static,
34{
35 fn from_meta(meta: Meta) -> Self {
36 assert_eq!(meta.meta_id, TypeId::of::<Self>(), "Wrong Metadata type");
37
38 let typed_meta: Self = unsafe { transmute(meta.meta_raw) };
42
43 typed_meta
44 }
45
46 fn into_meta<Data: 'static>(self) -> Meta {
47 let meta_raw: usize = unsafe { transmute(self) };
51
52 Meta {
53 meta_raw,
54 data_id: TypeId::of::<Data>(),
55 meta_id: TypeId::of::<Self>(),
56 }
57 }
58}