use crate::error::{LaurusError, Result};
pub fn encode_u64(value: u64) -> Vec<u8> {
let mut bytes = Vec::new();
let mut val = value;
loop {
let mut byte = (val & 0x7F) as u8;
val >>= 7;
if val != 0 {
byte |= 0x80; }
bytes.push(byte);
if val == 0 {
break;
}
}
bytes
}
pub fn decode_u64(bytes: &[u8]) -> Result<(u64, usize)> {
let mut result = 0u64;
let mut shift = 0;
let mut bytes_read = 0;
for &byte in bytes {
bytes_read += 1;
if shift >= 64 {
return Err(LaurusError::other("VarInt overflow"));
}
result |= ((byte & 0x7F) as u64) << shift;
if (byte & 0x80) == 0 {
return Ok((result, bytes_read));
}
shift += 7;
}
Err(LaurusError::other("Incomplete VarInt"))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_encode_decode_u64() {
let test_values = [0, 1, 127, 128, 255, 256, 16383, 16384, u64::MAX];
for &value in &test_values {
let encoded = encode_u64(value);
let (decoded, bytes_read) = decode_u64(&encoded).unwrap();
assert_eq!(value, decoded);
assert_eq!(encoded.len(), bytes_read);
}
}
#[test]
fn test_encoding_efficiency() {
assert!(encode_u64(u64::MAX).len() <= 10);
}
#[test]
fn test_incomplete_varint() {
let incomplete = vec![0x80]; assert!(decode_u64(&incomplete).is_err());
}
#[test]
fn test_overflow() {
let overflow_data = vec![0xFF; 20]; let result = decode_u64(&overflow_data);
assert!(result.is_err());
}
}