use crate::{
encoder::{
engine::compress_into_engine,
exception::{DEFAULT_EXCEPTIONS_CAP, Exception},
},
float::AlpFloat,
sampler::BestParams,
};
#[derive(Debug, Clone)]
pub struct Encoder<F: AlpFloat> {
pub cached_params: Option<BestParams>,
pub(crate) encoded_buf: Vec<F::Int>,
pub(crate) exceptions: Vec<Exception<F::RawBits>>,
}
impl<F: AlpFloat> Default for Encoder<F> {
#[inline]
fn default() -> Self {
Self::new()
}
}
impl<F: AlpFloat> Encoder<F> {
#[inline]
pub const fn new() -> Self {
Self {
cached_params: None,
encoded_buf: Vec::new(),
exceptions: Vec::new(),
}
}
#[inline]
pub fn with_capacity(capacity: usize) -> Self {
Self {
cached_params: None,
encoded_buf: Vec::with_capacity(capacity),
exceptions: Vec::with_capacity(DEFAULT_EXCEPTIONS_CAP),
}
}
#[inline]
pub fn reset(&mut self) {
self.cached_params = None;
self.encoded_buf.clear();
self.exceptions.clear();
}
#[inline]
pub fn compress_into(&mut self, data: &[F], dst: &mut Vec<u8>) {
self.cached_params = compress_into_engine(
data,
dst,
false,
self.cached_params,
&mut self.encoded_buf,
&mut self.exceptions,
);
}
#[inline]
pub fn compress_delta_into(&mut self, data: &[F], dst: &mut Vec<u8>) {
self.cached_params = compress_into_engine(
data,
dst,
true,
self.cached_params,
&mut self.encoded_buf,
&mut self.exceptions,
);
}
#[inline]
pub fn compress(&mut self, data: &[F]) -> Vec<u8> {
let mut dst = Vec::new();
self.compress_into(data, &mut dst);
dst
}
#[inline]
pub fn compress_delta(&mut self, data: &[F]) -> Vec<u8> {
let mut dst = Vec::new();
self.compress_delta_into(data, &mut dst);
dst
}
#[inline]
pub fn shrink_to_fit(&mut self) {
self.encoded_buf.shrink_to_fit();
self.exceptions.shrink_to_fit();
}
#[inline]
pub fn capacity(&self) -> usize {
self.encoded_buf.capacity()
}
}