cryprot_core/
buf.rs

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    /// Sets the length of the buffer
16    /// # Panic
17    /// Panics if `len > self.capacity`.
18    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        // SAFETY:
35        // new_len <= self.capacity
36        // self[len..new_len] is initialized either because of Self::zeroed
37        // or with data written to it.
38        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}