#[derive(Debug)]
pub struct ReadBuffer {
storage: Vec<u8>,
}
impl ReadBuffer {
pub fn new() -> Self {
Self {
storage: Vec::with_capacity(16),
}
}
pub fn as_slice(&self) -> &[u8] {
self.storage.as_slice()
}
pub fn is_empty(&self) -> bool {
self.storage.is_empty()
}
pub fn len(&self) -> usize {
self.storage.len()
}
pub fn advance(&mut self, len: usize) {
let remain = self.storage.len() - len;
self.storage.rotate_left(len);
self.storage.truncate(remain);
}
pub fn extend_with(&mut self, slice: &[u8]) {
self.storage.extend_from_slice(slice);
}
pub fn find_subsequence(&self, offset: usize, needle: &[u8]) -> Option<usize> {
self.storage[offset..]
.windows(needle.len())
.position(|w| w == needle)
.map(|pos| pos + offset)
}
}