mod sealed {
pub trait Sealed {}
}
pub trait StableTuple: sealed::Sealed {}
impl sealed::Sealed for () {}
impl StableTuple for () {}
macro_rules! impl_stable_tuple {
($($T:ident),+) => {
impl<$($T),+> sealed::Sealed for ($($T,)+) {}
impl<$($T),+> StableTuple for ($($T,)+) {}
};
}
impl_stable_tuple!(T0);
impl_stable_tuple!(T0, T1);
impl_stable_tuple!(T0, T1, T2);
impl_stable_tuple!(T0, T1, T2, T3);
impl_stable_tuple!(T0, T1, T2, T3, T4);
impl_stable_tuple!(T0, T1, T2, T3, T4, T5);
impl_stable_tuple!(T0, T1, T2, T3, T4, T5, T6);
impl_stable_tuple!(T0, T1, T2, T3, T4, T5, T6, T7);
impl_stable_tuple!(T0, T1, T2, T3, T4, T5, T6, T7, T8);
impl_stable_tuple!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9);
pub trait StableFn<Args> {
type Output;
fn call(&self, args: Args) -> Self::Output;
}
impl<F, R> StableFn<()> for F
where
F: Fn() -> R,
{
type Output = R;
fn call(&self, _args: ()) -> R {
(self)()
}
}
macro_rules! impl_stable_fn {
($($T:ident),+) => {
#[allow(non_snake_case)]
impl<Func, R, $($T),+> StableFn<($($T,)+)> for Func
where
Func: Fn($($T),+) -> R,
{
type Output = R;
fn call(&self, ($($T,)+): ($($T,)+)) -> R {
(self)($($T),+)
}
}
};
}
impl_stable_fn!(T0);
impl_stable_fn!(T0, T1);
impl_stable_fn!(T0, T1, T2);
impl_stable_fn!(T0, T1, T2, T3);
impl_stable_fn!(T0, T1, T2, T3, T4);
impl_stable_fn!(T0, T1, T2, T3, T4, T5);
impl_stable_fn!(T0, T1, T2, T3, T4, T5, T6);
impl_stable_fn!(T0, T1, T2, T3, T4, T5, T6, T7);
impl_stable_fn!(T0, T1, T2, T3, T4, T5, T6, T7, T8);
impl_stable_fn!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9);