jsbind/
utils.rs

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                // assumes `$crate::prelude::Any::instance_of(&ctor)` exists
67                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>() // zero-cost new-type cast
73            }
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                // assumes `$crate::prelude::Any::instance_of(&ctor)` exists
89                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>() // zero-cost new-type cast
95            }
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;