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 source = source;
let mut input = Vec::new();
source.read_to_end(&mut input).unwrap();
let mut vec = Vec::new();
let mut frame_enc = FrameCompressor::new(level);
frame_enc.set_source_size_hint(input.len() as u64);
frame_enc.set_source(input.as_slice());
frame_enc.set_drain(&mut vec);
frame_enc.compress();
vec
}
#[derive(Copy, Clone, Debug)]
pub enum CompressionLevel {
Uncompressed,
Fastest,
Default,
Better,
Best,
Level(i32),
}
impl CompressionLevel {
pub const MIN_LEVEL: i32 = -131072;
pub const MAX_LEVEL: i32 = 22;
pub const DEFAULT_LEVEL: i32 = 3;
pub const fn from_level(level: i32) -> Self {
match level {
0 | Self::DEFAULT_LEVEL => Self::Default,
1 => Self::Fastest,
7 => Self::Better,
11 => Self::Best,
_ => Self::Level(level),
}
}
}
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 set_source_size_hint(&mut self, _size: u64) {}
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] },
}