Skip to main content

Bitmap

Struct Bitmap 

Source
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

Source

pub fn footprint(&self) -> usize

How many bytes of memory this bitmap is holding.

Source

pub fn all_valid(len: usize) -> Self

A bitmap with room for len values, all valid.

Source

pub fn all_invalid(len: usize) -> Self

A bitmap with room for len values, all null.

Source

pub fn get(&self, index: usize) -> bool

Whether the value at index is valid. Past the end reads as invalid.

Source

pub fn set(&mut self, index: usize, valid: bool)

Sets whether the value at index is valid, growing the bitmap if it has to.

Source

pub fn count_valid(&self, len: usize) -> usize

How many of the first len values are valid.

Source

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.

Source

pub fn slice(&self, at: usize, len: usize) -> Self

The len bits starting at at, moved down to start at bit zero.

A word at a time, because a cut is almost never on a word boundary and doing it a bit at a time is a divide, a shift and a read modify write per row. Each output word is the high part of one input word and the low part of the next, which is two loads and three shifts for sixty four rows.

The bits past len in the last word are set rather than clear, for the reason Validity::from_run gives: this type has no length, so its equality is over whole words and a constructor that left them clear would compare unequal to one that did not.

Source

pub fn and_with(&mut self, other: &Self)

Intersects this bitmap with another, in place.

Trait Implementations§

Source§

impl Clone for Bitmap

Source§

fn clone(&self) -> Bitmap

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Bitmap

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for Bitmap

Source§

impl PartialEq for Bitmap

Source§

fn eq(&self, other: &Bitmap) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Bitmap

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.