1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
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() } }