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}