/// Returns the maximum number of bytes required to encode T. pub const fn varint_max() -> usize { const BITS_PER_BYTE: usize = 8; const BITS_PER_VARINT_BYTE: usize = 7; // How many data bits do we need for this type? let bits = core::mem::size_of::() * BITS_PER_BYTE; // We add (BITS_PER_VARINT_BYTE - 1), to ensure any integer divisions // with a remainder will always add exactly one full byte, but // an evenly divided number of bits will be the same let roundup_bits = bits + (BITS_PER_VARINT_BYTE - 1); // Apply division, using normal "round down" integer division roundup_bits / BITS_PER_VARINT_BYTE } /// Returns the maximum value stored in the last encoded byte. pub const fn max_of_last_byte() -> u8 { let max_bits = core::mem::size_of::() * 8; let extra_bits = max_bits % 7; (1 << extra_bits) - 1 } #[inline] pub fn varint_usize(n: usize, out: &mut [u8; varint_max::()]) -> &mut [u8] { let mut value = n; for i in 0..varint_max::() { out[i] = value.to_le_bytes()[0]; if value < 128 { return &mut out[..=i]; } out[i] |= 0x80; value >>= 7; } debug_assert_eq!(value, 0); &mut out[..] } #[inline] pub fn varint_u16(n: u16, out: &mut [u8; varint_max::()]) -> &mut [u8] { let mut value = n; for i in 0..varint_max::() { out[i] = value.to_le_bytes()[0]; if value < 128 { return &mut out[..=i]; } out[i] |= 0x80; value >>= 7; } debug_assert_eq!(value, 0); &mut out[..] } #[inline] pub fn varint_u32(n: u32, out: &mut [u8; varint_max::()]) -> &mut [u8] { let mut value = n; for i in 0..varint_max::() { out[i] = value.to_le_bytes()[0]; if value < 128 { return &mut out[..=i]; } out[i] |= 0x80; value >>= 7; } debug_assert_eq!(value, 0); &mut out[..] } #[inline] pub fn varint_u64(n: u64, out: &mut [u8; varint_max::()]) -> &mut [u8] { let mut value = n; for i in 0..varint_max::() { out[i] = value.to_le_bytes()[0]; if value < 128 { return &mut out[..=i]; } out[i] |= 0x80; value >>= 7; } debug_assert_eq!(value, 0); &mut out[..] } #[inline] pub fn varint_u128(n: u128, out: &mut [u8; varint_max::()]) -> &mut [u8] { let mut value = n; for i in 0..varint_max::() { out[i] = value.to_le_bytes()[0]; if value < 128 { return &mut out[..=i]; } out[i] |= 0x80; value >>= 7; } debug_assert_eq!(value, 0); &mut out[..] }