use crate::{Result, RwBuilder};
use std::io::{Read, Write};
#[derive(Debug)]
#[must_use]
pub struct Crc32FastBuilder<B>
where
B: RwBuilder,
{
builder: B,
}
impl<B> Crc32FastBuilder<B>
where
B: RwBuilder,
{
pub const fn new(builder: B) -> Self {
Self { builder }
}
}
impl<B> RwBuilder for Crc32FastBuilder<B>
where
B: RwBuilder,
B::Reader: Read,
B::Writer: Write,
{
type Reader = Crc32FastReader<B::Reader>;
type Writer = Crc32FastWriter<B::Writer>;
fn reader(&self) -> Result<Self::Reader> {
Ok(Crc32FastReader::new(self.builder.reader()?))
}
fn writer(&self) -> Result<Self::Writer> {
Ok(Crc32FastWriter::new(self.builder.writer()?))
}
}
#[derive(Debug)]
pub struct Crc32FastReader<R: Read> {
inner: R,
hasher: crc32fast::Hasher,
}
impl<R: Read> Crc32FastReader<R> {
pub fn new(inner: R) -> Self {
Self { inner, hasher: crc32fast::Hasher::new() }
}
pub fn finalize(self) -> u32 {
self.hasher.finalize()
}
}
impl<R: Read> Read for Crc32FastReader<R> {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
let n = self.inner.read(buf)?;
self.hasher.update(&buf[..n]);
Ok(n)
}
}
#[derive(Debug)]
pub struct Crc32FastWriter<W: Write> {
inner: W,
hasher: crc32fast::Hasher,
}
impl<W: Write> Crc32FastWriter<W> {
pub fn new(inner: W) -> Self {
Self { inner, hasher: crc32fast::Hasher::new() }
}
pub fn finalize(self) -> u32 {
self.hasher.finalize()
}
}
impl<W: Write> Write for Crc32FastWriter<W> {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
let n = self.inner.write(buf)?;
self.hasher.update(&buf[..n]);
Ok(n)
}
fn flush(&mut self) -> std::io::Result<()> {
self.inner.flush()
}
}