dyn_std/
any.rs

1use core::any::Any;
2
3/// This trait is the base trait for most of `dyn_std` traits,
4/// and adds methods to retrieve a `&dyn Any`.
5pub 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 {}