1use std::{
2 fmt::Debug,
3 ops::{Deref, DerefMut},
4};
5
6use bytemuck::Zeroable;
7
8use crate::alloc::{allocate_zeroed_vec, HugePageMemory};
9
10pub trait Buf<T>: Default + Debug + Deref<Target = [T]> + DerefMut + Send + Sync + 'static {
11 fn zeroed(len: usize) -> Self;
12
13 fn capacity(&self) -> usize;
14
15 fn set_len(&mut self, new_len: usize);
19
20 fn grow_zeroed(&mut self, new_size: usize);
21}
22
23impl<T: Zeroable + Clone + Default + Debug + Send + Sync + 'static> Buf<T> for Vec<T> {
24 fn zeroed(len: usize) -> Self {
25 allocate_zeroed_vec(len)
26 }
27
28 fn capacity(&self) -> usize {
29 self.capacity()
30 }
31
32 fn set_len(&mut self, new_len: usize) {
33 assert!(new_len <= self.capacity());
34 unsafe {
39 self.set_len(new_len);
40 }
41 }
42
43 fn grow_zeroed(&mut self, new_size: usize) {
44 self.resize(new_size, T::zeroed());
45 }
46}
47
48impl<T: Zeroable + Clone + Default + Debug + Send + Sync + 'static> Buf<T> for HugePageMemory<T> {
49 fn zeroed(len: usize) -> Self {
50 HugePageMemory::zeroed(len)
51 }
52
53 fn capacity(&self) -> usize {
54 self.capacity()
55 }
56
57 fn set_len(&mut self, new_len: usize) {
58 self.set_len(new_len);
59 }
60
61 fn grow_zeroed(&mut self, new_size: usize) {
62 self.grow_zeroed(new_size);
63 }
64}
65
66#[cfg(test)]
67mod tests {
68 use super::*;
69
70 #[test]
71 fn test_buf() {
72 let buf = Vec::<u8>::zeroed(1024);
73 assert_eq!(buf.len(), 1024);
74 assert!(buf.iter().all(|&x| x == 0));
75 }
76}