use adler32::RollingAdler32; pub trait RollingChecksum { fn update(&mut self, byte: u8); fn update_from_slice(&mut self, data: &[u8]); fn current_hash(&self) -> u32; } pub struct NoChecksum {} impl NoChecksum { pub fn new() -> NoChecksum { NoChecksum {} } } impl RollingChecksum for NoChecksum { fn update(&mut self, _: u8) {} fn update_from_slice(&mut self, _: &[u8]) {} fn current_hash(&self) -> u32 { 1 } } impl<'a> RollingChecksum for &'a mut NoChecksum { fn update(&mut self, _: u8) {} fn update_from_slice(&mut self, _: &[u8]) {} fn current_hash(&self) -> u32 { 1 } } pub struct Adler32Checksum { adler32: RollingAdler32, } impl Adler32Checksum { pub fn new() -> Adler32Checksum { Adler32Checksum { adler32: RollingAdler32::new(), } } } impl RollingChecksum for Adler32Checksum { fn update(&mut self, byte: u8) { self.adler32.update(byte); } fn update_from_slice(&mut self, data: &[u8]) { self.adler32.update_buffer(data); } fn current_hash(&self) -> u32 { self.adler32.hash() } } impl<'a> RollingChecksum for &'a mut Adler32Checksum { fn update(&mut self, byte: u8) { self.adler32.update(byte); } fn update_from_slice(&mut self, data: &[u8]) { self.adler32.update_buffer(data); } fn current_hash(&self) -> u32 { self.adler32.hash() } }