use copy_in_place::*;
pub struct VecBuffer {
buf: Vec<u8>,
start: usize,
end: usize,
}
impl super::Buffer for VecBuffer {
type Error = ();
fn new(size: usize) -> Result<Self, ()> {
let mut buf = Vec::with_capacity(size);
unsafe { buf.set_len(size); }
Ok(VecBuffer {
buf,
start: 0, end: 0,
})
}
fn enlarge(&mut self) -> Result<(), ()> {
if self.len() == self.buf.len() {
self.buf.reserve(self.buf.len());
unsafe { self.buf.set_len(self.buf.len() * 2) };
} else {
if self.end - self.start != 0 {
copy_in_place(&mut self.buf, self.start..self.end, 0);
}
self.end -= self.start;
self.start = 0;
}
Ok(())
}
fn len(&self) -> usize {
self.end - self.start
}
fn filled(&self) -> &[u8] {
&self.buf[ self.start .. self.end ]
}
fn appendable(&mut self) -> &mut [u8] {
&mut self.buf[ self.end .. ]
}
fn grow(&mut self, amount: usize) {
self.end += amount;
}
fn consume(&mut self, amount: usize) -> &[u8] {
let amount = std::cmp::min(amount, self.len());
let start = self.start;
self.start += amount;
&self.buf[ start .. (start+amount) ]
}
}