use crate::constants::MAX_SMALL_ALLOC_SIZE;
#[derive(Clone, Copy)]
struct SizeClassLookup {
base: u8,
shift: u8,
sub: u16,
}
#[inline(always)]
const fn lookup(base: u8, shift: u8, sub: u16) -> SizeClassLookup {
SizeClassLookup { base, shift, sub }
}
const STEP_16: SizeClassLookup = lookup(0, 4, 1);
const STEP_32: SizeClassLookup = lookup(8, 5, 129);
const STEP_128: SizeClassLookup = lookup(20, 7, 513);
const STEP_512: SizeClassLookup = lookup(32, 9, 2049);
const STEP_1024: SizeClassLookup = lookup(44, 10, 8193);
pub(super) const fn size_to_class_nonzero_arithmetic(size: usize) -> Option<usize> {
if size > MAX_SMALL_ALLOC_SIZE {
return None;
}
const LOOKUP: [SizeClassLookup; 15] = [
STEP_16, STEP_16, STEP_16, STEP_16, STEP_16, STEP_16, STEP_16, STEP_16, STEP_32, STEP_32, STEP_128, STEP_128, STEP_512, STEP_512, STEP_1024, ];
let bits = usize::BITS - (size - 1).leading_zeros();
if bits >= LOOKUP.len() as u32 {
return None;
}
let entry = &LOOKUP[bits as usize];
Some(entry.base as usize + ((size - entry.sub as usize) >> entry.shift))
}