pub unsafe trait FnPtr: Copy {
fn addr(self) -> *const ();
}
macro_rules! make_fn_trait_impls {
([no_variadic] $($ty:ident)*) => {
unsafe impl<$($ty ,)* R> FnPtr for unsafe extern "C" fn($($ty,)*) -> R {
fn addr(self) -> *const () {
self as *const ()
}
}
unsafe impl<$($ty ,)* R> FnPtr for extern "C" fn($($ty,)*) -> R {
fn addr(self) -> *const () {
self as *const ()
}
}
};
($($ty:ident)*) => {
unsafe impl<$($ty ,)* R> FnPtr for unsafe extern "C" fn($($ty,)*) -> R {
fn addr(self) -> *const () {
self as *const ()
}
}
unsafe impl<$($ty ,)* R> FnPtr for extern "C" fn($($ty,)*) -> R {
fn addr(self) -> *const () {
self as *const ()
}
}
unsafe impl<$($ty ,)* R> FnPtr for unsafe extern "C" fn($($ty,)* ...) -> R {
fn addr(self) -> *const () {
self as *const ()
}
}
unsafe impl<$($ty ,)* R> FnPtr for extern "C" fn($($ty,)* ...) -> R {
fn addr(self) -> *const () {
self as *const ()
}
}
};
}
make_fn_trait_impls!([no_variadic]);
make_fn_trait_impls!(A);
make_fn_trait_impls!(A B);
make_fn_trait_impls!(A B C);
make_fn_trait_impls!(A B C D);
make_fn_trait_impls!(A B C D E);
make_fn_trait_impls!(A B C D E F);
make_fn_trait_impls!(A B C D E F G);
make_fn_trait_impls!(A B C D E F G H);
make_fn_trait_impls!(A B C D E F G H I);
make_fn_trait_impls!(A B C D E F G H I J);