use std::mem::size_of;
fn vec_with_size_in_bytes<T: Default>(size_in_bytes: usize) -> Vec<T> {
let rounded_size = (size_in_bytes + size_of::<T>() - 1) / size_of::<T>();
let mut v = Vec::with_capacity(rounded_size);
for _ in 0..rounded_size {
v.push(T::default())
}
v
}
pub(crate) fn vec_with_array_field<T: Default, F>(count: usize) -> Vec<T> {
let element_space = match count.checked_mul(size_of::<F>()) {
None => panic!("allocating too large buffer with vec_with_array_field"),
Some(v) => v,
};
let vec_size_bytes = match element_space.checked_add(size_of::<T>()) {
None => panic!("allocating too large buffer with vec_with_array_field"),
Some(v) => v,
};
vec_with_size_in_bytes(vec_size_bytes)
}
#[cfg(test)]
mod tests {
use super::*;
#[derive(Default)]
#[allow(dead_code)]
struct Header {
ty: u32,
len: u32,
}
#[allow(dead_code)]
struct Field {
f1: u64,
f2: u64,
}
#[test]
fn test_vec_with_array_field() {
let v1 = vec_with_array_field::<Header, Field>(1);
assert_eq!(v1.len(), 3);
let v2 = vec_with_array_field::<Header, Field>(0);
assert_eq!(v2.len(), 1);
let v3 = vec_with_array_field::<Header, Field>(5);
assert_eq!(v3.len(), 11);
}
#[test]
#[should_panic]
fn test_vec_with_array_field_overflow() {
let _ = vec_with_array_field::<Header, Field>(usize::MAX);
}
}