Skip to content

Commit 4029f9a

Browse files
committed
change bitmap to go-datastructures version
1 parent 8b0fec2 commit 4029f9a

File tree

3 files changed

+25
-58
lines changed

3 files changed

+25
-58
lines changed

trie/dtrie/dtrie_test.go

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,6 @@ import (
3333
"github.com/stretchr/testify/assert"
3434
)
3535

36-
func TestPopCount(t *testing.T) {
37-
b := []uint32{
38-
uint32(0x55555555), // 0x55555555 = 01010101 01010101 01010101 01010101
39-
uint32(0x33333333), // 0x33333333 = 00110011 00110011 00110011 00110011
40-
uint32(0x0F0F0F0F), // 0x0F0F0F0F = 00001111 00001111 00001111 00001111
41-
uint32(0x00FF00FF), // 0x00FF00FF = 00000000 11111111 00000000 11111111
42-
uint32(0x0000FFFF), // 0x0000FFFF = 00000000 00000000 11111111 11111111
43-
}
44-
for _, x := range b {
45-
assert.Equal(t, 16, popCount(x))
46-
}
47-
}
48-
4936
func TestDefaultHasher(t *testing.T) {
5037
assert.Equal(t,
5138
defaultHasher(map[int]string{11234: "foo"}),

trie/dtrie/node.go

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@ package dtrie
2929
import (
3030
"fmt"
3131
"sync"
32+
33+
"github.com/Workiva/go-datastructures/bitmap"
3234
)
3335

3436
type node struct {
3537
entries []Entry
36-
nodeMap uint32
37-
dataMap uint32
38+
nodeMap bitmap.Bitmap32
39+
dataMap bitmap.Bitmap32
3840
level uint32 // level starts at 0
3941
}
4042

@@ -75,10 +77,10 @@ func insert(n *node, entry Entry) *node {
7577
if newNode.level == 6 { // handle hash collisions on 6th level
7678
if newNode.entries[index] == nil {
7779
newNode.entries[index] = entry
78-
newNode.dataMap = setBit(newNode.dataMap, index)
80+
newNode.dataMap = newNode.dataMap.SetBit(uint(index))
7981
return newNode
8082
}
81-
if hasBit(newNode.dataMap, index) {
83+
if newNode.dataMap.HasBit(uint(index)) {
8284
if newNode.entries[index].Key() == entry.Key() {
8385
newNode.entries[index] = entry
8486
return newNode
@@ -87,19 +89,20 @@ func insert(n *node, entry Entry) *node {
8789
cNode.entries[0] = newNode.entries[index]
8890
cNode.entries[1] = entry
8991
newNode.entries[index] = cNode
90-
newNode.dataMap = clearBit(newNode.dataMap, index)
92+
newNode.dataMap = newNode.dataMap.ClearBit(uint(index))
9193
return newNode
9294
}
9395
cNode := newNode.entries[index].(*collisionNode)
9496
cNode.entries = append(cNode.entries, entry)
9597
return newNode
9698
}
97-
if !hasBit(newNode.dataMap, index) && !hasBit(newNode.nodeMap, index) { // insert directly
99+
// insert directly
100+
if !newNode.dataMap.HasBit(uint(index)) && !newNode.nodeMap.HasBit(uint(index)) {
98101
newNode.entries[index] = entry
99-
newNode.dataMap = setBit(newNode.dataMap, index)
102+
newNode.dataMap = newNode.dataMap.SetBit(uint(index))
100103
return newNode
101104
}
102-
if hasBit(newNode.nodeMap, index) { // insert into sub-node
105+
if newNode.nodeMap.HasBit(uint(index)) { // insert into sub-node
103106
newNode.entries[index] = insert(newNode.entries[index].(*node), entry)
104107
return newNode
105108
}
@@ -116,19 +119,19 @@ func insert(n *node, entry Entry) *node {
116119
}
117120
subNode = insert(subNode, newNode.entries[index])
118121
subNode = insert(subNode, entry)
119-
newNode.dataMap = clearBit(newNode.dataMap, index)
120-
newNode.nodeMap = setBit(newNode.nodeMap, index)
122+
newNode.dataMap = newNode.dataMap.ClearBit(uint(index))
123+
newNode.nodeMap = newNode.nodeMap.SetBit(uint(index))
121124
newNode.entries[index] = subNode
122125
return newNode
123126
}
124127

125128
// returns nil if not found
126129
func get(n *node, keyHash uint32, key interface{}) Entry {
127130
index := mask(keyHash, n.level)
128-
if hasBit(n.dataMap, index) {
131+
if n.dataMap.HasBit(uint(index)) {
129132
return n.entries[index]
130133
}
131-
if hasBit(n.nodeMap, index) {
134+
if n.nodeMap.HasBit(uint(index)) {
132135
return get(n.entries[index].(*node), keyHash, key)
133136
}
134137
if n.level == 6 { // get from collisionNode
@@ -148,26 +151,26 @@ func get(n *node, keyHash uint32, key interface{}) Entry {
148151
func remove(n *node, keyHash uint32, key interface{}) *node {
149152
index := mask(keyHash, n.level)
150153
newNode := n
151-
if hasBit(n.dataMap, index) {
154+
if n.dataMap.HasBit(uint(index)) {
152155
newNode.entries[index] = nil
153-
newNode.dataMap = clearBit(newNode.dataMap, index)
156+
newNode.dataMap = newNode.dataMap.ClearBit(uint(index))
154157
return newNode
155158
}
156-
if hasBit(n.nodeMap, index) {
159+
if n.nodeMap.HasBit(uint(index)) {
157160
subNode := newNode.entries[index].(*node)
158161
subNode = remove(subNode, keyHash, key)
159162
// compress if only 1 entry exists in sub-node
160-
if popCount(subNode.nodeMap) == 0 && popCount(subNode.dataMap) == 1 {
163+
if subNode.nodeMap.PopCount() == 0 && subNode.dataMap.PopCount() == 1 {
161164
var e Entry
162165
for i := uint32(0); i < 32; i++ {
163-
if hasBit(subNode.dataMap, i) {
166+
if subNode.dataMap.HasBit(uint(i)) {
164167
e = subNode.entries[i]
165168
break
166169
}
167170
}
168171
newNode.entries[index] = e
169-
newNode.nodeMap = clearBit(newNode.nodeMap, index)
170-
newNode.dataMap = setBit(newNode.dataMap, index)
172+
newNode.nodeMap = newNode.nodeMap.ClearBit(uint(index))
173+
newNode.dataMap = newNode.dataMap.SetBit(uint(index))
171174
}
172175
newNode.entries[index] = subNode
173176
return newNode
@@ -183,7 +186,7 @@ func remove(n *node, keyHash uint32, key interface{}) *node {
183186
// compress if only 1 entry exists in collisionNode
184187
if len(cNode.entries) == 1 {
185188
newNode.entries[index] = cNode.entries[0]
186-
newNode.dataMap = setBit(newNode.dataMap, index)
189+
newNode.dataMap = newNode.dataMap.SetBit(uint(index))
187190
}
188191
return newNode
189192
}
@@ -208,9 +211,9 @@ func pushEntries(n *node, stop <-chan struct{}, out chan Entry) {
208211
default:
209212
index := uint32(i)
210213
switch {
211-
case hasBit(n.dataMap, index):
214+
case n.dataMap.HasBit(uint(index)):
212215
out <- e
213-
case hasBit(n.nodeMap, index):
216+
case n.nodeMap.HasBit(uint(index)):
214217
wg.Add(1)
215218
go func() {
216219
defer wg.Done()

trie/dtrie/util.go

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -35,29 +35,6 @@ func mask(hash, level uint32) uint32 {
3535
return (hash >> (5 * level)) & 0x01f
3636
}
3737

38-
func setBit(bitmap uint32, pos uint32) uint32 {
39-
return bitmap | (1 << pos)
40-
}
41-
42-
func clearBit(bitmap uint32, pos uint32) uint32 {
43-
return bitmap & ^(1 << pos)
44-
}
45-
46-
func hasBit(bitmap uint32, pos uint32) bool {
47-
return (bitmap & (1 << pos)) != 0
48-
}
49-
50-
func popCount(bitmap uint32) int {
51-
// bit population count, see
52-
// http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
53-
bitmap -= (bitmap >> 1) & 0x55555555
54-
bitmap = (bitmap>>2)&0x33333333 + bitmap&0x33333333
55-
bitmap += bitmap >> 4
56-
bitmap &= 0x0f0f0f0f
57-
bitmap *= 0x01010101
58-
return int(byte(bitmap >> 24))
59-
}
60-
6138
func defaultHasher(value interface{}) uint32 {
6239
switch v := value.(type) {
6340
case uint8:

0 commit comments

Comments
 (0)