use crate::bloom::filter::{NgramBloom, EXACT_PAIR_WORDS};
use crate::error::{Error, Result};
const EXACT_PAIR_MAGIC: u64 = 0x4558_5041_4952_535f;
impl NgramBloom {
#[must_use]
pub fn raw_parts(&self) -> (usize, &[u64]) {
(self.num_bits, &self.bits)
}
#[must_use]
pub fn serialize_with_exact_pairs(&self) -> (usize, &[u64], Option<&[u64; EXACT_PAIR_WORDS]>) {
(self.num_bits, &self.bits, self.exact_pairs.as_deref())
}
pub fn from_raw_parts(num_bits: usize, bits: Vec<u64>) -> Result<Self> {
if num_bits == 0 {
return Err(Error::ZeroBloomBits);
}
if !num_bits.is_power_of_two() {
return Err(Error::InvalidBlockSize { size: num_bits });
}
let required_words = num_bits.div_ceil(64);
if bits.len() < required_words {
return Err(Error::TruncatedBlock { block_index: 0 });
}
Ok(Self {
exact_pairs: None,
bits,
num_bits,
bit_index_mask: (num_bits as u64).wrapping_sub(1),
})
}
pub fn from_serialized_parts(
num_bits: usize,
bits: Vec<u64>,
exact_pairs: Option<Box<[u64; EXACT_PAIR_WORDS]>>,
) -> Result<Self> {
if num_bits == 0 {
return Err(Error::ZeroBloomBits);
}
if !num_bits.is_power_of_two() {
return Err(Error::InvalidBlockSize { size: num_bits });
}
let required_words = num_bits.div_ceil(64);
if bits.len() < required_words {
return Err(Error::TruncatedBlock { block_index: 0 });
}
Ok(Self {
exact_pairs,
bits,
num_bits,
bit_index_mask: (num_bits as u64).wrapping_sub(1),
})
}
#[must_use]
pub(crate) const fn exact_pair_magic() -> u64 {
EXACT_PAIR_MAGIC
}
}