use crate::Buffer;
use alloc::vec::Vec;
#[derive(Debug)]
pub struct BufferFromSystemMemory {
inner: Vec<u8>,
cursor: usize,
reserved: usize,
}
impl BufferFromSystemMemory {
pub fn new(_: usize) -> Self {
Self {
inner: Vec::new(),
cursor: 0,
reserved: 0,
}
}
}
impl Default for BufferFromSystemMemory {
fn default() -> Self {
Self::new(0)
}
}
impl Buffer for BufferFromSystemMemory {
type Slice = Vec<u8>;
#[inline]
fn reserve(&mut self, len: usize) -> &mut [u8] {
let end = self
.cursor
.checked_add(len)
.expect("writable length overflows usize");
if end > self.inner.len() {
self.inner.resize(end, 0)
};
self.reserved = len;
&mut self.inner[self.cursor..end]
}
#[inline]
fn commit(&mut self, len: usize) {
assert!(len <= self.reserved, "commit exceeds the last reservation");
self.cursor += len;
self.reserved = 0;
}
#[inline]
fn get_data_owned(&mut self) -> Vec<u8> {
let mut tail = self.inner.split_off(self.cursor);
core::mem::swap(&mut tail, &mut self.inner);
let head = tail;
self.cursor = 0;
self.reserved = 0;
head
}
#[inline]
fn frame(&self) -> &[u8] {
&self.inner[..self.cursor]
}
#[inline]
fn frame_mut(&mut self) -> &mut [u8] {
&mut self.inner[..self.cursor]
}
#[inline]
fn len(&self) -> usize {
self.cursor
}
#[inline]
fn truncate(&mut self, len: usize) {
self.cursor = self.cursor.min(len);
self.reserved = 0;
}
}
#[cfg(test)]
pub struct TestBufferFromMemory(pub Vec<u8>);
#[cfg(test)]
impl Buffer for TestBufferFromMemory {
type Slice = Vec<u8>;
fn reserve(&mut self, _len: usize) -> &mut [u8] {
panic!()
}
fn commit(&mut self, _len: usize) {
panic!()
}
fn get_data_owned(&mut self) -> Self::Slice {
panic!()
}
fn frame(&self) -> &[u8] {
&self.0[0..0]
}
fn frame_mut(&mut self) -> &mut [u8] {
&mut self.0[0..0]
}
fn len(&self) -> usize {
0
}
fn truncate(&mut self, _len: usize) {
panic!()
}
}