byteio - memlittleendian_varint.go
1 package byteio
2
3 // WriteUintX writes the unsigned integer using a variable number of bytes.
4 func (e *MemLittleEndian) WriteUintX(d uint64) {
5 var pos int
6
7 var buffer [9]byte
8
9 for ; d > 127 && pos < 8; pos++ {
10 buffer[pos] = byte(d&0x7f) | 0x80
11 d >>= 7
12 d--
13 }
14
15 buffer[pos] = byte(d)
16 e.WriteBytes(buffer[:pos+1])
17 }
18
19 // WriteIntX writes the integer using a variable number of bytes.
20 func (e *MemLittleEndian) WriteIntX(d int64) {
21 e.WriteUintX(zigzag(d))
22 }
23
24 // ReadUintX reads an unsigned integer that was encoded using a variable number
25 // of bytes.
26 func (e *MemLittleEndian) ReadUintX() uint64 {
27 var (
28 n int
29 val uint64
30 )
31
32 for n < 9 {
33 c := e.ReadUint8()
34 val += uint64(c&0xff) << uint(n*7)
35 n++
36
37 if c&0x80 == 0 {
38 break
39 }
40 }
41
42 return val
43 }
44
45 // ReadIntX reads an integer that was encoded using a variable number of bytes.
46 func (e *MemLittleEndian) ReadIntX() int64 {
47 return unzigzag(e.ReadUintX())
48 }
49