use std::borrow::Cow;
use roaring::RoaringBitmap;
use crate::common::bitvec::BitSlice;
pub(super) const MAGIC: [u8; 4] = *b"QBMK";
pub(super) const VERSION: u32 = 1;
pub(super) const HEADER_SIZE: usize = size_of::<BitmaskHeader>();
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub(super) enum Encoding {
Dense = 0,
RoaringOnes = 1,
RoaringZeros = 2,
}
impl Encoding {
pub(super) fn from_u32(value: u32) -> Option<Self> {
match value {
0 => Some(Self::Dense),
1 => Some(Self::RoaringOnes),
2 => Some(Self::RoaringZeros),
_ => None,
}
}
}
#[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)]
#[repr(C)]
pub(super) struct BitmaskHeader {
pub(super) magic: [u8; 4],
pub(super) version: u32,
pub(super) logical_len: u64,
pub(super) encoding: u32,
pub(super) _reserved: u32,
pub(super) payload_len: u64,
}
impl BitmaskHeader {
pub(super) fn new(logical_len: u64, encoding: Encoding, payload_len: u64) -> Self {
Self {
magic: MAGIC,
version: VERSION,
logical_len,
encoding: encoding as u32,
_reserved: 0,
payload_len,
}
}
}
pub enum BitmaskContent<'a> {
Dense(Cow<'a, BitSlice>),
Ones(RoaringBitmap),
Zeros(RoaringBitmap),
}