-
Notifications
You must be signed in to change notification settings - Fork 2
/
bulkoperationpacked5.go
185 lines (181 loc) · 5.4 KB
/
bulkoperationpacked5.go
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
package bulkoperation
type Packed5 struct {
*BulkOperationPacked
}
func NewPacked5() *Packed5 {
return &Packed5{NewPacked(5)}
}
func (b *Packed5) DecodeUint64(blocks []uint64, values []uint64, iterations int) {
blocksOffset, valuesOffset := 0, 0
for i := 0; i < iterations; i++ {
block0 := blocks[blocksOffset]
blocksOffset++
values[valuesOffset] = block0 >> 59
valuesOffset++
values[valuesOffset] = (block0 >> 54) & 31
valuesOffset++
values[valuesOffset] = (block0 >> 49) & 31
valuesOffset++
values[valuesOffset] = (block0 >> 44) & 31
valuesOffset++
values[valuesOffset] = (block0 >> 39) & 31
valuesOffset++
values[valuesOffset] = (block0 >> 34) & 31
valuesOffset++
values[valuesOffset] = (block0 >> 29) & 31
valuesOffset++
values[valuesOffset] = (block0 >> 24) & 31
valuesOffset++
values[valuesOffset] = (block0 >> 19) & 31
valuesOffset++
values[valuesOffset] = (block0 >> 14) & 31
valuesOffset++
values[valuesOffset] = (block0 >> 9) & 31
valuesOffset++
values[valuesOffset] = (block0 >> 4) & 31
valuesOffset++
block1 := blocks[blocksOffset]
blocksOffset++
values[valuesOffset] = ((block0 & 15) << 1) | (block1 >> 63)
valuesOffset++
values[valuesOffset] = (block1 >> 58) & 31
valuesOffset++
values[valuesOffset] = (block1 >> 53) & 31
valuesOffset++
values[valuesOffset] = (block1 >> 48) & 31
valuesOffset++
values[valuesOffset] = (block1 >> 43) & 31
valuesOffset++
values[valuesOffset] = (block1 >> 38) & 31
valuesOffset++
values[valuesOffset] = (block1 >> 33) & 31
valuesOffset++
values[valuesOffset] = (block1 >> 28) & 31
valuesOffset++
values[valuesOffset] = (block1 >> 23) & 31
valuesOffset++
values[valuesOffset] = (block1 >> 18) & 31
valuesOffset++
values[valuesOffset] = (block1 >> 13) & 31
valuesOffset++
values[valuesOffset] = (block1 >> 8) & 31
valuesOffset++
values[valuesOffset] = (block1 >> 3) & 31
valuesOffset++
block2 := blocks[blocksOffset]
blocksOffset++
values[valuesOffset] = ((block1 & 7) << 2) | (block2 >> 62)
valuesOffset++
values[valuesOffset] = (block2 >> 57) & 31
valuesOffset++
values[valuesOffset] = (block2 >> 52) & 31
valuesOffset++
values[valuesOffset] = (block2 >> 47) & 31
valuesOffset++
values[valuesOffset] = (block2 >> 42) & 31
valuesOffset++
values[valuesOffset] = (block2 >> 37) & 31
valuesOffset++
values[valuesOffset] = (block2 >> 32) & 31
valuesOffset++
values[valuesOffset] = (block2 >> 27) & 31
valuesOffset++
values[valuesOffset] = (block2 >> 22) & 31
valuesOffset++
values[valuesOffset] = (block2 >> 17) & 31
valuesOffset++
values[valuesOffset] = (block2 >> 12) & 31
valuesOffset++
values[valuesOffset] = (block2 >> 7) & 31
valuesOffset++
values[valuesOffset] = (block2 >> 2) & 31
valuesOffset++
block3 := blocks[blocksOffset]
blocksOffset++
values[valuesOffset] = ((block2 & 3) << 3) | (block3 >> 61)
valuesOffset++
values[valuesOffset] = (block3 >> 56) & 31
valuesOffset++
values[valuesOffset] = (block3 >> 51) & 31
valuesOffset++
values[valuesOffset] = (block3 >> 46) & 31
valuesOffset++
values[valuesOffset] = (block3 >> 41) & 31
valuesOffset++
values[valuesOffset] = (block3 >> 36) & 31
valuesOffset++
values[valuesOffset] = (block3 >> 31) & 31
valuesOffset++
values[valuesOffset] = (block3 >> 26) & 31
valuesOffset++
values[valuesOffset] = (block3 >> 21) & 31
valuesOffset++
values[valuesOffset] = (block3 >> 16) & 31
valuesOffset++
values[valuesOffset] = (block3 >> 11) & 31
valuesOffset++
values[valuesOffset] = (block3 >> 6) & 31
valuesOffset++
values[valuesOffset] = (block3 >> 1) & 31
valuesOffset++
block4 := blocks[blocksOffset]
blocksOffset++
values[valuesOffset] = ((block3 & 1) << 4) | (block4 >> 60)
valuesOffset++
values[valuesOffset] = (block4 >> 55) & 31
valuesOffset++
values[valuesOffset] = (block4 >> 50) & 31
valuesOffset++
values[valuesOffset] = (block4 >> 45) & 31
valuesOffset++
values[valuesOffset] = (block4 >> 40) & 31
valuesOffset++
values[valuesOffset] = (block4 >> 35) & 31
valuesOffset++
values[valuesOffset] = (block4 >> 30) & 31
valuesOffset++
values[valuesOffset] = (block4 >> 25) & 31
valuesOffset++
values[valuesOffset] = (block4 >> 20) & 31
valuesOffset++
values[valuesOffset] = (block4 >> 15) & 31
valuesOffset++
values[valuesOffset] = (block4 >> 10) & 31
valuesOffset++
values[valuesOffset] = (block4 >> 5) & 31
valuesOffset++
values[valuesOffset] = block4 & 31
valuesOffset++
}
}
func (b *Packed5) DecodeBytes(blocks []byte, values []uint64, iterations int) {
blocksOffset, valuesOffset := 0, 0
for i := 0; i < iterations; i++ {
byte0 := uint64(blocks[blocksOffset])
blocksOffset++
values[valuesOffset] = byte0 >> 3
valuesOffset++
byte1 := uint64(blocks[blocksOffset])
blocksOffset++
values[valuesOffset] = ((byte0 & 7) << 2) | (byte1 >> 6)
valuesOffset++
values[valuesOffset] = (byte1 >> 1) & 31
valuesOffset++
byte2 := uint64(blocks[blocksOffset])
blocksOffset++
values[valuesOffset] = ((byte1 & 1) << 4) | (byte2 >> 4)
valuesOffset++
byte3 := uint64(blocks[blocksOffset])
blocksOffset++
values[valuesOffset] = ((byte2 & 15) << 1) | (byte3 >> 7)
valuesOffset++
values[valuesOffset] = (byte3 >> 2) & 31
valuesOffset++
byte4 := uint64(blocks[blocksOffset])
blocksOffset++
values[valuesOffset] = ((byte3 & 3) << 3) | (byte4 >> 5)
valuesOffset++
values[valuesOffset] = byte4 & 31
valuesOffset++
}
}