diff options
Diffstat (limited to 'vendor/snap/src/varint.rs')
-rw-r--r-- | vendor/snap/src/varint.rs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/vendor/snap/src/varint.rs b/vendor/snap/src/varint.rs new file mode 100644 index 000000000..d4a11384f --- /dev/null +++ b/vendor/snap/src/varint.rs @@ -0,0 +1,31 @@ +/// https://developers.google.com/protocol-buffers/docs/encoding#varints +pub fn write_varu64(data: &mut [u8], mut n: u64) -> usize { + let mut i = 0; + while n >= 0b1000_0000 { + data[i] = (n as u8) | 0b1000_0000; + n >>= 7; + i += 1; + } + data[i] = n as u8; + i + 1 +} + +/// https://developers.google.com/protocol-buffers/docs/encoding#varints +pub fn read_varu64(data: &[u8]) -> (u64, usize) { + let mut n: u64 = 0; + let mut shift: u32 = 0; + for (i, &b) in data.iter().enumerate() { + if b < 0b1000_0000 { + return match (b as u64).checked_shl(shift) { + None => (0, 0), + Some(b) => (n | b, i + 1), + }; + } + match ((b as u64) & 0b0111_1111).checked_shl(shift) { + None => return (0, 0), + Some(b) => n |= b, + } + shift += 7; + } + (0, 0) +} |