-
Notifications
You must be signed in to change notification settings - Fork 2
/
bulkoperationpacked20.go
77 lines (73 loc) · 2.22 KB
/
bulkoperationpacked20.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
package bulkoperation
type Packed20 struct {
*BulkOperationPacked
}
func NewPacked20() *Packed20 {
return &Packed20{NewPacked(20)}
}
func (b *Packed20) DecodeUint64(blocks []uint64, values []uint64, iterations int) {
blocksOffset, valuesOffset := 0, 0
for i := 0; i < iterations; i++ {
block0 := blocks[blocksOffset]
blocksOffset++
values[valuesOffset] = block0 >> 44
valuesOffset++
values[valuesOffset] = (block0 >> 24) & 1048575
valuesOffset++
values[valuesOffset] = (block0 >> 4) & 1048575
valuesOffset++
block1 := blocks[blocksOffset]
blocksOffset++
values[valuesOffset] = ((block0 & 15) << 16) | (block1 >> 48)
valuesOffset++
values[valuesOffset] = (block1 >> 28) & 1048575
valuesOffset++
values[valuesOffset] = (block1 >> 8) & 1048575
valuesOffset++
block2 := blocks[blocksOffset]
blocksOffset++
values[valuesOffset] = ((block1 & 255) << 12) | (block2 >> 52)
valuesOffset++
values[valuesOffset] = (block2 >> 32) & 1048575
valuesOffset++
values[valuesOffset] = (block2 >> 12) & 1048575
valuesOffset++
block3 := blocks[blocksOffset]
blocksOffset++
values[valuesOffset] = ((block2 & 4095) << 8) | (block3 >> 56)
valuesOffset++
values[valuesOffset] = (block3 >> 36) & 1048575
valuesOffset++
values[valuesOffset] = (block3 >> 16) & 1048575
valuesOffset++
block4 := blocks[blocksOffset]
blocksOffset++
values[valuesOffset] = ((block3 & 65535) << 4) | (block4 >> 60)
valuesOffset++
values[valuesOffset] = (block4 >> 40) & 1048575
valuesOffset++
values[valuesOffset] = (block4 >> 20) & 1048575
valuesOffset++
values[valuesOffset] = block4 & 1048575
valuesOffset++
}
}
func (b *Packed20) DecodeBytes(blocks []byte, values []uint64, iterations int) {
blocksOffset, valuesOffset := 0, 0
for i := 0; i < iterations; i++ {
byte0 := uint64(blocks[blocksOffset])
blocksOffset++
byte1 := uint64(blocks[blocksOffset])
blocksOffset++
byte2 := uint64(blocks[blocksOffset])
blocksOffset++
values[valuesOffset] = (byte0 << 12) | (byte1 << 4) | (byte2 >> 4)
valuesOffset++
byte3 := uint64(blocks[blocksOffset])
blocksOffset++
byte4 := uint64(blocks[blocksOffset])
blocksOffset++
values[valuesOffset] = ((byte2 & 15) << 16) | (byte3 << 8) | byte4
valuesOffset++
}
}