pub struct Bitmap { /* private fields */ }Expand description
One bit per value, set meaning valid.
Words are u64 because that is the width the popcount and the mask tests want, and because a
1024 value vector is exactly 16 of them, which fits in a quarter of a cache line pair and is
the reason the vector size is 1024 rather than DuckDB’s 2048.
Implementations§
Source§impl Bitmap
impl Bitmap
Sourcepub fn all_invalid(len: usize) -> Self
pub fn all_invalid(len: usize) -> Self
A bitmap with room for len values, all null.
Sourcepub fn get(&self, index: usize) -> bool
pub fn get(&self, index: usize) -> bool
Whether the value at index is valid. Past the end reads as invalid.
Sourcepub fn set(&mut self, index: usize, valid: bool)
pub fn set(&mut self, index: usize, valid: bool)
Sets whether the value at index is valid, growing the bitmap if it has to.
Sourcepub fn count_valid(&self, len: usize) -> usize
pub fn count_valid(&self, len: usize) -> usize
How many of the first len values are valid.
Sourcepub fn word(&self, at: usize) -> u64
pub fn word(&self, at: usize) -> u64
Sixty four validity bits at once, the lowest numbered row in the lowest bit.
Past the end reads as all null, which is the same answer Self::get gives one bit at a
time. This exists because a kernel that asks Self::get once per row pays a bounds check,
a divide and a shift for each of them, and the word it wants was already in a register for
the previous sixty three. A loop that reads the word once and walks its bits is the same
answer at a fraction of the cost, and the three call sites that do that are the difference
between a nullable column being free and being the slowest thing in the kernel.