pub struct SparseBuilder { /* private fields */ }Expand description
Space-efficient SparseVector construction.
A SparseBuilder allocates the data structures based on universe size (bitvector length) and the number of set bits.
The set bits must then be indicated in order using SparseBuilder::set or the Extend trait.
Once the builder is full, it can be converted into a SparseVector using the TryFrom trait.
The conversion will not fail if the builder is full.
Setting a bit i fails if the builder is full or the index is too small (i < self.next_index()) or too large (i > self.universe()).
Extend::extend will panic in such situations.
§Examples
use simple_sds_sbwt::ops::BitVec;
use simple_sds_sbwt::sparse_vector::{SparseVector, SparseBuilder};
use std::convert::TryFrom;
let mut builder = SparseBuilder::new(300, 5).unwrap();
assert_eq!(builder.len(), 0);
assert_eq!(builder.capacity(), 5);
assert_eq!(builder.universe(), 300);
assert_eq!(builder.next_index(), 0);
assert!(!builder.is_full());
assert!(!builder.is_multiset());
builder.set(12);
assert_eq!(builder.len(), 1);
assert_eq!(builder.next_index(), 13);
// This will return an error because the index is too small.
let _ = builder.try_set(10);
assert_eq!(builder.len(), 1);
assert_eq!(builder.next_index(), 13);
let v: Vec<usize> = vec![24, 48, 96, 192];
builder.extend(v);
assert_eq!(builder.len(), 5);
assert!(builder.is_full());
let sv = SparseVector::try_from(builder).unwrap();
assert_eq!(sv.len(), 300);
assert_eq!(sv.count_ones(), 5);Implementations§
Source§impl SparseBuilder
impl SparseBuilder
Sourcepub fn multiset(universe: usize, ones: usize) -> SparseBuilder
pub fn multiset(universe: usize, ones: usize) -> SparseBuilder
Returns an empty SparseBuilder with multiset semantics.
§Arguments
universe: Universe size or length of the bitvector.ones: Number of bits that will be set in the bitvector.
§Examples
use simple_sds_sbwt::ops::BitVec;
use simple_sds_sbwt::sparse_vector::{SparseVector, SparseBuilder};
use std::convert::TryFrom;
let mut builder = SparseBuilder::multiset(120, 3);
assert_eq!(builder.capacity(), 3);
assert_eq!(builder.universe(), 120);
assert!(builder.is_multiset());
builder.set(12);
builder.set(24);
builder.set(24);
assert!(builder.is_full());
let sv = SparseVector::try_from(builder).unwrap();
assert_eq!(sv.len(), 120);
assert_eq!(sv.count_ones(), 3);
assert!(sv.is_multiset());Sourcepub fn is_multiset(&self) -> bool
pub fn is_multiset(&self) -> bool
Returns true if the builder is using multiset semantics.
Sourcepub fn next_index(&self) -> usize
pub fn next_index(&self) -> usize
Returns the smallest index in the bitvector that can still be set.
Sourcepub fn set(&mut self, index: usize)
pub fn set(&mut self, index: usize)
Sets the specified bit in the bitvector.
§Panics
Panics if the builder is full, if index < self.next_index(), or if index >= self.universe().
Sourcepub unsafe fn set_unchecked(&mut self, index: usize)
pub unsafe fn set_unchecked(&mut self, index: usize)
Unsafe version of SparseBuilder::set without sanity checks.
§Safety
Behavior is undefined if the builder is full, if index < self.next_index(), or if index >= self.universe().
Trait Implementations§
Source§impl Clone for SparseBuilder
impl Clone for SparseBuilder
Source§fn clone(&self) -> SparseBuilder
fn clone(&self) -> SparseBuilder
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for SparseBuilder
impl Debug for SparseBuilder
Source§impl Extend<usize> for SparseBuilder
impl Extend<usize> for SparseBuilder
Source§fn extend<T: IntoIterator<Item = usize>>(&mut self, iter: T)
fn extend<T: IntoIterator<Item = usize>>(&mut self, iter: T)
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one)