]> git.proxmox.com Git - rustc.git/blob - vendor/snap/src/varint.rs
New upstream version 1.48.0~beta.8+dfsg1
[rustc.git] / vendor / snap / src / varint.rs
1 /// https://developers.google.com/protocol-buffers/docs/encoding#varints
2 pub fn write_varu64(data: &mut [u8], mut n: u64) -> usize {
3 let mut i = 0;
4 while n >= 0b1000_0000 {
5 data[i] = (n as u8) | 0b1000_0000;
6 n >>= 7;
7 i += 1;
8 }
9 data[i] = n as u8;
10 i + 1
11 }
12
13 /// https://developers.google.com/protocol-buffers/docs/encoding#varints
14 pub fn read_varu64(data: &[u8]) -> (u64, usize) {
15 let mut n: u64 = 0;
16 let mut shift: u32 = 0;
17 for (i, &b) in data.iter().enumerate() {
18 if b < 0b1000_0000 {
19 return match (b as u64).checked_shl(shift) {
20 None => (0, 0),
21 Some(b) => (n | b, i + 1),
22 };
23 }
24 match ((b as u64) & 0b0111_1111).checked_shl(shift) {
25 None => return (0, 0),
26 Some(b) => n |= b,
27 }
28 shift += 7;
29 }
30 (0, 0)
31 }