pub mod cpu;
#[cfg(feature = "gpu")]
pub mod gpu;
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct Bwt {
packed: Vec<u8>,
text_len: usize,
}
impl Bwt {
pub(crate) fn from_unpacked(data: Vec<u8>) -> Self {
let n = data.len();
let mut packed = vec![0u8; n.div_ceil(2)];
for (i, &b) in data.iter().enumerate() {
if i.is_multiple_of(2) {
packed[i / 2] = b & 0xF;
} else {
packed[i / 2] |= (b & 0xF) << 4;
}
}
Self {
packed,
text_len: n,
}
}
#[inline]
pub fn get(&self, i: usize) -> u8 {
if i.is_multiple_of(2) {
self.packed[i / 2] & 0xF
} else {
(self.packed[i / 2] >> 4) & 0xF
}
}
pub fn iter_chars(&self) -> impl Iterator<Item = u8> + '_ {
(0..self.text_len).map(move |i| self.get(i))
}
pub fn to_u32_vec(&self) -> Vec<u32> {
self.iter_chars().map(|b| b as u32).collect()
}
pub fn len(&self) -> usize {
self.text_len
}
pub fn is_empty(&self) -> bool {
self.text_len == 0
}
}