pub struct SparseBitMatrix<R, C>{ /* private fields */ }
Expand description
A fixed-column-size, variable-row-size 2D bit matrix with a moderately sparse representation.
Initially, every row has no explicit representation. If any bit within a row
is set, the entire row is instantiated as Some(<DenseBitSet>)
.
Furthermore, any previously uninstantiated rows prior to it will be
instantiated as None
. Those prior rows may themselves become fully
instantiated later on if any of their bits are set.
R
and C
are index types used to identify rows and columns respectively;
typically newtyped usize
wrappers, but they can also just be usize
.
Implementations§
Source§impl<R: Idx, C: Idx> SparseBitMatrix<R, C>
impl<R: Idx, C: Idx> SparseBitMatrix<R, C>
Sourcepub fn new(num_columns: usize) -> Self
pub fn new(num_columns: usize) -> Self
Creates a new empty sparse bit matrix with no rows or columns.
Sourcepub fn insert(&mut self, row: R, column: C) -> bool
pub fn insert(&mut self, row: R, column: C) -> bool
Sets the cell at (row, column)
to true. Put another way, insert
column
to the bitset for row
.
Returns true
if this changed the matrix.
Sourcepub fn remove(&mut self, row: R, column: C) -> bool
pub fn remove(&mut self, row: R, column: C) -> bool
Sets the cell at (row, column)
to false. Put another way, delete
column
from the bitset for row
. Has no effect if row
does not
exist.
Returns true
if this changed the matrix.
Sourcepub fn clear(&mut self, row: R)
pub fn clear(&mut self, row: R)
Sets all columns at row
to false. Has no effect if row
does
not exist.
Sourcepub fn contains(&self, row: R, column: C) -> bool
pub fn contains(&self, row: R, column: C) -> bool
Do the bits from row
contain column
? Put another way, is
the matrix cell at (row, column)
true? Put yet another way,
if the matrix represents (transitive) reachability, can
row
reach column
?
Sourcepub fn union_rows(&mut self, read: R, write: R) -> bool
pub fn union_rows(&mut self, read: R, write: R) -> bool
Adds the bits from row read
to the bits from row write
, and
returns true
if anything changed.
This is used when computing transitive reachability because if
you have an edge write -> read
, because in that case
write
can reach everything that read
can (and
potentially more).
Sourcepub fn insert_all_into_row(&mut self, row: R)
pub fn insert_all_into_row(&mut self, row: R)
Insert all bits in the given row.
pub fn rows(&self) -> impl Iterator<Item = R>
Sourcepub fn iter(&self, row: R) -> impl Iterator<Item = C> + '_
pub fn iter(&self, row: R) -> impl Iterator<Item = C> + '_
Iterates through all the columns set to true in a given row of the matrix.
pub fn row(&self, row: R) -> Option<&DenseBitSet<C>>
Sourcepub fn intersect_row<Set>(&mut self, row: R, set: &Set) -> boolwhere
DenseBitSet<C>: BitRelations<Set>,
pub fn intersect_row<Set>(&mut self, row: R, set: &Set) -> boolwhere
DenseBitSet<C>: BitRelations<Set>,
Intersects row
with set
. set
can be either DenseBitSet
or
ChunkedBitSet
. Has no effect if row
does not exist.
Returns true if the row was changed.
Sourcepub fn subtract_row<Set>(&mut self, row: R, set: &Set) -> boolwhere
DenseBitSet<C>: BitRelations<Set>,
pub fn subtract_row<Set>(&mut self, row: R, set: &Set) -> boolwhere
DenseBitSet<C>: BitRelations<Set>,
Subtracts set
from row
. set
can be either DenseBitSet
or
ChunkedBitSet
. Has no effect if row
does not exist.
Returns true if the row was changed.
Sourcepub fn union_row<Set>(&mut self, row: R, set: &Set) -> boolwhere
DenseBitSet<C>: BitRelations<Set>,
pub fn union_row<Set>(&mut self, row: R, set: &Set) -> boolwhere
DenseBitSet<C>: BitRelations<Set>,
Unions row
with set
. set
can be either DenseBitSet
or
ChunkedBitSet
.
Returns true if the row was changed.
Trait Implementations§
Source§impl<R, C> Clone for SparseBitMatrix<R, C>
impl<R, C> Clone for SparseBitMatrix<R, C>
Source§fn clone(&self) -> SparseBitMatrix<R, C>
fn clone(&self) -> SparseBitMatrix<R, C>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read more