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