1use alloc::boxed::Box;
4use alloc::vec::Vec;
5
6use crate::{__rt, JsValue, ScopedClosure};
7
8unsafe impl __rt::marker::ErasableGeneric for JsValue {
9 type Repr = JsValue;
10}
11
12macro_rules! impl_erasable_generic_self {
13 ($($ty:ty),* $(,)?) => {
14 $(
15 unsafe impl __rt::marker::ErasableGeneric for $ty {
16 type Repr = $ty;
17 }
18 )*
19 };
20}
21
22impl_erasable_generic_self!(
23 (),
24 bool,
25 char,
26 f32,
27 f64,
28 i8,
29 i16,
30 i32,
31 i64,
32 i128,
33 isize,
34 u8,
35 u16,
36 u32,
37 u64,
38 u128,
39 usize,
40);
41
42unsafe impl<T: __rt::marker::ErasableGeneric> __rt::marker::ErasableGeneric for Option<T> {
43 type Repr = Option<T::Repr>;
44}
45
46unsafe impl<T: __rt::marker::ErasableGeneric, E: __rt::marker::ErasableGeneric>
47 __rt::marker::ErasableGeneric for Result<T, E>
48{
49 type Repr = Result<T::Repr, E::Repr>;
50}
51
52unsafe impl<T: __rt::marker::ErasableGeneric> __rt::marker::ErasableGeneric for Vec<T> {
53 type Repr = Vec<T::Repr>;
54}
55
56unsafe impl<T: __rt::marker::ErasableGeneric> __rt::marker::ErasableGeneric for Box<[T]> {
57 type Repr = Box<[T::Repr]>;
58}
59
60unsafe impl __rt::marker::ErasableGeneric for &str {
61 type Repr = &'static str;
62}
63
64unsafe impl<T: __rt::marker::ErasableGeneric> __rt::marker::ErasableGeneric for &[T] {
65 type Repr = &'static [T::Repr];
66}
67
68unsafe impl<T: __rt::marker::ErasableGeneric> __rt::marker::ErasableGeneric for &mut [T] {
69 type Repr = &'static mut [T::Repr];
70}
71
72unsafe impl<T: ?Sized> __rt::marker::ErasableGeneric for ScopedClosure<'_, T> {
73 type Repr = ScopedClosure<'static, dyn FnMut()>;
74}
75
76macro_rules! impl_fn_ref_erasable_generic {
77 ($($arg:ident),* $(,)?) => {
78 unsafe impl<'a, R, $($arg,)*> __rt::marker::ErasableGeneric
79 for &'a (dyn Fn($($arg),*) -> R + 'a)
80 where
81 $($arg: __rt::marker::ErasableGeneric,)*
82 R: __rt::marker::ErasableGeneric,
83 {
84 type Repr = &'static (dyn Fn($($arg::Repr),*) -> R::Repr + 'static);
85 }
86
87 unsafe impl<'a, R, $($arg,)*> __rt::marker::ErasableGeneric
88 for &'a mut (dyn Fn($($arg),*) -> R + 'a)
89 where
90 $($arg: __rt::marker::ErasableGeneric,)*
91 R: __rt::marker::ErasableGeneric,
92 {
93 type Repr = &'static mut (dyn Fn($($arg::Repr),*) -> R::Repr + 'static);
94 }
95
96 unsafe impl<'a, R, $($arg,)*> __rt::marker::ErasableGeneric
97 for &'a (dyn FnMut($($arg),*) -> R + 'a)
98 where
99 $($arg: __rt::marker::ErasableGeneric,)*
100 R: __rt::marker::ErasableGeneric,
101 {
102 type Repr = &'static (dyn FnMut($($arg::Repr),*) -> R::Repr + 'static);
103 }
104
105 unsafe impl<'a, R, $($arg,)*> __rt::marker::ErasableGeneric
106 for &'a mut (dyn FnMut($($arg),*) -> R + 'a)
107 where
108 $($arg: __rt::marker::ErasableGeneric,)*
109 R: __rt::marker::ErasableGeneric,
110 {
111 type Repr = &'static mut (dyn FnMut($($arg::Repr),*) -> R::Repr + 'static);
112 }
113 };
114}
115
116impl_fn_ref_erasable_generic!();
117impl_fn_ref_erasable_generic!(A1);
118impl_fn_ref_erasable_generic!(A1, A2);
119impl_fn_ref_erasable_generic!(A1, A2, A3);
120impl_fn_ref_erasable_generic!(A1, A2, A3, A4);
121impl_fn_ref_erasable_generic!(A1, A2, A3, A4, A5);
122impl_fn_ref_erasable_generic!(A1, A2, A3, A4, A5, A6);
123impl_fn_ref_erasable_generic!(A1, A2, A3, A4, A5, A6, A7);
124impl_fn_ref_erasable_generic!(A1, A2, A3, A4, A5, A6, A7, A8);