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
#[derive(Debug, Eq, PartialEq)]
pub struct VariablySized<T>(NonNull<T>, Layout);
impl<T> Drop for VariablySized<T>
{
#[inline(always)]
fn drop(&mut self)
{
let pointer = self.0.as_ptr() as *mut u8;
unsafe { dealloc(pointer, self.1) }
}
}
impl<T> Deref for VariablySized<T>
{
type Target = T;
#[inline(always)]
fn deref(&self) -> &Self::Target
{
unsafe { & * self.0.as_ptr() }
}
}
impl<T> DerefMut for VariablySized<T>
{
#[inline(always)]
fn deref_mut(&mut self) -> &mut Self::Target
{
unsafe { &mut * self.0.as_ptr() }
}
}
impl<T> VariablySized<T>
{
#[inline(always)]
pub fn allocate_zeroed(size: usize) -> Self
{
let layout = unsafe { Layout::from_size_align_unchecked(size, 8) };
let pointer = unsafe { alloc_zeroed(layout.clone()) };
Self(new_non_null(pointer as *mut T), layout)
}
#[inline(always)]
pub fn zero(&mut self)
{
let pointer = self.0.as_ptr();
unsafe { write_bytes(pointer, 0x00, self.1.size()) }
}
}