BitMap

Struct BitMap 

Source
pub struct BitMap<const N: usize> { /* private fields */ }
Expand description

A historical bitmap that maintains one actual bitmap plus diffs for history and batching.

Commit numbers must be strictly monotonically increasing and < u64::MAX.

Implementations§

Source§

impl<const N: usize> BitMap<N>

Source

pub fn new() -> Self

Create a new empty historical bitmap.

Source

pub fn new_with_pruned_chunks(pruned_chunks: usize) -> Result<Self, Error>

Create a new historical bitmap with the given number of pruned chunks.

Source

pub fn start_batch(&mut self) -> BatchGuard<'_, N>

Start a new batch for making mutations.

The returned BatchGuard must be either committed or dropped. All mutations are applied to the guard’s diff layer and do not affect the current bitmap until commit.

§Examples
let mut bitmap: BitMap<4> = BitMap::new();

let mut batch = bitmap.start_batch();
batch.push(true);
batch.push(false);
batch.commit(1).unwrap();

assert_eq!(bitmap.len(), 2);
§Panics

Panics if a batch is already active.

Source

pub fn with_batch<F>(&mut self, commit_number: u64, f: F) -> Result<(), Error>
where F: FnOnce(&mut BatchGuard<'_, N>),

Execute a closure with a batch and commit it at the given commit number.

§Errors

Returns Error::NonMonotonicCommit if the commit number is not greater than the previous commit.

Returns Error::ReservedCommitNumber if the commit number is u64::MAX.

§Panics

Panics if a batch is already active.

Source

pub fn get_at_commit(&self, commit_number: u64) -> Option<Prunable<N>>

Get the bitmap state as it existed at a specific commit.

Returns None if the commit does not exist or if commit_number is u64::MAX (which is reserved and cannot be used as a commit number).

This reconstructs the historical state by applying reverse diffs backward from the current state. Each commit’s reverse diff describes the state before that commit, so we “undo” commits one by one until we reach the target.

§Examples
let mut bitmap: BitMap<4> = BitMap::new();

bitmap.with_batch(1, |batch| {
    batch.push(true);
    batch.push(false);
}).unwrap();

bitmap.with_batch(2, |batch| {
    batch.set_bit(0, false);
    batch.push(true);
}).unwrap();

// Get state as it was at commit 1
let state_at_1 = bitmap.get_at_commit(1).unwrap();
assert_eq!(state_at_1.len(), 2);
assert!(state_at_1.get_bit(0));
assert!(!state_at_1.get_bit(1));

// Current state is different
assert_eq!(bitmap.len(), 3);
assert!(!bitmap.get_bit(0));
Source

pub fn commit_exists(&self, commit_number: u64) -> bool

Check if a commit exists.

Source

pub fn commits(&self) -> impl Iterator<Item = u64> + '_

Get an iterator over all commit numbers in ascending order.

Source

pub fn latest_commit(&self) -> Option<u64>

Get the latest commit number, if any commits exist.

Source

pub fn earliest_commit(&self) -> Option<u64>

Get the earliest commit number, if any commits exist.

Source

pub fn current(&self) -> &Prunable<N>

Get a reference to the current bitmap state.

Source

pub fn len(&self) -> u64

Number of bits in the current bitmap.

Source

pub fn is_empty(&self) -> bool

Returns true if the current bitmap is empty.

Source

pub fn get_bit(&self, bit: u64) -> bool

Get the value of a bit in the current bitmap.

Source

pub fn get_chunk_containing(&self, bit: u64) -> &[u8; N]

Get the chunk containing a bit in the current bitmap.

Source

pub fn pruned_chunks(&self) -> usize

Number of pruned chunks in the current bitmap.

Source

pub fn prune_commits_before(&mut self, commit_number: u64) -> usize

Remove all commits with numbers below the commit number.

Returns the number of commits removed.

Source

pub fn clear_history(&mut self)

Clear all historical commits.

Trait Implementations§

Source§

impl<const N: usize> Default for BitMap<N>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<const N: usize> Freeze for BitMap<N>

§

impl<const N: usize> RefUnwindSafe for BitMap<N>

§

impl<const N: usize> Send for BitMap<N>

§

impl<const N: usize> Sync for BitMap<N>

§

impl<const N: usize> Unpin for BitMap<N>

§

impl<const N: usize> UnwindSafe for BitMap<N>

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> 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, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V