pub const VC_LEN: usize = 6; pub const LETTER_BITS: usize = 3; pub const NUMBER_BITS: usize = 5; pub const NUM_POWER: usize = 32; pub const MASK: u8 = 0x07; pub const COUNT_MASK: u8 = 0x1F;
#[derive(Clone,Copy,Default,Debug,Eq,PartialEq)]
pub struct BWTRange {
pub l: u64,
pub h: u64
}
pub trait BWT {
fn load_vector(&mut self, bwt: Vec<u8>);
fn load_numpy_file(&mut self, filename: &str) -> std::io::Result<()>;
fn get_symbol_count(&self, symbol: u8) -> u64;
fn get_total_size(&self) -> u64;
unsafe fn constrain_range(&self, sym: u8, input_range: &BWTRange) -> BWTRange;
#[inline]
fn count_kmer(&self, kmer: &[u8]) -> u64 {
assert!(kmer.iter().all(|&v| v < VC_LEN as u8));
let mut ret: BWTRange = BWTRange {
l: 0,
h: self.get_total_size()
};
for c in kmer.iter().rev() {
if ret.h == ret.l {
return 0;
}
unsafe {
ret = self.constrain_range(*c, &ret);
}
}
ret.h-ret.l
}
}