pub(super) fn encode_slot(slot: usize) -> f32 {
match u16::try_from(slot) {
Ok(slot) => f32::from(slot),
Err(_) => f32::from(u16::MAX),
}
}
pub(super) fn decode_slot(value: f32) -> usize {
if value.is_finite() && value >= 0.0 && value <= f32::from(u16::MAX) {
let bits = value.to_bits();
let exponent = (bits >> 23) & 0xff;
if exponent < 127 {
return 0;
}
let shift = exponent - 127;
let mantissa = (bits & 0x7f_ffff) | 0x80_0000;
let integer = if shift <= 23 {
mantissa >> (23 - shift)
} else {
mantissa << (shift - 23)
};
match usize::try_from(integer) {
Ok(slot) => slot,
Err(_) => usize::MAX,
}
} else {
usize::MAX
}
}
pub(super) fn decode_code(value: f32) -> u8 {
let slot = decode_slot(value);
u8::try_from(slot).into_iter().fold(u8::MAX, |_, code| code)
}
pub(super) fn entity_scalar(entity: u32) -> f32 {
let high = u16::try_from(entity >> 16)
.into_iter()
.fold(u16::MAX, |_, high| high);
let low = u16::try_from(entity & u32::from(u16::MAX))
.into_iter()
.fold(u16::MAX, |_, low| low);
f32::from(high).mul_add(65_536.0, f32::from(low))
}