use slice_deque::{Buffer, AllocError};
pub struct MmapBuffer {
buf: Buffer<u8>,
bufsize: usize,
start: usize,
len: usize,
}
impl super::Buffer for MmapBuffer {
type Error = AllocError;
fn new(size: usize) -> Result<Self, AllocError> {
let buf = Buffer::uninitialized(size * 2)?;
let bufsize = buf.len() / 2;
Ok(MmapBuffer {
buf, bufsize,
start: 0, len: 0,
})
}
fn filled(&self) -> &[u8] {
&(unsafe {
self.buf.as_slice()
})[ self.start .. (self.start + self.len) ]
}
fn enlarge(&mut self) -> Result<(), AllocError> {
if self.start == 0 && self.len == self.bufsize {
self.bufsize *= 2;
let mut new = Buffer::uninitialized(self.bufsize * 2)?;
self.bufsize = new.len() / 2;
unsafe {
core::ptr::copy(
self.buf.as_mut_slice()[self.start..].as_mut_ptr(),
new.as_mut_slice().as_mut_ptr(),
self.len,
);
}
self.start = 0;
self.buf = new;
} else {
}
Ok(())
}
fn appendable(&mut self) -> &mut [u8] {
let end = self.start + self.len;
let remaining = self.bufsize - self.len;
&mut (unsafe {
self.buf.as_mut_slice()
})[ end .. (end+remaining) ]
}
fn grow(&mut self, amount: usize) {
self.len += amount;
}
fn consume(&mut self, amount: usize) -> &[u8] {
let start = self.start;
let amount = std::cmp::min(amount, self.len());
self.start += amount;
if self.start >= self.bufsize {
self.start -= self.bufsize;
}
self.len -= amount;
&(unsafe {
self.buf.as_mut_slice()
})[ start .. (start+amount) ]
}
fn len(&self) -> usize {
self.len
}
}