1use crate::{Result, RwBuilder};
2use std::io::{Read, Write};
3
4#[derive(Debug)]
6#[must_use]
7pub struct Crc32FastBuilder<B>
8where
9 B: RwBuilder,
10{
11 builder: B,
13}
14
15impl<B> Crc32FastBuilder<B>
16where
17 B: RwBuilder,
18{
19 pub const fn new(builder: B) -> Self {
21 Self { builder }
22 }
23}
24
25impl<B> RwBuilder for Crc32FastBuilder<B>
26where
27 B: RwBuilder,
28 B::Reader: Read,
29 B::Writer: Write,
30{
31 type Reader = Crc32FastReader<B::Reader>;
32 type Writer = Crc32FastWriter<B::Writer>;
33
34 fn reader(&self) -> Result<Self::Reader> {
35 Ok(Crc32FastReader::new(self.builder.reader()?))
36 }
37
38 fn writer(&self) -> Result<Self::Writer> {
39 Ok(Crc32FastWriter::new(self.builder.writer()?))
40 }
41}
42
43#[derive(Debug)]
45pub struct Crc32FastReader<R: Read> {
46 inner: R,
48 hasher: crc32fast::Hasher,
50}
51
52impl<R: Read> Crc32FastReader<R> {
53 pub fn new(inner: R) -> Self {
55 Self { inner, hasher: crc32fast::Hasher::new() }
56 }
57
58 pub fn finalize(self) -> u32 {
60 self.hasher.finalize()
61 }
62}
63
64impl<R: Read> Read for Crc32FastReader<R> {
65 fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
66 let n = self.inner.read(buf)?;
67 self.hasher.update(&buf[..n]);
68 Ok(n)
69 }
70}
71
72#[derive(Debug)]
74pub struct Crc32FastWriter<W: Write> {
75 inner: W,
77 hasher: crc32fast::Hasher,
79}
80
81impl<W: Write> Crc32FastWriter<W> {
82 pub fn new(inner: W) -> Self {
84 Self { inner, hasher: crc32fast::Hasher::new() }
85 }
86
87 pub fn finalize(self) -> u32 {
89 self.hasher.finalize()
90 }
91}
92
93impl<W: Write> Write for Crc32FastWriter<W> {
94 fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
95 let n = self.inner.write(buf)?;
96 self.hasher.update(&buf[..n]);
97 Ok(n)
98 }
99
100 fn flush(&mut self) -> std::io::Result<()> {
101 self.inner.flush()
102 }
103}