pub const INVALID_UINT64: u64 = u64::MAX;
pub const DEFAULT_SEED: u64 = 1;
pub const DEFAULT_RAM_LIMIT_GIB: usize = 8;
pub const DEFAULT_LAMBDA: f64 = 5.0;
pub const AVG_PARTITION_SIZE: usize = 3_000_000;
pub const MIN_L: usize = 6;
pub const MAX_L: usize = 13;
pub const FORWARD_ORIENTATION: i8 = 1;
pub const BACKWARD_ORIENTATION: i8 = -1;
pub const VERSION: (u8, u8, u8) = (0, 1, 0);
pub const VALID_K_VALUES: &[usize] = &[
3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49,
51, 53, 55, 57, 59, 61, 63,
];
#[inline]
pub const fn is_valid_k(k: usize) -> bool {
k >= 3 && k <= 63 && k % 2 == 1
}
pub const MAX_K: usize = 63;
pub const MIN_K: usize = 3;
#[inline]
pub const fn ceil_log2(x: u64) -> usize {
if x <= 1 {
0
} else {
64 - (x - 1).leading_zeros() as usize
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_valid_k_values() {
for &k in VALID_K_VALUES {
assert!(is_valid_k(k), "k={} should be valid", k);
}
assert_eq!(VALID_K_VALUES.len(), 31);
let mut sorted = VALID_K_VALUES.to_vec();
sorted.sort_unstable();
sorted.dedup();
assert_eq!(sorted.len(), VALID_K_VALUES.len());
}
#[test]
fn test_is_valid_k() {
assert!(is_valid_k(3));
assert!(is_valid_k(31));
assert!(is_valid_k(63));
assert!(is_valid_k(21));
assert!(!is_valid_k(2));
assert!(!is_valid_k(4));
assert!(!is_valid_k(30));
assert!(!is_valid_k(32));
assert!(!is_valid_k(1));
assert!(!is_valid_k(65));
assert!(!is_valid_k(100));
}
}