use crate::{safe_write, GrowFailed, Memory};
use std::io;
#[cfg(test)]
mod tests;
pub struct Writer<'a, M> {
offset: u64,
memory: &'a mut M,
}
impl<'a, M: Memory> Writer<'a, M> {
pub fn new(memory: &'a mut M, offset: u64) -> Self {
Self { offset, memory }
}
pub fn write(&mut self, buf: &[u8]) -> Result<(), GrowFailed> {
safe_write(self.memory, self.offset, buf)?;
self.offset += buf.len() as u64;
Ok(())
}
}
impl<'a, M: Memory> io::Write for Writer<'a, M> {
fn write(&mut self, buf: &[u8]) -> Result<usize, io::Error> {
self.write(buf)
.map_err(|e| io::Error::new(io::ErrorKind::OutOfMemory, e))?;
Ok(buf.len())
}
fn flush(&mut self) -> Result<(), io::Error> {
Ok(())
}
}
pub struct BufferedWriter<'a, M: Memory> {
inner: io::BufWriter<Writer<'a, M>>,
}
impl<'a, M: Memory> BufferedWriter<'a, M> {
pub fn new(buffer_size: usize, writer: Writer<M>) -> BufferedWriter<M> {
BufferedWriter {
inner: io::BufWriter::with_capacity(buffer_size, writer),
}
}
}
impl<'a, M: Memory> io::Write for BufferedWriter<'a, M> {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.inner.write(buf)
}
fn flush(&mut self) -> io::Result<()> {
self.inner.flush()
}
}