dyn_std/
inst.rs

1use core::marker::PhantomData;
2
3use crate::Dyn;
4
5pub struct Instance<T, U>(pub T, PhantomData<U>);
6
7impl<T, U> Instance<T, U> {
8    pub fn new(value: T) -> Self {
9        Self(value, PhantomData)
10    }
11}
12
13impl<T: 'static, U: 'static> Instance<T, U> {
14    #[inline]
15    pub fn downcast_ref<D: Dyn + ?Sized>(v: &D) -> &T {
16        &v.as_any().downcast_ref::<Self>().unwrap().0
17    }
18
19    #[inline]
20    pub fn downcast_mut<D: Dyn + ?Sized>(v: &mut D) -> &mut T {
21        &mut v.as_any_mut().downcast_mut::<Self>().unwrap().0
22    }
23
24    #[inline]
25    pub fn downcast<D: Dyn + ?Sized>(v: Box<D>) -> T {
26        v.as_any_box().downcast::<Self>().unwrap().0
27    }
28}
29
30#[doc(hidden)]
31pub struct Constructor<T, U>(PhantomData<(T, U)>);
32
33impl<T, U> Constructor<T, U> {
34    pub fn new() -> Self {
35        Self(PhantomData)
36    }
37}
38
39impl<T, U> Default for Constructor<T, U> {
40    fn default() -> Self {
41        Self::new()
42    }
43}