1/// Takes an `Option<&mut Vec<T>>` style buffer and gets its pointer.
2macro_rules! map_ptr {
3 ($buffer:expr) => {
4 match $buffer {
5 Some(b) => b.as_ptr() as _,
6 None => 0 as _,
7 }
8 };
9}
10
11/// Takes an `Option<&mut Vec<T>>` style buffer and gets its allocated length.
12macro_rules! map_len {
13 ($buffer:expr) => {
14 match $buffer {
15 Some(b) => b.capacity() as _,
16 None => 0,
17 }
18 };
19}
20
21/// Takes an `Option<&mut Vec<T>>` style buffer and reserves space.
22macro_rules! map_reserve {
23 ($buffer:expr, $size:expr) => {
24 match $buffer {
25 Some(ref mut b) => crate::utils::map_reserve_inner(b, $size),
26 _ => (),
27 }
28 };
29}
30
31pub(crate) fn map_reserve_inner<T>(b: &mut Vec<T>, size: usize) {
32 let old_len: usize = b.len();
33 if size <= old_len {
34 return;
35 }
36 b.reserve_exact(additional:size - old_len);
37
38 // `memset` to 0, at least so Valgrind doesn't complain
39 unsafe {
40 let ptr: *mut u8 = b.as_mut_ptr().add(count:old_len) as *mut u8;
41 ptr.write_bytes(val:0, (size - old_len) * std::mem::size_of::<T>());
42 }
43}
44
45/// Takes an `Option<&mut Vec<T>>` style buffer and shrinks it.
46macro_rules! map_set {
47 ($buffer:expr, $min:expr) => {
48 match $buffer {
49 Some(ref mut b) => unsafe { b.set_len($min) },
50 _ => (),
51 }
52 };
53}
54