@@ -29,12 +29,14 @@ package dtrie
2929import (
3030 "fmt"
3131 "sync"
32+
33+ "github.com/Workiva/go-datastructures/bitmap"
3234)
3335
3436type 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
126129func 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 {
148151func 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 ()
0 commit comments