use crate::compare::utils::distance_on_ring_mod;
macro_rules! length_mult {
() => {
12
};
}
#[cfg(doc)]
use length_mult as length_mult_value;
pub const MAX_DISTANCE: u32 = 0x80 * length_mult!();
#[cfg(any(doc, feature = "opt-dist-length-table"))]
type LengthDistanceTableType = u16;
#[cfg(any(doc, feature = "opt-dist-length-table"))]
const LDIST_VALUE: [LengthDistanceTableType; 256] = {
let mut array = [0; 256];
let mut i = 0;
while i < 256 {
let dist = distance_on_ring_mod(0, i as u8, 0) as LengthDistanceTableType;
array[i] = if dist <= 1 {
dist
} else {
dist * length_mult!()
};
i += 1;
}
array
};
#[inline(always)]
pub const fn distance(lvalue1: u8, lvalue2: u8) -> u32 {
cfg_if::cfg_if! {
if #[cfg(feature = "opt-dist-length-table")] {
LDIST_VALUE[lvalue1.wrapping_sub(lvalue2) as usize] as u32
}
else {
naive::distance(lvalue1, lvalue2)
}
}
}
#[cfg(any(test, doc, not(feature = "opt-dist-length-table")))]
pub(crate) mod naive {
use super::*;
#[inline]
pub const fn distance(lvalue1: u8, lvalue2: u8) -> u32 {
let dist = distance_on_ring_mod(lvalue1, lvalue2, 0) as u32;
if dist <= 1 {
dist
} else {
dist * length_mult!()
}
}
}
mod tests;