Struct sucds::bit_vectors::bit_vector::BitVector
source · pub struct BitVector { /* private fields */ }
Expand description
Updatable bit vector in a plain format, supporting some utilities such as chunking and predecessor queries.
Examples
use sucds::bit_vectors::BitVector;
let mut bv = BitVector::new();
bv.push_bit(true);
bv.push_bit(false);
assert_eq!(bv.len(), 2);
assert_eq!(bv.get_bit(0), Some(true));
bv.set_bit(0, false)?;
assert_eq!(bv.get_bit(0), Some(false));
Credits
This is a yet another Rust port of succinct::bit_vector.
Implementations§
source§impl BitVector
impl BitVector
sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new empty vector.
Examples
use sucds::bit_vectors::BitVector;
let bv = BitVector::new();
assert_eq!(bv.len(), 0);
sourcepub fn with_capacity(capa: usize) -> Self
pub fn with_capacity(capa: usize) -> Self
sourcepub fn from_bit(bit: bool, len: usize) -> Self
pub fn from_bit(bit: bool, len: usize) -> Self
Creates a new vector that stores len
bits,
where each bit is initialized by bit
.
Arguments
bit
: Bit value used for intinialization.len
: Number of elements.
Examples
use sucds::bit_vectors::BitVector;
let bv = BitVector::from_bit(false, 5);
assert_eq!(bv.len(), 5);
assert_eq!(bv.get_bit(0), Some(false));
sourcepub fn from_bits<I>(bits: I) -> Selfwhere
I: IntoIterator<Item = bool>,
pub fn from_bits<I>(bits: I) -> Selfwhere I: IntoIterator<Item = bool>,
sourcepub fn get_bit(&self, pos: usize) -> Option<bool>
pub fn get_bit(&self, pos: usize) -> Option<bool>
Returns the pos
-th bit, or None
if out of bounds.
Arguments
pos
: Bit position.
Examples
use sucds::bit_vectors::BitVector;
let bv = BitVector::from_bits([true, false, false]);
assert_eq!(bv.get_bit(0), Some(true));
assert_eq!(bv.get_bit(1), Some(false));
assert_eq!(bv.get_bit(2), Some(false));
assert_eq!(bv.get_bit(3), None);
sourcepub fn get_bits(&self, pos: usize, len: usize) -> Option<usize>
pub fn get_bits(&self, pos: usize, len: usize) -> Option<usize>
Returns the len
bits starting at the pos
-th bit, or None
if
len
is greater thanWORD_LEN
, orself.len() < pos + len
.
Arguments
pos
: Bit position.len
: Number of bits extracted.
Examples
use sucds::bit_vectors::BitVector;
let bv = BitVector::from_bits([true, false, true, false]);
assert_eq!(bv.get_bits(1, 2), Some(0b10));
assert_eq!(bv.get_bits(2, 3), None);
sourcepub fn set_bits(&mut self, pos: usize, bits: usize, len: usize) -> Result<()>
pub fn set_bits(&mut self, pos: usize, bits: usize, len: usize) -> Result<()>
Updates the len
bits starting at the pos
-th bit to bits
.
Arguments
pos
: Bit position.bits
: Bit chunk set.len
: Number of bits of the chunk.
Errors
An error is returned if
len
is greater thanWORD_LEN
, orself.len() < pos + len
.
Notes
If bits
has active bits other than the lowest len
bits,
these will be trancated automatically.
Examples
use sucds::bit_vectors::BitVector;
let mut bv = BitVector::from_bit(false, 4);
bv.set_bits(1, 0b11, 2)?;
assert_eq!(bv.get_bits(0, 4), Some(0b0110));
sourcepub fn push_bits(&mut self, bits: usize, len: usize) -> Result<()>
pub fn push_bits(&mut self, bits: usize, len: usize) -> Result<()>
Pushes bits
of len
bits at the end.
Arguments
bits
: Bit chunk set.len
: Number of bits of the chunk.
Errors
It will return an error if
len
is greater thanWORD_LEN
.
Notes
If bits
has active bits other than the lowest len
bits,
these will be trancated automatically.
Examples
use sucds::bit_vectors::BitVector;
let mut bv = BitVector::new();
bv.push_bits(0b11, 2)?;
bv.push_bits(0b101, 3)?;
assert_eq!(bv.get_bits(0, 5), Some(0b10111));
sourcepub fn predecessor1(&self, pos: usize) -> Option<usize>
pub fn predecessor1(&self, pos: usize) -> Option<usize>
Returns the largest bit position pred
such that pred <= pos
and the pred
-th bit is set, or
None
if not found or self.len() <= pos
.
Arguments
pos
: Bit position.
Complexity
- Linear
Examples
use sucds::bit_vectors::BitVector;
let bv = BitVector::from_bits([false, true, false, true]);
assert_eq!(bv.predecessor1(3), Some(3));
assert_eq!(bv.predecessor1(2), Some(1));
assert_eq!(bv.predecessor1(1), Some(1));
assert_eq!(bv.predecessor1(0), None);
sourcepub fn predecessor0(&self, pos: usize) -> Option<usize>
pub fn predecessor0(&self, pos: usize) -> Option<usize>
Returns the largest bit position pred
such that pred <= pos
and the pred
-th bit is unset, or
None
if not found or self.len() <= pos
.
Arguments
pos
: Bit position.
Complexity
- Linear
Examples
use sucds::bit_vectors::BitVector;
let bv = BitVector::from_bits([true, false, true, false]);
assert_eq!(bv.predecessor0(3), Some(3));
assert_eq!(bv.predecessor0(2), Some(1));
assert_eq!(bv.predecessor0(1), Some(1));
assert_eq!(bv.predecessor0(0), None);
sourcepub fn successor1(&self, pos: usize) -> Option<usize>
pub fn successor1(&self, pos: usize) -> Option<usize>
Returns the smallest bit position succ
such that succ >= pos
and the succ
-th bit is set, or
None
if not found or self.len() <= pos
.
Arguments
pos
: Bit position.
Complexity
- Linear
Examples
use sucds::bit_vectors::BitVector;
let bv = BitVector::from_bits([true, false, true, false]);
assert_eq!(bv.successor1(0), Some(0));
assert_eq!(bv.successor1(1), Some(2));
assert_eq!(bv.successor1(2), Some(2));
assert_eq!(bv.successor1(3), None);
sourcepub fn successor0(&self, pos: usize) -> Option<usize>
pub fn successor0(&self, pos: usize) -> Option<usize>
Returns the smallest bit position succ
such that succ >= pos
and the succ
-th bit is unset, or
None
if not found or self.len() <= pos
.
Arguments
pos
: Bit position.
Complexity
- Linear
Examples
use sucds::bit_vectors::BitVector;
let bv = BitVector::from_bits([false, true, false, true]);
assert_eq!(bv.successor0(0), Some(0));
assert_eq!(bv.successor0(1), Some(2));
assert_eq!(bv.successor0(2), Some(2));
assert_eq!(bv.successor0(3), None);
sourcepub const fn iter(&self) -> Iter<'_> ⓘ
pub const fn iter(&self) -> Iter<'_> ⓘ
Creates an iterator for enumerating bits.
Examples
use sucds::bit_vectors::BitVector;
let bv = BitVector::from_bits([false, true, false]);
let mut it = bv.iter();
assert_eq!(it.next(), Some(false));
assert_eq!(it.next(), Some(true));
assert_eq!(it.next(), Some(false));
assert_eq!(it.next(), None);
sourcepub fn unary_iter(&self, pos: usize) -> UnaryIter<'_> ⓘ
pub fn unary_iter(&self, pos: usize) -> UnaryIter<'_> ⓘ
Creates an iterator for enumerating positions of set bits, starting at bit position pos
.
Arguments
pos
: Bit position.
Examples
use sucds::bit_vectors::BitVector;
let bv = BitVector::from_bits([true, true, false, true]);
let mut it = bv.unary_iter(1);
assert_eq!(it.next(), Some(1));
assert_eq!(it.next(), Some(3));
assert_eq!(it.next(), None);
sourcepub fn get_word64(&self, pos: usize) -> Option<usize>
pub fn get_word64(&self, pos: usize) -> Option<usize>
Returns self.get_bits(pos, 64)
but it can extend further self.len()
,
padding with zeros. If self.len() <= pos
, None
is returned.
Arguments
pos
: Bit position.
Examples
use sucds::bit_vectors::BitVector;
let bv = BitVector::from_bits([true, false, true, false]);
assert_eq!(bv.get_word64(1), Some(0b10));
assert_eq!(bv.get_bits(1, 64), None); // out of bounds
sourcepub fn capacity(&self) -> usize
pub fn capacity(&self) -> usize
Returns the total number of bits it can hold without reallocating.
sourcepub fn shrink_to_fit(&mut self)
pub fn shrink_to_fit(&mut self)
Shrinks the capacity of the vector as much as possible.
Trait Implementations§
source§impl Access for BitVector
impl Access for BitVector
source§fn access(&self, pos: usize) -> Option<bool>
fn access(&self, pos: usize) -> Option<bool>
Returns the pos
-th bit, or None
if out of bounds.
Arguments
pos
: Bit position.
Examples
use sucds::bit_vectors::{BitVector, Access};
let bv = BitVector::from_bits([true, false, false]);
assert_eq!(bv.access(0), Some(true));
assert_eq!(bv.access(1), Some(false));
assert_eq!(bv.access(2), Some(false));
assert_eq!(bv.access(3), None);
source§impl Build for BitVector
impl Build for BitVector
source§fn build_from_bits<I>(
bits: I,
_with_rank: bool,
_with_select1: bool,
_with_select0: bool
) -> Result<Self>where
I: IntoIterator<Item = bool>,
Self: Sized,
fn build_from_bits<I>( bits: I, _with_rank: bool, _with_select1: bool, _with_select0: bool ) -> Result<Self>where I: IntoIterator<Item = bool>, Self: Sized,
source§impl Extend<bool> for BitVector
impl Extend<bool> for BitVector
source§fn extend<I>(&mut self, bits: I)where
I: IntoIterator<Item = bool>,
fn extend<I>(&mut self, bits: I)where I: IntoIterator<Item = bool>,
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
)source§impl PartialEq for BitVector
impl PartialEq for BitVector
source§impl Rank for BitVector
impl Rank for BitVector
source§fn rank1(&self, pos: usize) -> Option<usize>
fn rank1(&self, pos: usize) -> Option<usize>
Returns the number of ones from the 0-th bit to the pos-1
-th bit, or
None
if self.len() < pos
.
Complexity
- Linear
Examples
use sucds::bit_vectors::{BitVector, Rank};
let bv = BitVector::from_bits([true, false, false, true]);
assert_eq!(bv.rank1(1), Some(1));
assert_eq!(bv.rank1(2), Some(1));
assert_eq!(bv.rank1(3), Some(1));
assert_eq!(bv.rank1(4), Some(2));
assert_eq!(bv.rank1(5), None);
source§fn rank0(&self, pos: usize) -> Option<usize>
fn rank0(&self, pos: usize) -> Option<usize>
Returns the number of zeros from the 0-th bit to the pos-1
-th bit, or
None
if self.len() < pos
.
Complexity
- Linear
Examples
use sucds::bit_vectors::{BitVector, Rank};
let bv = BitVector::from_bits([true, false, false, true]);
assert_eq!(bv.rank0(1), Some(0));
assert_eq!(bv.rank0(2), Some(1));
assert_eq!(bv.rank0(3), Some(2));
assert_eq!(bv.rank0(4), Some(2));
assert_eq!(bv.rank0(5), None);
source§impl Select for BitVector
impl Select for BitVector
source§fn select1(&self, k: usize) -> Option<usize>
fn select1(&self, k: usize) -> Option<usize>
Searches the position of the k
-th bit set, or
None
if k
is no less than the number of ones.
Complexity
- Linear
Examples
use sucds::bit_vectors::{BitVector, Select};
let bv = BitVector::from_bits([true, false, false, true]);
assert_eq!(bv.select1(0), Some(0));
assert_eq!(bv.select1(1), Some(3));
assert_eq!(bv.select1(2), None);
source§fn select0(&self, k: usize) -> Option<usize>
fn select0(&self, k: usize) -> Option<usize>
Searches the position of the k
-th bit unset, or
None
if k
is no less than the number of zeros.
Complexity
- Linear
Examples
use sucds::bit_vectors::{BitVector, Select};
let bv = BitVector::from_bits([true, false, false, true]);
assert_eq!(bv.select0(0), Some(1));
assert_eq!(bv.select0(1), Some(2));
assert_eq!(bv.select0(2), None);