#[derive(Debug, Clone)]
#[allow(dead_code)]
pub struct SelectionBitmap {
bits: Vec<bool>,
}
#[allow(dead_code)]
impl SelectionBitmap {
#[inline]
pub fn new(size: usize, value: bool) -> Self {
Self { bits: vec![value; size] }
}
#[inline]
pub fn all_true(size: usize) -> Self {
Self::new(size, true)
}
#[inline]
#[allow(dead_code)]
pub fn all_false(size: usize) -> Self {
Self::new(size, false)
}
#[inline]
#[allow(dead_code)]
pub fn get(&self, index: usize) -> bool {
self.bits[index]
}
#[inline]
pub fn set(&mut self, index: usize, value: bool) {
self.bits[index] = value;
}
#[inline]
pub fn len(&self) -> usize {
self.bits.len()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.bits.is_empty()
}
#[inline]
pub fn count_true(&self) -> usize {
self.bits.iter().filter(|&&b| b).count()
}
#[inline]
pub fn iter(&self) -> impl Iterator<Item = &bool> {
self.bits.iter()
}
pub fn filter_rows<T>(&self, rows: &[T]) -> Vec<T>
where
T: Clone,
{
debug_assert_eq!(self.len(), rows.len(), "Bitmap length must match row count");
rows.iter()
.zip(self.bits.iter())
.filter_map(|(row, &keep)| if keep { Some(row.clone()) } else { None })
.collect()
}
pub fn filter_rows_into<T>(&self, rows: &[T], buffer: &mut Vec<T>)
where
T: Clone,
{
debug_assert_eq!(self.len(), rows.len(), "Bitmap length must match row count");
buffer.clear();
buffer.reserve(self.count_true());
for (row, &keep) in rows.iter().zip(self.bits.iter()) {
if keep {
buffer.push(row.clone());
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_bitmap_creation() {
let bitmap = SelectionBitmap::all_true(5);
assert_eq!(bitmap.len(), 5);
assert_eq!(bitmap.count_true(), 5);
let bitmap = SelectionBitmap::all_false(3);
assert_eq!(bitmap.len(), 3);
assert_eq!(bitmap.count_true(), 0);
}
#[test]
fn test_bitmap_set_get() {
let mut bitmap = SelectionBitmap::all_true(4);
assert!(bitmap.get(2));
bitmap.set(2, false);
assert!(!bitmap.get(2));
assert_eq!(bitmap.count_true(), 3);
}
#[test]
fn test_filter_rows() {
let rows = vec![1, 2, 3, 4, 5];
let mut bitmap = SelectionBitmap::all_false(5);
bitmap.set(1, true); bitmap.set(3, true);
let filtered = bitmap.filter_rows(&rows);
assert_eq!(filtered, vec![2, 4]);
}
#[test]
fn test_filter_rows_into() {
let rows = vec![10, 20, 30, 40];
let mut bitmap = SelectionBitmap::all_true(4);
bitmap.set(1, false); bitmap.set(2, false);
let mut buffer = Vec::new();
bitmap.filter_rows_into(&rows, &mut buffer);
assert_eq!(buffer, vec![10, 40]);
}
}