Skip to main content

wry_bindgen/
erasure.rs

1//! Runtime marker implementations for generic type erasure.
2
3use 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);