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
macro_rules! define_handle {
(
$(#[$attr_name:meta])*
type $name:ident;
$(#[$attr_opaque:meta])*
struct $opaque:ident;
) => (
$( #[$attr_opaque] )*
#[repr(C)]
pub struct $opaque(::libc::c_void);
$( #[$attr_name] )*
pub type $name = *mut $opaque;
)
}
macro_rules! define_non_dispatchable_handle {
(
$(#[$attr:meta])*
struct $name:ident;
) => (
$( #[$attr] )*
#[repr(C)]
#[derive(Debug, Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct $name(u64);
impl $name {
#[inline]
pub fn null() -> Self {
Default::default()
}
#[inline]
pub fn is_null(&self) -> bool {
self.0 == 0
}
#[inline]
pub fn id(&self) -> u64 {
self.0
}
}
)
}