//! Buffer wrappers implementing default so we can allocate the buffers with `Box::default()` //! to avoid stack copies. Box::new() doesn't at the moment, and using a vec means we would lose //! static length info. use crate::deflate::core::{LZ_DICT_SIZE, MAX_MATCH_LEN}; /// Size of the buffer of lz77 encoded data. pub const LZ_CODE_BUF_SIZE: usize = 64 * 1024; /// Size of the output buffer. pub const OUT_BUF_SIZE: usize = (LZ_CODE_BUF_SIZE * 13) / 10; pub const LZ_DICT_FULL_SIZE: usize = LZ_DICT_SIZE + MAX_MATCH_LEN - 1 + 1; /// Size of hash values in the hash chains. pub const LZ_HASH_BITS: i32 = 15; /// How many bits to shift when updating the current hash value. pub const LZ_HASH_SHIFT: i32 = (LZ_HASH_BITS + 2) / 3; /// Size of the chained hash tables. pub const LZ_HASH_SIZE: usize = 1 << LZ_HASH_BITS; #[inline] pub fn update_hash(current_hash: u16, byte: u8) -> u16 { ((current_hash << LZ_HASH_SHIFT) ^ u16::from(byte)) & (LZ_HASH_SIZE as u16 - 1) } pub struct HashBuffers { pub dict: [u8; LZ_DICT_FULL_SIZE], pub next: [u16; LZ_DICT_SIZE], pub hash: [u16; LZ_DICT_SIZE], } impl HashBuffers { #[inline] pub fn reset(&mut self) { *self = HashBuffers::default(); } } impl Default for HashBuffers { fn default() -> HashBuffers { HashBuffers { dict: [0; LZ_DICT_FULL_SIZE], next: [0; LZ_DICT_SIZE], hash: [0; LZ_DICT_SIZE], } } } pub struct LocalBuf { pub b: [u8; OUT_BUF_SIZE], } impl Default for LocalBuf { fn default() -> LocalBuf { LocalBuf { b: [0; OUT_BUF_SIZE], } } }