use crate::{CircularBuffer, Storage};
impl crate::sealed::StorageBase for Vec<u8> {}
impl Storage for Vec<u8> {
fn len(&self) -> usize {
self.len()
}
fn as_slice(&self) -> &[u8] {
self.as_slice()
}
fn as_mut_slice(&mut self) -> &mut [u8] {
self.as_mut_slice()
}
fn split_at(&self, offset: usize) -> (&[u8], &[u8]) {
self.as_slice().split_at(offset)
}
fn split_at_mut(&mut self, offset: usize) -> (&mut [u8], &mut [u8]) {
self.as_mut_slice().split_at_mut(offset)
}
}
pub type HeapBuffer = CircularBuffer<Vec<u8>>;
impl HeapBuffer {
pub fn new(capacity: usize) -> Self {
assert!(capacity > 0);
Self::_new_with_storage(vec![0u8; capacity])
}
pub fn try_resize(&mut self, new_capacity: usize) -> Result<(), usize> {
assert!(new_capacity > 0);
if new_capacity >= self.capacity() {
self.bytes.resize(new_capacity, 0u8);
} else {
if self.remaining() > new_capacity {
let extra_bytes_needed = self.remaining() - new_capacity;
return Err(extra_bytes_needed);
}
self.make_contiguous();
self.bytes.truncate(new_capacity);
}
Ok(())
}
}
impl From<Vec<u8>> for HeapBuffer {
fn from(value: Vec<u8>) -> Self {
assert!(value.capacity() > 0);
Self::_new_with_storage(value)
}
}