1use core::any::Any;
2
3pub trait Dyn: Any {
6 fn as_any(&self) -> &dyn Any;
7 fn as_any_mut(&mut self) -> &mut dyn Any;
8 fn as_any_box(self: Box<Self>) -> Box<dyn Any>;
9}
10
11impl<T: Any> Dyn for T {
12 #[inline(always)]
13 fn as_any(&self) -> &dyn Any {
14 self
15 }
16
17 #[inline(always)]
18 fn as_any_mut(&mut self) -> &mut dyn Any {
19 self
20 }
21
22 #[inline(always)]
23 fn as_any_box(self: Box<Self>) -> Box<dyn Any> {
24 self
25 }
26}
27
28#[doc(hidden)]
29pub trait Fat<T: ?Sized>: AsRef<T> + Sized {
30 fn into_box(self, f: impl FnOnce(Self) -> *mut ()) -> Box<T> {
31 let mut fat_ptr = self.as_ref() as *const T;
32 let data_ptr = &mut fat_ptr as *mut *const T as *mut *mut ();
33 unsafe {
34 *data_ptr = f(self);
35 Box::from_raw(fat_ptr as *mut T)
36 }
37 }
38
39 fn to_box(self, f: impl FnOnce(&T) -> *mut ()) -> Box<T> {
40 let mut fat_ptr = self.as_ref() as *const T;
41 let data_ptr = &mut fat_ptr as *mut *const T as *mut *mut ();
42 unsafe {
43 *data_ptr = f(self.as_ref());
44 Box::from_raw(fat_ptr as *mut T)
45 }
46 }
47}
48
49impl<T: ?Sized, R: AsRef<T>> Fat<T> for R {}