Struct vers_vecs::bit_vec::fast_rs_vec::RsVec
source · pub struct RsVec { /* private fields */ }Expand description
A bitvector that supports constant-time rank and select queries and is optimized for fast queries.
The bitvector is stored as a vector of u64s. The bit-vector stores meta-data for constant-time
rank and select queries, which takes sub-linear additional space. The space overhead is
28 bits per 512 bits of user data (~5.47%).
§Example
use vers_vecs::{BitVec, RsVec};
let mut bit_vec = BitVec::new();
bit_vec.append_word(u64::MAX);
let rs_vec = RsVec::from_bit_vec(bit_vec);
assert_eq!(rs_vec.rank1(64), 64);
assert_eq!(rs_vec.select1(64), 64);Implementations§
source§impl RsVec
impl RsVec
sourcepub fn from_bit_vec(vec: BitVec) -> RsVec
pub fn from_bit_vec(vec: BitVec) -> RsVec
sourcepub fn rank0(&self, pos: usize) -> usize
pub fn rank0(&self, pos: usize) -> usize
Return the 0-rank of the bit at the given position. The 0-rank is the number of 0-bits in the vector up to but excluding the bit at the given position. Calling this function with an index larger than the length of the bit-vector will report the total number of 0-bits in the bit-vector.
§Parameters
pos: The position of the bit to return the rank of.
sourcepub fn rank1(&self, pos: usize) -> usize
pub fn rank1(&self, pos: usize) -> usize
Return the 1-rank of the bit at the given position. The 1-rank is the number of 1-bits in the vector up to but excluding the bit at the given position. Calling this function with an index larger than the length of the bit-vector will report the total number of 1-bits in the bit-vector.
§Parameters
pos: The position of the bit to return the rank of.
sourcepub fn select0(&self, rank: usize) -> usize
pub fn select0(&self, rank: usize) -> usize
Return the position of the 0-bit with the given rank. See rank0.
The following holds:
select0(rank0(pos)) == pos
If the rank is larger than the number of 0-bits in the vector, the vector length is returned.
sourcepub fn select1(&self, rank: usize) -> usize
pub fn select1(&self, rank: usize) -> usize
Return the position of the 1-bit with the given rank. See rank1.
The following holds:
select1(rank1(pos)) == pos
If the rank is larger than the number of 1-bits in the bit-vector, the vector length is returned.
sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Return the length of the vector, i.e. the number of bits it contains.
sourcepub fn get(&self, pos: usize) -> Option<u64>
pub fn get(&self, pos: usize) -> Option<u64>
Return the bit at the given position. The bit takes the least significant
bit of the returned u64 word.
If the position is larger than the length of the vector, None is returned.
sourcepub fn get_unchecked(&self, pos: usize) -> u64
pub fn get_unchecked(&self, pos: usize) -> u64
Return the bit at the given position. The bit takes the least significant bit of the returned u64 word.
§Panics
This function may panic if pos >= self.len() (alternatively, it may return garbage).
sourcepub fn get_bits(&self, pos: usize, len: usize) -> Option<u64>
pub fn get_bits(&self, pos: usize, len: usize) -> Option<u64>
Return multiple bits at the given position. The number of bits to return is given by len.
At most 64 bits can be returned.
If the position at the end of the query is larger than the length of the vector,
None is returned (even if the query partially overlaps with the vector).
If the length of the query is larger than 64, None is returned.
sourcepub fn get_bits_unchecked(&self, pos: usize, len: usize) -> u64
pub fn get_bits_unchecked(&self, pos: usize, len: usize) -> u64
Return multiple bits at the given position. The number of bits to return is given by len.
At most 64 bits can be returned.
This function is always inlined, because it gains a lot from loop optimization and can utilize the processor pre-fetcher better if it is.
§Errors
If the length of the query is larger than 64, unpredictable data will be returned.
Use get_bits to properly handle this case with an Option.
§Panics
If the position or interval is larger than the length of the vector, the function will either return unpredictable data, or panic.
sourcepub fn iter0(&self) -> SelectIter<'_, true> ⓘ
pub fn iter0(&self) -> SelectIter<'_, true> ⓘ
Get an iterator over the 0-bits in the vector that uses the select data structure to speed
up iteration.
It is faster than calling select0 on each rank, because the iterator
exploits the linear access pattern.
See SelectIter for more information.
sourcepub fn iter1(&self) -> SelectIter<'_, false> ⓘ
pub fn iter1(&self) -> SelectIter<'_, false> ⓘ
Get an iterator over the 1-bits in the vector that uses the select data structure to speed
up iteration.
It is faster than calling select1 on each rank, because the iterator
exploits the linear access pattern.
See SelectIter for more information.
Trait Implementations§
source§impl<'de> Deserialize<'de> for RsVec
impl<'de> Deserialize<'de> for RsVec
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
source§impl<'a> IntoIterator for &'a RsVec
impl<'a> IntoIterator for &'a RsVec
source§impl<'a> IntoIterator for &'a mut RsVec
impl<'a> IntoIterator for &'a mut RsVec
source§impl IntoIterator for RsVec
impl IntoIterator for RsVec
Auto Trait Implementations§
impl Freeze for RsVec
impl RefUnwindSafe for RsVec
impl Send for RsVec
impl Sync for RsVec
impl Unpin for RsVec
impl UnwindSafe for RsVec
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§default unsafe fn clone_to_uninit(&self, dst: *mut T)
default unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit)