use crate::compressor::lz;
use lzfse_sys::{lzfse_decode_buffer, lzfse_decode_scratch_size, lzfse_encode_buffer};
use std::cmp;
pub type Lzfse = lz::Lz<Impl>;
pub enum Impl {}
impl lz::Impl for Impl {
fn scratch_size() -> usize {
unsafe { cmp::max(lzfse_encode_scratch_size(), lzfse_decode_scratch_size()) }
}
unsafe fn encode(dst: &mut [u8], src: &[u8], scratch: &mut [u8]) -> usize {
debug_assert!(scratch.len() >= unsafe { lzfse_encode_scratch_size() });
let res = unsafe {
lzfse_encode_buffer(
dst.as_mut_ptr().cast(),
dst.len(),
src.as_ptr().cast(),
src.len(),
scratch.as_mut_ptr().cast(),
)
};
debug_assert!(res <= dst.len());
res
}
unsafe fn decode(dst: &mut [u8], src: &[u8], scratch: &mut [u8]) -> usize {
debug_assert!(scratch.len() >= unsafe { lzfse_decode_scratch_size() });
let res = unsafe {
lzfse_decode_buffer(
dst.as_mut_ptr().cast(),
dst.len(),
src.as_ptr().cast(),
src.len(),
scratch.as_mut_ptr().cast(),
)
};
debug_assert!(res <= dst.len());
res
}
}
extern "C" {
fn lzfse_encode_scratch_size() -> usize;
}