pub(crate) const BASE_TO_BIT_LUT: [u64; 256] = {
let mut lut = [u64::MAX; 256];
lut[b'A' as usize] = 1;
lut[b'a' as usize] = 1;
lut[b'G' as usize] = 1;
lut[b'g' as usize] = 1;
lut[b'T' as usize] = 0;
lut[b't' as usize] = 0;
lut[b'C' as usize] = 0;
lut[b'c' as usize] = 0;
lut
};
#[inline(always)]
pub fn base_to_bit(byte: u8) -> u64 {
unsafe { *BASE_TO_BIT_LUT.get_unchecked(byte as usize) }
}
#[inline]
#[allow(dead_code)] pub(crate) fn reverse_complement(kmer: u64, k: usize) -> u64 {
let complement = !kmer;
match k {
16 => complement.reverse_bits() >> 48,
32 => complement.reverse_bits() >> 32,
64 => complement.reverse_bits(),
_ => panic!("Unsupported K value: {}", k),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_base_to_bit() {
assert_eq!(base_to_bit(b'A'), 1);
assert_eq!(base_to_bit(b'a'), 1);
assert_eq!(base_to_bit(b'G'), 1);
assert_eq!(base_to_bit(b'g'), 1);
assert_eq!(base_to_bit(b'T'), 0);
assert_eq!(base_to_bit(b't'), 0);
assert_eq!(base_to_bit(b'C'), 0);
assert_eq!(base_to_bit(b'c'), 0);
assert_eq!(base_to_bit(b'N'), u64::MAX);
}
#[test]
fn test_reverse_complement() {
let all_ones_16 = 0xFFFF_u64; let rc = reverse_complement(all_ones_16, 16);
assert_eq!(rc, 0); }
}