#![doc = include_str!("../README.md")]
pub use mem_dbg;
pub mod perf_and_test_utils;
pub mod qvector;
use std::{
marker::PhantomData,
ops::{Range, RangeBounds},
};
use num_traits::AsPrimitive;
pub use qvector::QVector;
pub use qvector::QVectorBuilder;
pub mod bitvector;
pub use bitvector::rs_narrow::RSNarrow;
pub use bitvector::rs_wide::RSWide;
pub use bitvector::BitVector;
pub use bitvector::BitVectorMut;
pub mod utils;
pub use qvector::rs_qvector::RSQVector;
pub use qvector::rs_qvector::RSQVector256;
pub use qvector::rs_qvector::RSQVector512;
pub mod quadwt;
pub use quadwt::huffqwt::HuffQWaveletTree;
pub use quadwt::QWaveletTree;
pub use quadwt::WTIndexable;
pub mod binwt;
pub use binwt::WaveletTree;
pub mod darray;
pub use darray::DArray;
pub type QWT256<T> = QWaveletTree<T, RSQVector256>;
pub type QWT512<T> = QWaveletTree<T, RSQVector512>;
pub type QWT256Pfs<T> = QWaveletTree<T, RSQVector256, true>;
pub type QWT512Pfs<T> = QWaveletTree<T, RSQVector512, true>;
pub type HQWT256<T> = HuffQWaveletTree<T, RSQVector256>;
pub type HQWT512<T> = HuffQWaveletTree<T, RSQVector512>;
pub type HQWT256Pfs<T> = HuffQWaveletTree<T, RSQVector256, true>;
pub type HQWT512Pfs<T> = HuffQWaveletTree<T, RSQVector512, true>;
pub type WT<T> = WaveletTree<T, RSWide>;
pub type HWT<T> = WaveletTree<T, RSWide, true>;
use num_traits::Unsigned;
pub trait AccessUnsigned {
type Item: Unsigned;
fn get(&self, i: usize) -> Option<Self::Item>;
unsafe fn get_unchecked(&self, i: usize) -> Self::Item;
}
pub trait RankUnsigned: AccessUnsigned {
fn rank(&self, symbol: Self::Item, i: usize) -> Option<usize>;
unsafe fn rank_unchecked(&self, symbol: Self::Item, i: usize) -> usize;
}
pub trait SelectUnsigned: AccessUnsigned {
fn select(&self, symbol: Self::Item, i: usize) -> Option<usize>;
unsafe fn select_unchecked(&self, symbol: Self::Item, i: usize) -> usize;
}
pub trait OccsRangeUnsigned: AccessUnsigned {
type Iter<'a>: Iterator<Item = (Self::Item, usize)>
where
Self: 'a;
fn occs_range<R: RangeBounds<usize>>(&self, range: R) -> Option<Self::Iter<'_>>;
unsafe fn occs_range_unchecked(&self, range: Range<usize>) -> Self::Iter<'_>;
}
pub trait AccessBin {
fn get(&self, i: usize) -> Option<bool>;
unsafe fn get_unchecked(&self, i: usize) -> bool;
}
pub trait RankBin {
#[inline]
fn rank0(&self, i: usize) -> Option<usize> {
if let Some(k) = self.rank1(i) {
return Some(i - k);
}
None
}
fn rank1(&self, i: usize) -> Option<usize>;
fn prefetch(&self, i: usize);
unsafe fn rank1_unchecked(&self, i: usize) -> usize;
#[inline]
unsafe fn rank0_unchecked(&self, i: usize) -> usize {
i - self.rank1_unchecked(i)
}
fn count_zeros(&self) -> usize;
}
pub trait SelectBin {
fn select1(&self, i: usize) -> Option<usize>;
unsafe fn select1_unchecked(&self, i: usize) -> usize;
fn select0(&self, i: usize) -> Option<usize>;
unsafe fn select0_unchecked(&self, i: usize) -> usize;
}
pub trait AccessQuad {
fn get(&self, i: usize) -> Option<u8>;
unsafe fn get_unchecked(&self, i: usize) -> u8;
}
pub trait RankQuad {
fn rank(&self, symbol: u8, i: usize) -> Option<usize>;
unsafe fn rank_unchecked(&self, symbol: u8, i: usize) -> usize;
}
pub trait SelectQuad {
fn select(&self, symbol: u8, i: usize) -> Option<usize>;
unsafe fn select_unchecked(&self, symbol: u8, i: usize) -> usize;
}
pub trait WTSupport: AccessQuad + RankQuad + SelectQuad {
fn occs(&self, symbol: u8) -> Option<usize>;
unsafe fn occs_unchecked(&self, symbol: u8) -> usize;
fn occs_smaller(&self, symbol: u8) -> Option<usize>;
unsafe fn rank_block_unchecked(&self, symbol: u8, i: usize) -> usize;
unsafe fn occs_smaller_unchecked(&self, symbol: u8) -> usize;
fn prefetch_info(&self, pos: usize);
fn prefetch_data(&self, pos: usize);
}
pub trait BinWTSupport: AccessBin + RankBin + SelectBin {}
impl<T> BinWTSupport for T where T: AccessBin + RankBin + SelectBin {}
#[derive(Debug, PartialEq)]
pub struct WTIterator<T, S: AccessUnsigned<Item = T>, Q: AsRef<S>> {
i: usize,
end: usize,
qwt: Q,
_phantom: PhantomData<(T, S)>,
}
impl<T, S: AccessUnsigned<Item = T>, Q: AsRef<S>> Iterator for WTIterator<T, S, Q>
where
T: WTIndexable,
usize: AsPrimitive<T>,
{
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
let qwt = self.qwt.as_ref();
if self.i < self.end {
self.i += 1;
Some(unsafe { qwt.get_unchecked(self.i - 1) })
} else {
None
}
}
}
impl<T, S: AccessUnsigned<Item = T>, Q: AsRef<S>> DoubleEndedIterator for WTIterator<T, S, Q>
where
T: WTIndexable,
usize: AsPrimitive<T>,
{
fn next_back(&mut self) -> Option<Self::Item> {
let qwt = self.qwt.as_ref();
if self.i < self.end {
self.end -= 1;
Some(unsafe { qwt.get_unchecked(self.end) })
} else {
None
}
}
}
impl<T, S: AccessUnsigned<Item = T>, Q: AsRef<S>> ExactSizeIterator for WTIterator<T, S, Q>
where
T: WTIndexable,
usize: AsPrimitive<T>,
{
fn len(&self) -> usize {
self.end - self.i
}
}