Skip to main content

RsVec

Struct 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

Source

pub fn select_iter<const ZERO: bool>(&self) -> SelectIter<'_, ZERO>

Get an iterator over the bits in the vector. The iterator will return the indices of the 0-bits or the 1-bits in the vector, depending on the constant ZERO (if true, 0-bits are returned).

It uses the select data structure to speed up iteration. It is also faster than calling select on each rank, because the iterator exploits the linear access pattern.

This method has convenience methods iter0 and iter1.

Source

pub fn into_select_iter<const ZERO: bool>(self) -> SelectIntoIter<ZERO>

Convert vector into an iterator over the bits in the vector. The iterator will return the indices of the 0-bits or the 1-bits in the vector, depending on the constant ZERO (if true, 0-bits are returned).

It uses the select data structure to speed up iteration. It is also faster than calling select on each rank, because the iterator exploits the linear access pattern.

This method has convenience methods into_iter0 and into_iter1.

Source

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.

Source

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.

Source

pub fn into_iter0(self) -> SelectIntoIter<true>

Convert vector into 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 SelectIntoIter for more information.

Source

pub fn into_iter1(self) -> SelectIntoIter<false>

Convert vector into 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 SelectIntoIter for more information.

Source§

impl RsVec

Source

pub fn select0(&self, rank: usize) -> usize

Return the position of the 0-bit with the given rank. See rank0. The following holds for all pos with 0-bits: select0(rank0(pos)) == pos

If the rank is larger than the number of 0-bits in the vector, the vector length is returned.

Source

pub fn select1(&self, rank: usize) -> usize

Return the position of the 1-bit with the given rank. See rank1. The following holds for all pos with 1-bits: select1(rank1(pos)) == pos

If the rank is larger than the number of 1-bits in the bit-vector, the vector length is returned.

Source§

impl RsVec

Source

pub fn from_bit_vec(vec: BitVec) -> RsVec

Build an RsVec from a BitVec. This will consume the BitVec. Since RsVecs are immutable, this is the only way to construct an RsVec.

§Example

See the example for RsVec.

Source

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.
Source

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.
Source

pub fn len(&self) -> usize

Return the length of the vector, i.e. the number of bits it contains.

Source

pub fn is_empty(&self) -> bool

Return whether the vector is empty.

Source

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.

Source

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).

Source

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.

Source

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.

Source

pub fn into_bit_vec(self) -> BitVec

Convert the RsVec into a BitVec. This consumes the RsVec, and discards all meta-data. Since RsVecs are innately immutable, this conversion is the only way to modify the underlying data.

§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);

let mut bit_vec = rs_vec.into_bit_vec();
bit_vec.flip_bit(32);
let rs_vec = RsVec::from_bit_vec(bit_vec);
assert_eq!(rs_vec.rank1(64), 63);
assert_eq!(rs_vec.select0(0), 32);
Source

pub fn sparse_equals<const ZERO: bool>(&self, other: &Self) -> bool

Check if two RsVecs are equal. For sparse vectors (either sparsely filled with 1-bits or 0-bits), this is faster than comparing the vectors bit by bit. Choose the value of ZERO depending on which bits are more sparse.

This method is faster than full_equals for sparse vectors beginning at roughly 1 million bits. Above 4 million bits, this method becomes faster than full equality in general.

§Parameters
  • other: The other RsVec to compare to.
  • ZERO: Whether to compare the sparse 0-bits (true) or the sparse 1-bits (false).
§Returns

true if the vectors’ contents are equal, false otherwise.

Source

pub fn full_equals(&self, other: &Self) -> bool

Check if two RsVecs are equal. This compares limb by limb. This is usually faster than a sparse_equals call for small vectors.

§Parameters
  • other: The other RsVec to compare to.
§Returns

true if the vectors’ contents are equal, false otherwise.

Source

pub fn heap_size(&self) -> usize

Returns the number of bytes used on the heap for this vector. This does not include allocated space that is not used (e.g. by the allocation behavior of Vec).

Source§

impl RsVec

Source

pub fn iter(&self) -> RsVecRefIter<'_>

Returns an iterator over the elements of RsVec. The iterator returns u64 elements.

Trait Implementations§

Source§

impl Clone for RsVec

Source§

fn clone(&self) -> RsVec

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for RsVec

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for RsVec

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl FlatType for RsVec
where Vec<u64>: MemSize + FlatType, usize: MemSize + FlatType, Vec<BlockDescriptor>: MemSize + FlatType, Vec<SuperBlockDescriptor>: MemSize + FlatType, Vec<SelectSuperBlockDescriptor>: MemSize + FlatType,

Source§

impl From<BitVec> for RsVec

Source§

fn from(vec: BitVec) -> Self

Build an RsVec from a BitVec. This will consume the BitVec. Since RsVecs are immutable, this is the only way to construct an RsVec.

§Example

See the example for RsVec.

Source§

impl<const BLOCK_SIZE: usize> From<BpTree<BLOCK_SIZE>> for RsVec

Source§

fn from(value: BpTree<BLOCK_SIZE>) -> Self

Converts to this type from the input type.
Source§

impl From<RsVec> for BitVec

Source§

fn from(value: RsVec) -> Self

Converts to this type from the input type.
Source§

impl<'a> IntoIterator for &'a RsVec

Source§

type Item = u64

The type of the elements being iterated over.
Source§

type IntoIter = RsVecRefIter<'a>

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
Source§

impl<'a> IntoIterator for &'a mut RsVec

Source§

type Item = u64

The type of the elements being iterated over.
Source§

type IntoIter = RsVecRefIter<'a>

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
Source§

impl IntoIterator for RsVec

Source§

type Item = u64

The type of the elements being iterated over.
Source§

type IntoIter = RsVecIter

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
Source§

impl MemDbgImpl for RsVec
where Vec<u64>: MemDbgImpl + FlatType, usize: MemDbgImpl + FlatType, Vec<BlockDescriptor>: MemDbgImpl + FlatType, Vec<SuperBlockDescriptor>: MemDbgImpl + FlatType, Vec<SelectSuperBlockDescriptor>: MemDbgImpl + FlatType,

Source§

fn _mem_dbg_rec_on( &self, _memdbg_writer: &mut impl Write, _memdbg_total_size: usize, _memdbg_max_depth: usize, _memdbg_prefix: &mut String, _memdbg_is_last: bool, _memdbg_flags: DbgFlags, _memdbg_refs: &mut HashSet<usize>, ) -> Result

Source§

fn _mem_dbg_depth_on( &self, writer: &mut impl Write, total_size: usize, max_depth: usize, prefix: &mut String, field_name: Option<&str>, is_last: bool, padded_size: usize, flags: DbgFlags, dbg_refs: &mut HashSet<usize>, ) -> Result<(), Error>

Source§

fn _mem_dbg_depth_on_impl( &self, writer: &mut impl Write, total_size: usize, max_depth: usize, prefix: &mut String, field_name: Option<&str>, is_last: bool, padded_size: usize, flags: DbgFlags, dbg_refs: &mut HashSet<usize>, ref_display: RefDisplay, ) -> Result<(), Error>

Internal implementation for depth display. Read more
Source§

impl MemSize for RsVec
where Vec<u64>: MemSize + FlatType, usize: MemSize + FlatType, Vec<BlockDescriptor>: MemSize + FlatType, Vec<SuperBlockDescriptor>: MemSize + FlatType, Vec<SelectSuperBlockDescriptor>: MemSize + FlatType,

Source§

fn mem_size_rec( &self, _memsize_flags: SizeFlags, _memsize_refs: &mut HashMap<usize, usize>, ) -> usize

Recursive implementation that tracks visited references for deduplication. Read more
Source§

fn mem_size(&self, flags: SizeFlags) -> usize

Returns the (recursively computed) overall memory size of the structure in bytes.
Source§

impl PartialEq for RsVec

Source§

fn eq(&self, other: &Self) -> bool

Check if two RsVecs are equal. This method calls sparse_equals if the vector has more than 4’000’000 bits, and full_equals otherwise.

This was determined with benchmarks on an x86_64 machine, on which sparse_equals outperforms full_equals consistently above this threshold.

§Parameters
  • other: The other RsVec to compare to.
§Returns

true if the vectors’ contents are equal, false otherwise.

1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for RsVec

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

§

impl Freeze for RsVec

§

impl RefUnwindSafe for RsVec

§

impl Send for RsVec

§

impl Sync for RsVec

§

impl Unpin for RsVec

§

impl UnsafeUnpin for RsVec

§

impl UnwindSafe for RsVec

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> MemDbg for T
where T: MemDbgImpl,

Source§

fn mem_dbg(&self, flags: DbgFlags) -> Result<(), Error>

Available on crate feature std only.
Writes to stderr debug info about the structure memory usage, expanding all levels of nested structures.
Source§

fn mem_dbg_on( &self, writer: &mut impl Write, flags: DbgFlags, ) -> Result<(), Error>

Writes to a core::fmt::Write debug info about the structure memory usage, expanding all levels of nested structures.
Source§

fn mem_dbg_depth(&self, max_depth: usize, flags: DbgFlags) -> Result<(), Error>

Available on crate feature std only.
Writes to stderr debug info about the structure memory usage as mem_dbg, but expanding only up to max_depth levels of nested structures.
Source§

fn mem_dbg_depth_on( &self, writer: &mut impl Write, max_depth: usize, flags: DbgFlags, ) -> Result<(), Error>

Writes to a core::fmt::Write debug info about the structure memory usage as mem_dbg_on, but expanding only up to max_depth levels of nested structures.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,