1 use adler32::RollingAdler32;
2 
3 pub 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 
9 pub struct NoChecksum {}
10 
11 impl NoChecksum {
12     pub fn new() -> NoChecksum {
13         NoChecksum {}
14     }
15 }
16 
17 impl 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 
25 impl<'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 
33 pub struct Adler32Checksum {
34     adler32: RollingAdler32,
35 }
36 
37 impl Adler32Checksum {
38     pub fn new() -> Adler32Checksum {
39         Adler32Checksum {
40             adler32: RollingAdler32::new(),
41         }
42     }
43 }
44 
45 impl 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 impl<'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 }
72