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 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
59
60impl<'a> RollingChecksum for &'a mut Adler32Checksum {
61 fn update(&mut self, byte: u8) {
62 self.adler32.update(byte);
63 }
64
65 fn update_from_slice(&mut self, data: &[u8]) {
66 self.adler32.update_buffer(data);
67 }
68
69 fn current_hash(&self) -> u32 {
70 self.adler32.hash()
71 }
72}