deflate/
checksum.rs

1use adler32::RollingAdler32;
2
3pub trait RollingChecksum {
4    fn update(&mut self, byte: u8);
5    fn update_from_slice(&mut self, data: &[u8]);
6    fn current_hash(&self) -> u32;
7}
8
9pub struct NoChecksum {}
10
11impl NoChecksum {
12    pub const fn new() -> NoChecksum {
13        NoChecksum {}
14    }
15}
16
17impl RollingChecksum for NoChecksum {
18    fn update(&mut self, _: u8) {}
19    fn update_from_slice(&mut self, _: &[u8]) {}
20    fn current_hash(&self) -> u32 {
21        1
22    }
23}
24
25impl<'a> RollingChecksum for &'a mut NoChecksum {
26    fn update(&mut self, _: u8) {}
27    fn update_from_slice(&mut self, _: &[u8]) {}
28    fn current_hash(&self) -> u32 {
29        1
30    }
31}
32
33pub struct Adler32Checksum {
34    adler32: RollingAdler32,
35}
36
37impl Adler32Checksum {
38    pub fn new() -> Adler32Checksum {
39        Adler32Checksum {
40            adler32: RollingAdler32::new(),
41        }
42    }
43}
44
45impl RollingChecksum for Adler32Checksum {
46    fn update(&mut self, byte: u8) {
47        self.adler32.update(byte);
48    }
49
50    fn update_from_slice(&mut self, data: &[u8]) {
51        self.adler32.update_buffer(data);
52    }
53
54    fn current_hash(&self) -> u32 {
55        self.adler32.hash()
56    }
57}
58
59impl<'a> RollingChecksum for &'a mut Adler32Checksum {
60    fn update(&mut self, byte: u8) {
61        self.adler32.update(byte);
62    }
63
64    fn update_from_slice(&mut self, data: &[u8]) {
65        self.adler32.update_buffer(data);
66    }
67
68    fn current_hash(&self) -> u32 {
69        self.adler32.hash()
70    }
71}