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
use from_raw_parts;
/// Virtual method table pointer
/// ```
/// #[repr(C)]
/// struct ActualVmt {
/// f1: extern fn() -> i32,
/// f2: extern fn(i32, i32) -> f64,
/// zero: usize,
/// }
///
/// extern fn dummy1() -> i32 { 0 }
/// extern fn dummy2(_: i32, _: i32) -> f64 { 0. }
///
/// #[repr(C)]
/// struct Obj {
/// vmt: *const ActualVmt
/// }
///
/// let obj = Box::into_raw(Box::new(Obj {
/// vmt: Box::into_raw(Box::new(ActualVmt {
/// f1: dummy1,
/// f2: dummy2,
/// zero: 0
/// })) as _,
/// }));
///
/// use memflex::types::VmtPtr;
/// #[repr(C)]
/// struct ObjFlex {
/// vmt: VmtPtr
/// }
///
/// # unsafe {
/// let obj_flex: &ObjFlex = &*(obj as *const Obj as *const ObjFlex);
/// assert_eq!(obj_flex.vmt.at::<extern fn(i32, i32) -> f32>(1) as usize, dummy2 as usize);
/// # }
/// ```