pub fn encode(value: u32) -> u8 {
if value == 0 {
return 0;
}
let msb = 31 - value.leading_zeros(); let frac = if msb >= 3 {
(value >> (msb - 3)) & 0x07
} else {
(value << (3 - msb)) & 0x07
};
let byte = msb * 8 + frac + 1; byte.min(255) as u8
}
static DECODE: [u32; 256] = build_decode_table();
const fn build_decode_table() -> [u32; 256] {
let mut table = [0u32; 256];
let mut b = 1u32;
while b < 256 {
let adjusted = b - 1; let msb = adjusted / 8;
let frac = adjusted % 8;
if msb >= 3 {
table[b as usize] = (1 << msb) | (frac << (msb - 3));
} else {
table[b as usize] = (1 << msb) | (frac >> (3 - msb));
}
b += 1;
}
table
}
pub fn decode(byte: u8) -> u32 {
DECODE[byte as usize]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn zero_roundtrips() {
assert_eq!(encode(0), 0);
assert_eq!(decode(0), 0);
}
#[test]
fn small_values_exact() {
for v in 1..=8u32 {
let e = encode(v);
let d = decode(e);
assert_eq!(d, v, "value {v}: encoded={e}, decoded={d}");
}
}
#[test]
fn decode_table_monotonic() {
for i in 1..256 {
assert!(
DECODE[i] >= DECODE[i - 1],
"DECODE[{i}]={} < DECODE[{}]={}",
DECODE[i],
i - 1,
DECODE[i - 1]
);
}
}
#[test]
fn encode_monotonic() {
let mut prev = 0u8;
for length in 0..200_000u32 {
let encoded = encode(length);
assert!(
encoded >= prev,
"encode({length})={encoded} < prev encode({})={prev}",
length - 1
);
prev = encoded;
}
}
#[test]
fn roundtrip_within_error() {
for length in [
10, 20, 50, 100, 200, 500, 1000, 5000, 10_000, 50_000, 100_000,
] {
let encoded = encode(length);
let decoded = decode(encoded);
assert!(decoded <= length, "decoded {decoded} > original {length}");
let error = (length - decoded) as f64 / length as f64;
assert!(
error < 0.25,
"length={length}, decoded={decoded}, error={error:.4}"
);
}
}
#[test]
fn max_value() {
let encoded = encode(u32::MAX);
assert_eq!(encoded, 255);
assert!(decode(255) > 1_000_000);
}
#[test]
fn full_range_encode_decode_monotonic() {
let mut prev_byte = 0u8;
let mut prev_decoded = 0u32;
for &v in &[
0, 1, 2, 5, 10, 50, 100, 500, 1000, 10_000, 100_000, 1_000_000,
] {
let b = encode(v);
let d = decode(b);
assert!(b >= prev_byte);
assert!(d >= prev_decoded);
prev_byte = b;
prev_decoded = d;
}
}
}