pub trait TransferExt: Sized
{
fn new<TD: TransferableData, S: Sized + Deref<Target=Stack>>(stack: S, context_function: ContextFn, initial_data_to_transfer: TD) -> (S, Self);
fn transferred_data<TD: TransferableData>(&self) -> TD;
fn resume<TD: TransferableData>(&mut self, data_to_transfer: TD);
fn resume_on_top<TD: TransferableData>(&mut self, data_to_transfer: TD, resume_on_top_function: ResumeOnTopFunction);
#[doc(hidden)]
#[inline(always)]
unsafe fn context(&mut self) -> Context;
}
impl TransferExt for Transfer
{
#[inline(always)]
fn new<TD: TransferableData, S: Sized + Deref<Target=Stack>>(stack: S, context_function: ContextFn, initial_data_to_transfer: TD) -> (S, Self)
{
let transfer = Transfer::new(unsafe { Context::new(stack.deref(), context_function) }, initial_data_to_transfer.into_usize());
(stack, transfer)
}
#[inline(always)]
fn transferred_data<TD: TransferableData>(&self) -> TD
{
TD::from_usize(self.data)
}
#[inline(always)]
fn resume<TD: TransferableData>(&mut self, data_to_transfer: TD)
{
*self = unsafe { self.context().resume(data_to_transfer.into_usize()) };
}
#[inline(always)]
fn resume_on_top<TD: TransferableData>(&mut self, data_to_transfer: TD, resume_on_top_function: ResumeOnTopFunction)
{
*self = unsafe { self.context().resume_ontop(data_to_transfer.into_usize(), resume_on_top_function) };
}
#[doc(hidden)]
#[inline(always)]
unsafe fn context(&mut self) -> Context
{
read(&mut self.context)
}
}