use crate::{
bitpack::{bitpack_fused_delta, packed_byte_size},
encoder::{
Exception,
exception::{exceptions_byte_size, write_exceptions},
},
float::AlpFloat,
header::{header_len, write_header},
params::AlpParams,
};
#[inline(always)]
pub fn encode_delta<F: AlpFloat>(
params: AlpParams,
encoded_ints: &[F::Int],
min_delta: F::Int,
exceptions: &[Exception<F::RawBits>],
dst: &mut Vec<u8>,
) {
let Some(&first) = encoded_ints.first() else {
return;
};
let count = encoded_ints.len();
let is_large = count > u16::MAX as usize;
let exc_len = exceptions_byte_size::<F>(exceptions.len(), is_large);
let deltas_len = count.saturating_sub(1);
let total_len =
header_len(count) + F::BASE_SIZE * 2 + packed_byte_size(deltas_len, params.bit_width) + exc_len;
dst.reserve(total_len);
let type_byte = params.delta_type::<F>();
write_header(type_byte, count, Some(params.pack()), dst);
F::write_base(first, dst);
F::write_base(min_delta, dst);
if params.bit_width > 0 && encoded_ints.len() > 1 {
bitpack_fused_delta::<F>(encoded_ints, min_delta, params.bit_width, dst);
}
write_exceptions::<F>(count, exceptions, dst);
}