use srcmap_codec::{vlq_decode, vlq_decode_unsigned, vlq_encode, vlq_encode_unsigned};
fn main() {
println!("=== VLQ Primitives ===\n");
println!("--- Signed VLQ ---\n");
let signed_values: &[i64] = &[0, 1, -1, 15, -15, 16, -16, 100, -100, 1000, -1_000_000];
for &value in signed_values {
let mut buf = Vec::new();
vlq_encode(&mut buf, value);
let base64_str = std::str::from_utf8(&buf).expect("VLQ output is always valid ASCII");
let (decoded, bytes_consumed) = vlq_decode(&buf, 0).expect("roundtrip must succeed");
println!(
" {value:>12} -> {base64_str:<8} ({} byte{}, raw: {:?})",
bytes_consumed,
if bytes_consumed == 1 { "" } else { "s" },
buf,
);
assert_eq!(decoded, value, "signed roundtrip failed for {value}");
assert_eq!(
bytes_consumed,
buf.len(),
"must consume all bytes for {value}"
);
}
println!("\n--- Byte-level breakdown: signed VLQ of 1000 ---\n");
let mut buf = Vec::new();
vlq_encode(&mut buf, 1000);
println!(" Value: 1000");
println!(" Encoded bytes: {:?}", buf);
println!(" Base64 string: {}", std::str::from_utf8(&buf).unwrap());
println!();
for (i, &byte) in buf.iter().enumerate() {
let digit = byte; let is_last = i == buf.len() - 1;
let six_bit = match digit {
b'A'..=b'Z' => digit - b'A',
b'a'..=b'z' => digit - b'a' + 26,
b'0'..=b'9' => digit - b'0' + 52,
b'+' => 62,
b'/' => 63,
_ => unreachable!(),
};
let continuation = (six_bit & 0x20) != 0;
let data_bits = six_bit & 0x1F;
println!(
" byte[{i}]: '{}' (base64 value {six_bit:>2}, 0b{six_bit:06b}) -> continuation={}, data=0b{data_bits:05b}{}",
char::from(digit),
continuation,
if i == 0 {
format!(" (sign bit={})", data_bits & 1)
} else {
String::new()
},
);
if is_last {
assert!(!continuation, "last byte must not have continuation bit");
}
}
println!("\n--- Unsigned VLQ ---\n");
let unsigned_values: &[u64] = &[0, 1, 8, 31, 32, 100, 1000, 100_000, 1_000_000];
for &value in unsigned_values {
let mut buf = Vec::new();
vlq_encode_unsigned(&mut buf, value);
let base64_str = std::str::from_utf8(&buf).expect("VLQ output is always valid ASCII");
let (decoded, bytes_consumed) =
vlq_decode_unsigned(&buf, 0).expect("unsigned roundtrip must succeed");
println!(
" {value:>12} -> {base64_str:<8} ({} byte{}, raw: {:?})",
bytes_consumed,
if bytes_consumed == 1 { "" } else { "s" },
buf,
);
assert_eq!(decoded, value, "unsigned roundtrip failed for {value}");
assert_eq!(
bytes_consumed,
buf.len(),
"must consume all bytes for {value}"
);
}
println!("\n--- Signed vs Unsigned size comparison ---\n");
println!(" {:>10} {:>8} {:>10}", "Value", "Signed", "Unsigned");
println!(" {:>10} {:>8} {:>10}", "-----", "------", "--------");
let comparison_values: &[i64] = &[0, 15, 16, 31, 32, 100, 1000, 100_000];
for &value in comparison_values {
let mut signed_buf = Vec::new();
vlq_encode(&mut signed_buf, value);
let mut unsigned_buf = Vec::new();
vlq_encode_unsigned(&mut unsigned_buf, value as u64);
let signed_str = std::str::from_utf8(&signed_buf).unwrap();
let unsigned_str = std::str::from_utf8(&unsigned_buf).unwrap();
println!(" {value:>10} {signed_str:>8} {unsigned_str:>10}",);
assert!(
unsigned_buf.len() <= signed_buf.len(),
"unsigned must be at most as large as signed for value {value}"
);
}
println!("\n--- Sequential decoding from a buffer ---\n");
let values_to_encode: &[i64] = &[42, -7, 0, 256];
let mut stream = Vec::new();
for &v in values_to_encode {
vlq_encode(&mut stream, v);
}
println!(
" Encoded {} values into {} bytes: {:?}",
values_to_encode.len(),
stream.len(),
std::str::from_utf8(&stream).unwrap(),
);
let mut offset = 0;
let mut decoded_values = Vec::new();
while offset < stream.len() {
let (value, consumed) = vlq_decode(&stream, offset).expect("valid stream");
println!(" offset {offset:>2}: decoded {value:>4} ({consumed} byte(s))");
decoded_values.push(value);
offset += consumed;
}
assert_eq!(
decoded_values.as_slice(),
values_to_encode,
"sequential decode must recover all values"
);
println!("\nAll assertions passed.");
}