1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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)
}
}