pub struct BitVector { /* private fields */ }Expand description
An immutable bit array supporting, rank, select, and related queries.
This structure contains RawVector, which is in turn contains Vec.
Because most queries require separate support structures, the bit array itself is immutable.
Conversions between BitVector and RawVector are possible using the From trait.
The maximum length of the vector is approximately usize::MAX bits.
Conversions between various BitVec types are possible using the From trait.
BitVector implements the following simple_sds traits:
- Basic functionality:
BitVec - Queries and operations:
Rank,Select,PredSucc,SelectZero - Serialization:
Serialize
See rank_support and select_support for algorithmic details on rank/select queries.
Predecessor and successor queries depend on both support structures.
The support structures are serialized as Option and hence may be missing.
When BitVector is used as a part of another structure, the user should enable the required support structures after loading.
This makes interoperation with other libraries easier, as the other library only has to serialize the bitvector itself.
Enabling support structures is fast if they were present in the serialized data.
§Examples
use simple_sds_sbwt::bit_vector::BitVector;
use simple_sds_sbwt::ops::{BitVec, Rank, Select, SelectZero, PredSucc};
use simple_sds_sbwt::raw_vector::{RawVector, AccessRaw};
let mut data = RawVector::with_len(137, false);
data.set_bit(1, true); data.set_bit(33, true); data.set_bit(95, true); data.set_bit(123, true);
let mut bv = BitVector::from(data);
// BitVec
assert_eq!(bv.len(), 137);
assert!(!bv.is_empty());
assert_eq!(bv.count_ones(), 4);
assert!(bv.get(33));
assert!(!bv.get(34));
for (index, value) in bv.iter().enumerate() {
assert_eq!(value, bv.get(index));
}
// Rank
bv.enable_rank();
assert!(bv.supports_rank());
assert_eq!(bv.rank(33), 1);
assert_eq!(bv.rank(34), 2);
assert_eq!(bv.rank_zero(65), 63);
// Select
bv.enable_select();
assert!(bv.supports_select());
assert_eq!(bv.select(1), Some(33));
let mut iter = bv.select_iter(2);
assert_eq!(iter.next(), Some((2, 95)));
assert_eq!(iter.next(), Some((3, 123)));
assert!(iter.next().is_none());
let v: Vec<(usize, usize)> = bv.one_iter().collect();
assert_eq!(v, vec![(0, 1), (1, 33), (2, 95), (3, 123)]);
// SelectZero
bv.enable_select_zero();
assert!(bv.supports_select_zero());
assert_eq!(bv.select_zero(2), Some(3));
let v: Vec<(usize, usize)> = bv.zero_iter().take(4).collect();
assert_eq!(v, vec![(0, 0), (1, 2), (2, 3), (3, 4)]);
// PredSucc
bv.enable_pred_succ();
assert!(bv.supports_pred_succ());
assert!(bv.predecessor(0).next().is_none());
assert_eq!(bv.predecessor(1).next(), Some((0, 1)));
assert_eq!(bv.predecessor(2).next(), Some((0, 1)));
assert_eq!(bv.successor(122).next(), Some((3, 123)));
assert_eq!(bv.successor(123).next(), Some((3, 123)));
assert!(bv.successor(124).next().is_none());§Notes
BitVectornever panics from I/O errors.
Implementations§
Source§impl BitVector
impl BitVector
Sourcepub fn copy_bit_vec<'a, T: BitVec<'a> + Select<'a>>(source: &'a T) -> Self
pub fn copy_bit_vec<'a, T: BitVec<'a> + Select<'a>>(source: &'a T) -> Self
Returns a copy of the source bitvector as BitVector.
The copy is created by iterating over the set bits using Select::one_iter.
From implementations from other bitvector types should generally use this function.
§Examples
use simple_sds_sbwt::bit_vector::BitVector;
use simple_sds_sbwt::ops::BitVec;
use std::iter::FromIterator;
let source: Vec<bool> = vec![true, false, true, true, false, true, true, false];
let bv = BitVector::from_iter(source);
let copy = BitVector::copy_bit_vec(&bv);
assert_eq!(copy.len(), bv.len());
assert_eq!(copy.count_ones(), bv.count_ones());Trait Implementations§
Source§impl<'a> BitVec<'a> for BitVector
impl<'a> BitVec<'a> for BitVector
Source§fn len(&self) -> usize
fn len(&self) -> usize
Source§fn count_ones(&self) -> usize
fn count_ones(&self) -> usize
Source§fn count_zeros(&self) -> usize
fn count_zeros(&self) -> usize
Source§impl From<BitVector> for SparseVector
impl From<BitVector> for SparseVector
Source§impl From<SparseVector> for BitVector
impl From<SparseVector> for BitVector
Source§fn from(source: SparseVector) -> Self
fn from(source: SparseVector) -> Self
Source§impl FromIterator<bool> for BitVector
impl FromIterator<bool> for BitVector
Source§impl<'a> PredSucc<'a> for BitVector
impl<'a> PredSucc<'a> for BitVector
Source§type OneIter = OneIter<'a, Identity>
type OneIter = OneIter<'a, Identity>
Source§fn supports_pred_succ(&self) -> bool
fn supports_pred_succ(&self) -> bool
true if predecessor/successor support has been enabled.Source§fn enable_pred_succ(&mut self)
fn enable_pred_succ(&mut self)
Source§impl<'a> Rank<'a> for BitVector
impl<'a> Rank<'a> for BitVector
Source§impl<'a> Select<'a> for BitVector
impl<'a> Select<'a> for BitVector
Source§type OneIter = OneIter<'a, Identity>
type OneIter = OneIter<'a, Identity>
Source§fn supports_select(&self) -> bool
fn supports_select(&self) -> bool
true if select support has been enabled.Source§fn enable_select(&mut self)
fn enable_select(&mut self)
Source§impl<'a> SelectZero<'a> for BitVector
impl<'a> SelectZero<'a> for BitVector
Source§type ZeroIter = OneIter<'a, Complement>
type ZeroIter = OneIter<'a, Complement>
Source§fn supports_select_zero(&self) -> bool
fn supports_select_zero(&self) -> bool
true if select support has been enabled for the complement.