use crate::buffer::BooleanBuffer;
use crate::{Buffer, MutableBuffer};
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct NullBuffer {
buffer: BooleanBuffer,
null_count: usize,
}
impl NullBuffer {
pub fn new(buffer: BooleanBuffer) -> Self {
let null_count = buffer.len() - buffer.count_set_bits();
Self { buffer, null_count }
}
pub fn new_null(len: usize) -> Self {
let buffer = MutableBuffer::new_null(len).into_buffer();
let buffer = BooleanBuffer::new(buffer, 0, len);
Self {
buffer,
null_count: len,
}
}
pub unsafe fn new_unchecked(buffer: BooleanBuffer, null_count: usize) -> Self {
Self { buffer, null_count }
}
#[inline]
pub fn len(&self) -> usize {
self.buffer.len()
}
#[inline]
pub fn offset(&self) -> usize {
self.buffer.offset()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.buffer.is_empty()
}
#[inline]
pub fn null_count(&self) -> usize {
self.null_count
}
#[inline]
pub fn is_valid(&self, idx: usize) -> bool {
self.buffer.is_set(idx)
}
#[inline]
pub fn is_null(&self, idx: usize) -> bool {
!self.is_valid(idx)
}
#[inline]
pub fn validity(&self) -> &[u8] {
self.buffer.values()
}
pub fn slice(&self, offset: usize, len: usize) -> Self {
Self::new(self.buffer.slice(offset, len))
}
#[inline]
pub fn inner(&self) -> &BooleanBuffer {
&self.buffer
}
#[inline]
pub fn buffer(&self) -> &Buffer {
self.buffer.inner()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_size() {
assert_eq!(
std::mem::size_of::<NullBuffer>(),
std::mem::size_of::<Option<NullBuffer>>()
);
}
}