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}