use std::fmt::{Binary, Debug};
use std::ops::*;
use num_traits::{AsPrimitive, FromPrimitive, PrimInt, ToPrimitive, WrappingAdd};
pub trait DistType: Copy
+ Debug
+ Default
+ AddAssign
+ SubAssign
+ PrimInt + FromPrimitive
+ ToPrimitive
+ AsPrimitive<usize> + AsPrimitive<i64>
+ WrappingAdd
+ Sub<Output=Self> {}
impl DistType for u8 {}
impl DistType for u16 {}
impl DistType for u32 {}
impl DistType for u64 {}
impl DistType for usize {}
pub trait BitVec: Copy
+ Debug
+ Binary
+ Default
+ Add
+ Sub
+ BitOr
+ BitOrAssign
+ BitAnd
+ BitXor
+ Not
+ Shl<usize>
+ ShlAssign<usize>
+ ShrAssign<usize>
+ PrimInt
+ WrappingAdd
+ ToPrimitive
+ FromPrimitive
+ AsPrimitive<usize> + AsPrimitive<i64>
{
type DistType: DistType;
}
macro_rules! impl_bitvec {
($type:ty, $dist:ty) => {
impl BitVec for $type {
type DistType = $dist;
}
};
}
impl_bitvec!(u8, u8);
impl_bitvec!(u16, u8);
impl_bitvec!(u32, u8);
impl_bitvec!(u64, u8);
impl_bitvec!(u128, u8);
use crate::alignment::{Alignment, AlignmentMode};
#[inline(always)]
pub(crate) fn update_aln(
end_pos: usize,
aln_len: usize,
text_len: usize,
dist: usize,
m: usize,
aln: &mut Alignment,
) {
aln.xstart = 0;
aln.xend = m;
aln.xlen = m;
aln.ylen = text_len;
aln.yend = end_pos + 1;
aln.ystart = aln.yend - aln_len;
aln.mode = AlignmentMode::Semiglobal;
aln.score = dist as i32;
}
#[inline]
pub(crate) fn word_size<T>() -> usize {
std::mem::size_of::<T>() * 8
}
#[inline]
pub(crate) fn ceil_div(x: usize, y: usize) -> usize {
if x % y != 0 {
x / y + 1
} else {
x / y
}
}