#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum LZ77Token {
Literal(u8),
Copy { length: u16, distance: u16 },
EndOfBlock,
}
impl LZ77Token {
pub fn uncompressed_size(&self) -> usize {
match self {
LZ77Token::Literal(_) => 1,
LZ77Token::Copy { length, .. } => *length as usize,
LZ77Token::EndOfBlock => 0,
}
}
}
#[derive(Clone, Debug)]
pub struct CodeLengths {
pub literal_lengths: Vec<u8>, pub distance_lengths: Vec<u8>, }
#[derive(Clone, Debug)]
pub struct LZ77Block {
pub tokens: Vec<LZ77Token>,
pub is_final: bool,
pub block_type: u8,
pub code_lengths: Option<CodeLengths>,
}
impl LZ77Block {
pub fn new(tokens: Vec<LZ77Token>, is_final: bool, block_type: u8) -> Self {
Self { tokens, is_final, block_type, code_lengths: None }
}
pub fn uncompressed_size(&self) -> usize {
self.tokens.iter().map(|t| t.uncompressed_size()).sum()
}
}