From 09b00c85a4b5ef1b124fc433775d2ba542478a86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Mon, 20 Jun 2022 13:15:48 +0200 Subject: [PATCH] Optimize Varint encoding --- src/varint.rs | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/varint.rs b/src/varint.rs index 517f1b5..6117d73 100644 --- a/src/varint.rs +++ b/src/varint.rs @@ -18,13 +18,13 @@ pub const fn varint_max() -> usize { 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 & 0x7F) as u8; - value >>= 7; - if value != 0 { - out[i] |= 0x80; - } else { + 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[..] @@ -34,13 +34,13 @@ pub fn varint_usize(n: usize, out: &mut [u8; varint_max::()]) -> &mut [u8 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 & 0x7F) as u8; - value >>= 7; - if value != 0 { - out[i] |= 0x80; - } else { + 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[..] @@ -50,13 +50,13 @@ pub fn varint_u16(n: u16, out: &mut [u8; varint_max::()]) -> &mut [u8] { 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 & 0x7F) as u8; - value >>= 7; - if value != 0 { - out[i] |= 0x80; - } else { + 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[..] @@ -66,13 +66,13 @@ pub fn varint_u32(n: u32, out: &mut [u8; varint_max::()]) -> &mut [u8] { 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 & 0x7F) as u8; - value >>= 7; - if value != 0 { - out[i] |= 0x80; - } else { + 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[..] @@ -82,13 +82,13 @@ pub fn varint_u64(n: u64, out: &mut [u8; varint_max::()]) -> &mut [u8] { 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 & 0x7F) as u8; - value >>= 7; - if value != 0 { - out[i] |= 0x80; - } else { + 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[..]