use crate::error::Result;
pub trait FrameBuffer {
type BufferSlice: AsMut<[u8]> + AsRef<[u8]> + Truncate;
fn allocate(&mut self, size: usize) -> Result<&mut Self::BufferSlice>;
}
pub trait Truncate {
fn truncate(&mut self, _len: usize) {
}
}
impl FrameBuffer for Vec<u8> {
type BufferSlice = Self;
fn allocate(&mut self, size: usize) -> Result<&mut Self::BufferSlice> {
log::trace!("Allocating buffer of size {size}");
self.resize(size, 0);
Ok(self)
}
}
impl Truncate for Vec<u8> {
fn truncate(&mut self, len: usize) {
self.truncate(len);
}
}
#[cfg(test)]
mod test {
use super::FrameBuffer;
use pretty_assertions::assert_eq;
#[test]
fn allocate_vec_buffer() {
let mut buf = vec![42u8];
let allocated: &mut [u8] = buf.allocate(3).unwrap();
allocated.fill_with(|| 6u8);
assert_eq!(buf.len(), 3);
assert_eq!(buf, vec![6; 3]);
}
}