extern crate std;
use super::Murmur3;
use std::io;
pub struct Murmur3Io<W> {
pub(crate) hasher: Murmur3,
inner: W,
}
impl<W> Murmur3Io<W> {
pub fn new(seed: u32, inner: W) -> Self {
Self {
inner,
hasher: Murmur3::new(seed),
}
}
pub fn finish(self) -> (u32, W) {
(self.hasher.finish(), self.inner)
}
}
impl<R: io::Read> io::Read for Murmur3Io<R> {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
let n = self.inner.read(buf)?;
self.hasher.write(&buf[..n]);
Ok(n)
}
}
impl<W: io::Write> io::Write for Murmur3Io<W> {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
let n = self.inner.write(buf)?;
self.hasher.write(&buf[..n]);
Ok(n)
}
fn flush(&mut self) -> io::Result<()> {
self.inner.flush()
}
}