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}