pub trait InputBuffer {
fn data(&self) -> &[u8];
fn pop(&mut self, count: usize);
fn available(&self) -> usize {
self.data().len()
}
}
pub struct SliceInputBuffer<'a> {
buffer: &'a [u8],
}
impl<'a> SliceInputBuffer<'a> {
pub fn new(buffer: &'a [u8]) -> Self {
Self { buffer }
}
}
impl<'a> InputBuffer for SliceInputBuffer<'a> {
fn data(&self) -> &[u8] {
self.buffer
}
fn pop(&mut self, count: usize) {
let count = count.clamp(0, self.buffer.len());
self.buffer = &self.buffer[count..];
}
}
#[cfg(feature = "std")]
impl InputBuffer for Vec<u8> {
fn data(&self) -> &[u8] {
&self[..]
}
fn pop(&mut self, count: usize) {
self.splice(0..count, std::iter::empty());
}
fn available(&self) -> usize {
self.len()
}
}