#![allow(nonstandard_style)]
use super::*;
mod T { pub use crate::marker::Sendness::T as Sendness; }
generate!(_9 _8 _7 _6 _5 _4 _3 _2 _1 _0); macro_rules! generate {() => (); (
$_N:tt $($_K:tt)*
) => (generate! { $($_K)* } ::paste::paste! {
pub use [<FnOnce$_N>]::[<StackBoxDynFnOnce$_N>];
mod [<FnOnce$_N>] {
use super::*;
pub
struct [<StackBoxDynFnOnce$_N>] <
'frame, $(
[<$_K>], )*
Ret,
Sendness : ?Sized + T::Sendness = NoAutoTraits,
>
{
ptr: ptr::NonNull<ty::Erased>,
vtable: &'frame VTable<$([<$_K>] ,)* Ret>,
_is_send: ::core::marker::PhantomData<Sendness>,
}
struct VTable<$([<$_K>] ,)* Ret> {
drop_in_place: unsafe fn(ptr: ptr::NonNull<ty::Erased>),
call_once: unsafe fn(
ptr::NonNull<ty::Erased> $(,
[<$_K>] )*
) -> Ret,
}
impl<$([<$_K>], )* Ret, F> HasVTable<$([<$_K>] ,)* Ret> for F
where
Self : Sized + FnOnce($([<$_K>]),*) -> Ret,
{}
trait HasVTable<$([<$_K>] ,)* Ret>
where
Self : Sized + FnOnce($([<$_K>]),*) -> Ret,
{
const VTABLE: VTable<$([<$_K>] ,)* Ret> = VTable {
drop_in_place: {
unsafe
fn drop_in_place<Self_> (ptr: ptr::NonNull<ty::Erased>)
{
ptr::drop_in_place(ptr.cast::<Self_>().as_ptr())
}
drop_in_place::<Self>
},
call_once: {
unsafe
fn call_once<Self_, $([<$_K>] ,)* Ret> (
ptr: ptr::NonNull<ty::Erased> $(,
[</*arg*/$_K>]: [</*Arg*/$_K>] )*
) -> Ret
where
Self_ : FnOnce($([<$_K>]),*) -> Ret,
{
let f: StackBox<'_, Self_> = {
::core::mem::transmute(ptr)
};
let f: Self_ = StackBox::into_inner(f);
f($([<$_K>]),*)
}
call_once::<Self, $([<$_K>] ,)* Ret>
},
};
}
impl<'frame, $([<$_K>] ,)* Ret, F : 'frame>
DynCoerce<StackBox<'frame, F>>
for
[<StackBoxDynFnOnce$_N>]<'frame, $([<$_K>] ,)* Ret>
where
F : FnOnce($([<$_K>]),*) -> Ret,
{
#[inline]
fn fatten (it: StackBox<'frame, F>)
-> Self
{
[<StackBoxDynFnOnce$_N>] {
vtable: &<F as HasVTable<$([<$_K>] ,)* Ret>>::VTABLE,
ptr: unsafe { ::core::mem::transmute(it) },
_is_send: ::core::marker::PhantomData,
}
}
}
impl<'frame, $([<$_K>] ,)* Ret, F : 'frame>
DynCoerce<StackBox<'frame, F>>
for
[<StackBoxDynFnOnce$_N>]<'frame, $([<$_K>] ,)* Ret, dyn Send>
where
F : FnOnce($([<$_K>]),*) -> Ret,
F : Send,
{
#[inline]
fn fatten (it: StackBox<'frame, F>)
-> Self
{
[<StackBoxDynFnOnce$_N>] {
vtable: &<F as HasVTable<$([<$_K>] ,)* Ret>>::VTABLE,
ptr: unsafe { ::core::mem::transmute(it) },
_is_send: ::core::marker::PhantomData,
}
}
}
impl<'frame, $([<$_K>] ,)* Ret, Sendness : ?Sized + T::Sendness>
[<StackBoxDynFnOnce$_N>]<'frame, $([<$_K>] ,)* Ret, Sendness>
{
#[inline]
pub
fn call (
self: Self $(,
[</*arg*/$_K>]: [</*Arg*/$_K>] )*
) -> Ret
{
unsafe {
let Self { ptr, vtable, .. } =
*::core::mem::ManuallyDrop::new(self)
;
(vtable.call_once)(ptr, $([<$_K>]),*)
}
}
}
impl<'frame, $([<$_K>] ,)* Ret, Sendness : ?Sized + T::Sendness> Drop
for [<StackBoxDynFnOnce$_N>]<'frame, $([<$_K>] ,)* Ret, Sendness>
{
#[inline]
fn drop (self: &'_ mut Self)
{
unsafe {
(self.vtable.drop_in_place)(self.ptr)
}
}
}
unsafe impl<'frame, $([<$_K>] ,)* Ret, Sendness : ?Sized + T::Sendness>
Sync
for
[<StackBoxDynFnOnce$_N>]<'frame, $([<$_K>] ,)* Ret, Sendness>
{}
unsafe impl<'frame, $([<$_K>] ,)* Ret>
Send
for
[<StackBoxDynFnOnce$_N>]<'frame, $([<$_K>] ,)* Ret, dyn Send>
{}
}
})} use generate;