use crate::imp::core::ChunkerConfig;
pub fn mask_for_target(target_size: usize) -> u64 {
if target_size < 2 {
return 0;
}
let bits = (usize::BITS - 1 - target_size.leading_zeros()) as u64;
if bits == 0 {
0
} else if bits >= 64 {
u64::MAX
} else {
(1u64 << bits) - 1
}
}
pub fn default_config() -> ChunkerConfig {
let target_size = 64 * 1024;
ChunkerConfig {
min_size: 16 * 1024,
target_size,
max_size: 256 * 1024,
mask: mask_for_target(target_size),
}
}
#[cfg(all(test, not(target_arch = "wasm32")))]
mod tests {
use super::*;
#[test]
fn mask_for_64kib_target_has_16_low_bits() {
assert_eq!(mask_for_target(64 * 1024), 0xFFFF);
}
#[test]
fn mask_for_target_is_power_of_two_minus_one() {
let m = mask_for_target(64 * 1024);
assert_eq!(m & (m + 1), 0, "mask must be 2^k - 1");
}
#[test]
fn mask_for_non_power_of_two_uses_floor_log2() {
assert_eq!(mask_for_target(100_000), 0xFFFF);
assert_eq!(mask_for_target(70_000), 0xFFFF);
assert_eq!(mask_for_target(32 * 1024), 0x7FFF);
}
#[test]
fn mask_for_zero_or_tiny_target_is_minimal() {
assert_eq!(mask_for_target(0), 0);
assert_eq!(mask_for_target(1), 0); }
#[test]
fn default_config_matches_canonical_bounds() {
let c = default_config();
assert_eq!(c.min_size, 16 * 1024);
assert_eq!(c.target_size, 64 * 1024);
assert_eq!(c.max_size, 256 * 1024);
assert_eq!(c.mask, 0xFFFF);
}
}