blob: 8788880bbd5f667a95db73e4d7c71c4be74a9d3d [file] [log] [blame]
/// Takes an `Option<&mut Vec<T>>` style buffer and gets its pointer.
macro_rules! map_ptr {
($buffer:expr) => {
match $buffer {
Some(b) => b.as_ptr() as _,
None => 0 as _,
}
};
}
/// Takes an `Option<&mut Vec<T>>` style buffer and gets its allocated length.
macro_rules! map_len {
($buffer:expr) => {
match $buffer {
Some(b) => b.capacity() as _,
None => 0,
}
};
}
/// Takes an `Option<&mut Vec<T>>` style buffer and reserves space.
macro_rules! map_reserve {
($buffer:expr, $size:expr) => {
match $buffer {
Some(ref mut b) => crate::utils::map_reserve_inner(b, $size),
_ => (),
}
};
}
pub(crate) fn map_reserve_inner<T>(b: &mut Vec<T>, size: usize) {
let old_len = b.len();
if size <= old_len {
return;
}
b.reserve_exact(size - old_len);
// `memset` to 0, at least so Valgrind doesn't complain
unsafe {
let ptr = b.as_mut_ptr().add(old_len) as *mut u8;
ptr.write_bytes(0, (size - old_len) * std::mem::size_of::<T>());
}
}
/// Takes an `Option<&mut Vec<T>>` style buffer and shrinks it.
macro_rules! map_set {
($buffer:expr, $min:expr) => {
match $buffer {
Some(ref mut b) => unsafe { b.set_len($min) },
_ => (),
}
};
}