File tree Expand file tree Collapse file tree 5 files changed +442
-394
lines changed Expand file tree Collapse file tree 5 files changed +442
-394
lines changed Original file line number Diff line number Diff line change
1
+ use bytes:: { BufMut , Bytes , BytesMut } ;
2
+
3
+ pub fn encode_leb128 ( mut val : u32 ) -> u32 {
4
+ let mut b = 0 ;
5
+ loop {
6
+ b |= val & 0b_0111_1111 ;
7
+ val >>= 7 ;
8
+ if val != 0 {
9
+ b |= 0b_1000_0000 ;
10
+ b <<= 8 ;
11
+ } else {
12
+ return b;
13
+ }
14
+ }
15
+ }
16
+
17
+ pub fn decode_leb128 ( mut val : u32 ) -> u32 {
18
+ let mut b = 0 ;
19
+ loop {
20
+ b |= val & 0b_0111_1111 ;
21
+ val >>= 8 ;
22
+ if val == 0 {
23
+ return b;
24
+ }
25
+ b <<= 7 ;
26
+ }
27
+ }
28
+
29
+ pub fn read_leb128 ( bytes : & Bytes ) -> ( u32 , usize ) {
30
+ let mut encoded = 0 ;
31
+ for i in 0 ..bytes. len ( ) {
32
+ encoded |= bytes[ i] as u32 ;
33
+ if bytes[ i] & 0b_1000_0000 == 0 {
34
+ return ( decode_leb128 ( encoded) , i + 1 ) ;
35
+ }
36
+ encoded <<= 8 ;
37
+ }
38
+ ( 0 , 0 )
39
+ }
40
+
41
+ pub fn leb128_size ( value : u32 ) -> usize {
42
+ let mut size = 0 ;
43
+ let mut value = value;
44
+ while value >= 0b_1000_0000 {
45
+ size += 1 ;
46
+ value >>= 7 ;
47
+ }
48
+ size + 1
49
+ }
50
+
51
+ pub trait BytesMutExt {
52
+ fn put_leb128 ( & mut self , n : u32 ) ;
53
+ }
54
+
55
+ impl BytesMutExt for BytesMut {
56
+ fn put_leb128 ( & mut self , n : u32 ) {
57
+ let encoded = encode_leb128 ( n) ;
58
+ let leb128_size = leb128_size ( n) ;
59
+ for i in ( 0 ..leb128_size) . rev ( ) {
60
+ let byte = ( encoded >> ( i * 8 ) ) as u8 ;
61
+ self . put_u8 ( byte)
62
+ }
63
+ }
64
+ }
You can’t perform that action at this time.
0 commit comments