pub(crate) mod block_header;
pub(crate) mod blocks;
pub(crate) mod frame_header;
pub(crate) mod match_generator;
pub(crate) mod util;
mod frame_compressor;
mod levels;
mod streaming_encoder;
pub use frame_compressor::FrameCompressor;
pub use match_generator::MatchGeneratorDriver;
pub use streaming_encoder::StreamingEncoder;
use crate::io::{Read, Write};
use alloc::vec::Vec;
pub fn compress<R: Read, W: Write>(source: R, target: W, level: CompressionLevel) {
let mut frame_enc = FrameCompressor::new(level);
frame_enc.set_source(source);
frame_enc.set_drain(target);
frame_enc.compress();
}
pub fn compress_to_vec<R: Read>(source: R, level: CompressionLevel) -> Vec<u8> {
let mut vec = Vec::new();
compress(source, &mut vec, level);
vec
}
#[derive(Copy, Clone)]
pub enum CompressionLevel {
Uncompressed,
Fastest,
Default,
Better,
Best,
}
pub trait Matcher {
fn get_next_space(&mut self) -> alloc::vec::Vec<u8>;
fn get_last_space(&mut self) -> &[u8];
fn commit_space(&mut self, space: alloc::vec::Vec<u8>);
fn skip_matching(&mut self);
fn start_matching(&mut self, handle_sequence: impl for<'a> FnMut(Sequence<'a>));
fn reset(&mut self, level: CompressionLevel);
fn prime_with_dictionary(&mut self, _dict_content: &[u8], _offset_hist: [u32; 3]) {}
fn supports_dictionary_priming(&self) -> bool {
false
}
fn window_size(&self) -> u64;
}
#[derive(PartialEq, Eq, Debug)]
pub enum Sequence<'data> {
Triple {
literals: &'data [u8],
offset: usize,
match_len: usize,
},
Literals { literals: &'data [u8] },
}