-
Notifications
You must be signed in to change notification settings - Fork 2
/
bulkoperationpacked3.go
177 lines (173 loc) · 5.06 KB
/
bulkoperationpacked3.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
package bulkoperation
type Packed3 struct {
*BulkOperationPacked
}
func NewPacked3() *Packed3 {
return &Packed3{NewPacked(3)}
}
func (b *Packed3) DecodeUint64(blocks []uint64, values []uint64, iterations int) {
blocksOffset, valuesOffset := 0, 0
for i := 0; i < iterations; i++ {
block0 := blocks[blocksOffset]
blocksOffset++
values[valuesOffset] = block0 >> 61
valuesOffset++
values[valuesOffset] = (block0 >> 58) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 55) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 52) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 49) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 46) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 43) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 40) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 37) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 34) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 31) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 28) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 25) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 22) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 19) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 16) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 13) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 10) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 7) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 4) & 7
valuesOffset++
values[valuesOffset] = (block0 >> 1) & 7
valuesOffset++
block1 := blocks[blocksOffset]
blocksOffset++
values[valuesOffset] = ((block0 & 1) << 2) | (block1 >> 62)
valuesOffset++
values[valuesOffset] = (block1 >> 59) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 56) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 53) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 50) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 47) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 44) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 41) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 38) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 35) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 32) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 29) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 26) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 23) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 20) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 17) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 14) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 11) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 8) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 5) & 7
valuesOffset++
values[valuesOffset] = (block1 >> 2) & 7
valuesOffset++
block2 := blocks[blocksOffset]
blocksOffset++
values[valuesOffset] = ((block1 & 3) << 1) | (block2 >> 63)
valuesOffset++
values[valuesOffset] = (block2 >> 60) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 57) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 54) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 51) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 48) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 45) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 42) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 39) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 36) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 33) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 30) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 27) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 24) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 21) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 18) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 15) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 12) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 9) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 6) & 7
valuesOffset++
values[valuesOffset] = (block2 >> 3) & 7
valuesOffset++
values[valuesOffset] = block2 & 7
valuesOffset++
}
}
func (b *Packed3) 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 >> 5
valuesOffset++
values[valuesOffset] = (byte0 >> 2) & 7
valuesOffset++
byte1 := uint64(blocks[blocksOffset])
blocksOffset++
values[valuesOffset] = ((byte0 & 3) << 1) | (byte1 >> 7)
valuesOffset++
values[valuesOffset] = (byte1 >> 4) & 7
valuesOffset++
values[valuesOffset] = (byte1 >> 1) & 7
valuesOffset++
byte2 := uint64(blocks[blocksOffset])
blocksOffset++
values[valuesOffset] = ((byte1 & 1) << 2) | (byte2 >> 6)
valuesOffset++
values[valuesOffset] = (byte2 >> 3) & 7
valuesOffset++
values[valuesOffset] = byte2 & 7
valuesOffset++
}
}