diff options
Diffstat (limited to 'third_party/rust/deflate/src/checksum.rs')
-rw-r--r-- | third_party/rust/deflate/src/checksum.rs | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/third_party/rust/deflate/src/checksum.rs b/third_party/rust/deflate/src/checksum.rs new file mode 100644 index 0000000000..e1885a210f --- /dev/null +++ b/third_party/rust/deflate/src/checksum.rs @@ -0,0 +1,72 @@ +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() + } +} |