1macro_rules! bind {
2 ($i:ident) => {
3 impl emlite::FromVal for $i {
4 fn from_val(v: &$crate::prelude::Any) -> Self {
5 $i { inner: v.clone() }
6 }
7 fn take_ownership(v: emlite::common::Handle) -> Self {
8 Self::from_val(&$crate::prelude::Any::take_ownership(v))
9 }
10 fn as_handle(&self) -> emlite::common::Handle {
11 self.inner.as_handle()
12 }
13 }
14
15 impl core::ops::Deref for $i {
16 type Target = $crate::prelude::Any;
17
18 fn deref(&self) -> &Self::Target {
19 &self.inner
20 }
21 }
22
23 impl core::ops::DerefMut for $i {
24 fn deref_mut(&mut self) -> &mut Self::Target {
25 &mut self.inner
26 }
27 }
28
29 impl AsRef<$crate::prelude::Any> for $i {
30 fn as_ref(&self) -> &$crate::prelude::Any {
31 &self.inner
32 }
33 }
34
35 impl AsMut<$crate::prelude::Any> for $i {
36 fn as_mut(&mut self) -> &mut $crate::prelude::Any {
37 &mut self.inner
38 }
39 }
40
41 impl From<$i> for $crate::prelude::Any {
42 fn from(x: $i) -> $crate::prelude::Any {
43 use emlite::FromVal;
44 let handle = x.inner.as_handle();
45 core::mem::forget(x);
46 $crate::prelude::Any::take_ownership(handle)
47 }
48 }
49
50 impl From<&$i> for $crate::prelude::Any {
51 fn from(x: &$i) -> $crate::prelude::Any {
52 x.inner.clone()
53 }
54 }
55 };
56}
57
58pub(crate) use bind;
59
60#[macro_export]
61macro_rules! impl_dyn_cast {
62 ($ty:ty) => {
63 impl $crate::prelude::DynCast for $ty {
64 #[inline]
65 fn instanceof(val: &$crate::prelude::Any) -> bool {
66 let ctor = $crate::prelude::Any::global(stringify!($ty));
68 val.instanceof(ctor)
69 }
70 #[inline]
71 fn unchecked_from_val(v: $crate::prelude::Any) -> Self {
72 v.as_::<Self>() }
74 #[inline]
75 fn unchecked_from_val_ref(v: &$crate::prelude::Any) -> &Self {
76 unsafe { &*(v as *const $crate::prelude::Any as *const Self) }
77 }
78 #[inline]
79 fn unchecked_from_val_mut(v: &mut $crate::prelude::Any) -> &mut Self {
80 unsafe { &mut *(v as *mut $crate::prelude::Any as *mut Self) }
81 }
82 }
83 };
84 ($ty:ty, $global_ctor:expr) => {
85 impl $crate::prelude::DynCast for $ty {
86 #[inline]
87 fn instanceof(val: &$crate::prelude::Any) -> bool {
88 let ctor = $crate::prelude::Any::global($global_ctor);
90 val.instanceof(ctor)
91 }
92 #[inline]
93 fn unchecked_from_val(v: $crate::prelude::Any) -> Self {
94 v.as_::<Self>() }
96 #[inline]
97 fn unchecked_from_val_ref(v: &$crate::prelude::Any) -> &Self {
98 unsafe { &*(v as *const $crate::prelude::Any as *const Self) }
99 }
100 #[inline]
101 fn unchecked_from_val_mut(v: &mut $crate::prelude::Any) -> &mut Self {
102 unsafe { &mut *(v as *mut $crate::prelude::Any as *mut Self) }
103 }
104 }
105 };
106}
107
108pub use impl_dyn_cast;