#![allow(dead_code)]
#![allow(unsafe_op_in_unsafe_fn)]
#![allow(clippy::redundant_pub_crate)]
#![allow(clippy::upper_case_acronyms)]
#![allow(clippy::use_self)]
#[macro_use]
mod macros;
mod bitpacker4x;
mod bitpacker8x;
pub use bitpacker4x::BitPacker4x;
pub use bitpacker8x::BitPacker8x;
pub(crate) trait Available {
fn available() -> bool;
}
pub(crate) trait UnsafeBitPacker {
const BLOCK_LEN: usize;
unsafe fn compress(decompressed: &[u32], compressed: &mut [u8], num_bits: u8) -> usize;
unsafe fn compress_sorted(
initial: u32,
decompressed: &[u32],
compressed: &mut [u8],
num_bits: u8,
) -> usize;
unsafe fn compress_strictly_sorted(
initial: Option<u32>,
decompressed: &[u32],
compressed: &mut [u8],
num_bits: u8,
) -> usize;
unsafe fn decompress(compressed: &[u8], decompressed: &mut [u32], num_bits: u8) -> usize;
unsafe fn decompress_sorted(
initial: u32,
compressed: &[u8],
decompressed: &mut [u32],
num_bits: u8,
) -> usize;
unsafe fn decompress_strictly_sorted(
initial: Option<u32>,
compressed: &[u8],
decompressed: &mut [u32],
num_bits: u8,
) -> usize;
unsafe fn num_bits(decompressed: &[u32]) -> u8;
unsafe fn num_bits_sorted(initial: u32, decompressed: &[u32]) -> u8;
unsafe fn num_bits_strictly_sorted(initial: Option<u32>, decompressed: &[u32]) -> u8;
}
pub trait BitPacker: Sized + Clone + Copy {
const BLOCK_LEN: usize;
fn new() -> Self;
fn compress(&self, decompressed: &[u32], compressed: &mut [u8], num_bits: u8) -> usize;
fn compress_sorted(
&self,
initial: u32,
decompressed: &[u32],
compressed: &mut [u8],
num_bits: u8,
) -> usize;
fn compress_strictly_sorted(
&self,
initial: Option<u32>,
decompressed: &[u32],
compressed: &mut [u8],
num_bits: u8,
) -> usize;
fn decompress(&self, compressed: &[u8], decompressed: &mut [u32], num_bits: u8) -> usize;
fn decompress_sorted(
&self,
initial: u32,
compressed: &[u8],
decompressed: &mut [u32],
num_bits: u8,
) -> usize;
fn decompress_strictly_sorted(
&self,
initial: Option<u32>,
compressed: &[u8],
decompressed: &mut [u32],
num_bits: u8,
) -> usize;
fn num_bits(&self, decompressed: &[u32]) -> u8;
fn num_bits_sorted(&self, initial: u32, decompressed: &[u32]) -> u8;
fn num_bits_strictly_sorted(&self, initial: Option<u32>, decompressed: &[u32]) -> u8;
#[must_use]
fn compressed_block_size(num_bits: u8) -> usize {
Self::BLOCK_LEN * num_bits as usize / 8
}
}
#[inline]
fn most_significant_bit(value: u32) -> u8 {
(u32::BITS - value.leading_zeros()) as u8
}