-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvarint.hpp
77 lines (70 loc) · 1.96 KB
/
varint.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#ifndef VARINT_HEADER
#define VARINT_HEADER
#include <assert.h>
uint32_t readVarint(uint8_t*& pointer){
uint32_t value = 0;
uint32_t read1 = *(pointer++);
if(read1 < 128){
return read1;
}
else{
uint32_t read2 = *(pointer++);
if(read2 < 128){
return (read1 % 128) + (read2 << 7);
}
else{
uint32_t read3 = *(pointer++);
if(read3 < 128){
return (read1 % 128) + ((read2 % 128) << 7) + (read3 << 14);
}
else{
uint32_t read4 = *(pointer++);
return (read1 % 128) + ((read2 % 128) << 7) + ((read3 % 128) << 14) + (read4 << 21);
}
}
}
}
void writeVarint(uint32_t value,uint8_t*& outPointer){
assert(value < (1 << 28));
if(value < 128){
*(outPointer++) = (uint8_t)value;
}
else if(value < (1<<14)){
*(outPointer++) = (uint8_t)((value % 128) + 128);
*(outPointer++) = (uint8_t)(value >> 7);
}
else if(value < (1<<21)){
*(outPointer++) = (uint8_t)((value % 128) + 128);
*(outPointer++) = (uint8_t)(((value >> 7) % 128) + 128);
*(outPointer++) = (uint8_t)(value >> 14);
}
else{
*(outPointer++) = (uint8_t)((value % 128) + 128);
*(outPointer++) = (uint8_t)(((value >> 7) % 128) + 128);
*(outPointer++) = (uint8_t)(((value >> 14) % 128) + 128);
*(outPointer++) = (uint8_t)(value >> 21);
}
}
//rANS style backwards buffer writing
void writeVarint_reverse(uint32_t value,uint8_t*& outPointer){
assert(value < (1 << 28));
if(value < 128){
*(--outPointer) = (uint8_t)value;
}
else if(value < (1<<14)){
*(--outPointer) = (uint8_t)(value >> 7);
*(--outPointer) = (uint8_t)((value % 128) + 128);
}
else if(value < (1<<21)){
*(--outPointer) = (uint8_t)(value >> 14);
*(--outPointer) = (uint8_t)(((value >> 7) % 128) + 128);
*(--outPointer) = (uint8_t)((value % 128) + 128);
}
else{
*(--outPointer) = (uint8_t)(value >> 21);
*(--outPointer) = (uint8_t)(((value >> 14) % 128) + 128);
*(--outPointer) = (uint8_t)(((value >> 7) % 128) + 128);
*(--outPointer) = (uint8_t)((value % 128) + 128);
}
}
#endif //VARINT_HEADER