use crate::{
bitpack::{AlpDecoder, bitunpack_core_generic, packed_byte_size},
error::{Error, Result},
float::AlpFloat,
params::AlpParams,
};
#[inline]
pub unsafe fn decode_standard_raw<F: AlpFloat>(
src: &[u8],
count: usize,
params: AlpParams,
dst_ptr: *mut F,
) -> Result<()> {
if count == 0 {
return Ok(());
}
let mut cursor = 0;
if src.len() < cursor + F::BASE_SIZE {
return Err(Error::UnexpectedEof {
needed: cursor + F::BASE_SIZE,
available: src.len(),
});
}
let base = F::read_base(&src[cursor..cursor + F::BASE_SIZE]);
cursor += F::BASE_SIZE;
let payload = &src[cursor..];
dispatch_decoder!(params, base, F, decoder => {
unsafe {
decode_standard_inner(payload, count, params, decoder, dst_ptr)?;
}
});
if params.bit_width > 0 {
let packed_len = packed_byte_size(count, params.bit_width);
cursor += packed_len;
}
unsafe {
super::patch_exceptions(&src[cursor..], count, dst_ptr)?;
}
Ok(())
}
#[inline(always)]
unsafe fn decode_standard_inner<F: AlpFloat, D: AlpDecoder<F>>(
payload: &[u8],
count: usize,
params: AlpParams,
decoder: D,
dst_ptr: *mut F,
) -> Result<()> {
let packed_len = packed_byte_size(count, params.bit_width);
if payload.len() < packed_len {
return Err(Error::UnexpectedEof {
needed: packed_len,
available: payload.len(),
});
}
unsafe {
bitunpack_core_generic(
&payload[..packed_len],
count,
params.bit_width,
decoder,
dst_ptr,
);
}
Ok(())
}