use crate::Result;
use roaring::RoaringTreemap;
use std::fmt;
#[derive(Debug)]
pub enum RoaringError {
SerializationFailed(String),
CompactionFailed(String),
InvalidBitmap(String),
SizeQueryFailed(String),
}
impl fmt::Display for RoaringError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
RoaringError::SerializationFailed(msg) => {
write!(f, "Roaring serialization failed: {}", msg)
}
RoaringError::CompactionFailed(msg) => {
write!(f, "Compaction failed: {}", msg)
}
RoaringError::InvalidBitmap(msg) => {
write!(f, "Invalid roaring bitmap: {}", msg)
}
RoaringError::SizeQueryFailed(msg) => {
write!(f, "Size query failed: {}", msg)
}
}
}
}
impl std::error::Error for RoaringError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
None
}
}
pub trait RoaringValueReadOnlyTable<'txn, K> {
fn get_bitmap(&self, key: K) -> Result<RoaringTreemap>;
fn contains_member(&self, key: K, member: u64) -> Result<bool> {
let bitmap = self.get_bitmap(key)?;
Ok(bitmap.contains(member))
}
fn get_member_count(&self, key: K) -> Result<u64> {
let bitmap = self.get_bitmap(key)?;
Ok(bitmap.len())
}
fn iter_members(&self, key: K) -> Result<impl Iterator<Item = u64> + '_> {
let bitmap = self.get_bitmap(key)?;
Ok(bitmap.into_iter())
}
}
pub trait RoaringValueTable<'txn, K>: RoaringValueReadOnlyTable<'txn, K> {
fn insert_member(&mut self, key: K, member: u64) -> Result<()>;
fn remove_member(&mut self, key: K, member: u64) -> Result<()>;
fn insert_members<I>(&mut self, key: K, members: I) -> Result<()>
where
K: Clone,
I: IntoIterator<Item = u64>,
{
let mut current_bitmap = self.get_bitmap(key.clone())?;
current_bitmap.extend(members);
self.replace_bitmap(key, current_bitmap)
}
fn remove_members<I>(&mut self, key: K, members: I) -> Result<()>
where
K: Clone,
I: IntoIterator<Item = u64>,
{
let mut current_bitmap = self.get_bitmap(key.clone())?;
for member in members {
current_bitmap.remove(member);
}
self.replace_bitmap(key, current_bitmap)
}
fn clear_bitmap(&mut self, key: K) -> Result<()> {
self.remove_key(key)
}
fn replace_bitmap(&mut self, key: K, bitmap: RoaringTreemap) -> Result<()>;
fn remove_key(&mut self, key: K) -> Result<()>;
}
mod facade;
mod value;
pub use value::RoaringValue;