@@ -71,7 +71,7 @@ internal class TrieNode<K, V>(
71
71
private var dataMap : Int ,
72
72
private var nodeMap : Int ,
73
73
buffer : Array <Any ?>,
74
- private val marker : Marker ?
74
+ private val ownedBy : MutabilityOwnership ?
75
75
) {
76
76
constructor (dataMap: Int , nodeMap: Int , buffer: Array <Any ?>) : this (dataMap, nodeMap, buffer, null )
77
77
@@ -139,17 +139,17 @@ internal class TrieNode<K, V>(
139
139
return TrieNode (dataMap or positionMask, nodeMap, newBuffer)
140
140
}
141
141
142
- private fun mutableInsertEntryAt (positionMask : Int , key : K , value : V , mutatorMarker : Marker ): TrieNode <K , V > {
142
+ private fun mutableInsertEntryAt (positionMask : Int , key : K , value : V , owner : MutabilityOwnership ): TrieNode <K , V > {
143
143
// assert(!hasEntryAt(positionMask))
144
144
145
145
val keyIndex = entryKeyIndex(positionMask)
146
- if (marker == = mutatorMarker ) {
146
+ if (ownedBy == = owner ) {
147
147
buffer = buffer.insertEntryAtIndex(keyIndex, key, value)
148
148
dataMap = dataMap or positionMask
149
149
return this
150
150
}
151
151
val newBuffer = buffer.insertEntryAtIndex(keyIndex, key, value)
152
- return TrieNode (dataMap or positionMask, nodeMap, newBuffer, mutatorMarker )
152
+ return TrieNode (dataMap or positionMask, nodeMap, newBuffer, owner )
153
153
}
154
154
155
155
private fun updateValueAtIndex (keyIndex : Int , value : V ): TrieNode <K , V > {
@@ -164,7 +164,7 @@ internal class TrieNode<K, V>(
164
164
// assert(buffer[keyIndex + 1] !== value)
165
165
166
166
// If the [mutator] is exclusive owner of this node, update value at specified index in-place.
167
- if (marker == = mutator.marker ) {
167
+ if (ownedBy == = mutator.ownership ) {
168
168
buffer[keyIndex + 1 ] = value
169
169
return this
170
170
}
@@ -173,7 +173,7 @@ internal class TrieNode<K, V>(
173
173
// Create new node with updated value at specified index.
174
174
val newBuffer = buffer.copyOf()
175
175
newBuffer[keyIndex + 1 ] = value
176
- return TrieNode (dataMap, nodeMap, newBuffer, mutator.marker )
176
+ return TrieNode (dataMap, nodeMap, newBuffer, mutator.ownership )
177
177
}
178
178
179
179
private fun updateNodeAtIndex (nodeIndex : Int , newNode : TrieNode <K , V >): TrieNode <K , V > {
@@ -184,25 +184,25 @@ internal class TrieNode<K, V>(
184
184
return TrieNode (dataMap, nodeMap, newBuffer)
185
185
}
186
186
187
- private fun mutableUpdateNodeAtIndex (nodeIndex : Int , newNode : TrieNode <K , V >, mutatorMarker : Marker ): TrieNode <K , V > {
187
+ private fun mutableUpdateNodeAtIndex (nodeIndex : Int , newNode : TrieNode <K , V >, owner : MutabilityOwnership ): TrieNode <K , V > {
188
188
// assert(buffer[nodeIndex] !== newNode)
189
189
190
- if (marker == = mutatorMarker ) {
190
+ if (ownedBy == = owner ) {
191
191
buffer[nodeIndex] = newNode
192
192
return this
193
193
}
194
194
val newBuffer = buffer.copyOf()
195
195
newBuffer[nodeIndex] = newNode
196
- return TrieNode (dataMap, nodeMap, newBuffer, mutatorMarker )
196
+ return TrieNode (dataMap, nodeMap, newBuffer, owner )
197
197
}
198
198
199
199
private fun bufferMoveEntryToNode (keyIndex : Int , positionMask : Int , newKeyHash : Int ,
200
- newKey : K , newValue : V , shift : Int , mutatorMarker : Marker ? ): Array <Any ?> {
200
+ newKey : K , newValue : V , shift : Int , owner : MutabilityOwnership ? ): Array <Any ?> {
201
201
val storedKey = keyAtIndex(keyIndex)
202
202
val storedKeyHash = storedKey.hashCode()
203
203
val storedValue = valueAtKeyIndex(keyIndex)
204
204
val newNode = makeNode(storedKeyHash, storedKey, storedValue,
205
- newKeyHash, newKey, newValue, shift + LOG_MAX_BRANCHING_FACTOR , mutatorMarker )
205
+ newKeyHash, newKey, newValue, shift + LOG_MAX_BRANCHING_FACTOR , owner )
206
206
207
207
val nodeIndex = nodeIndex(positionMask) + 1 // place where to insert new node in the current buffer
208
208
@@ -220,27 +220,27 @@ internal class TrieNode<K, V>(
220
220
}
221
221
222
222
private fun mutableMoveEntryToNode (keyIndex : Int , positionMask : Int , newKeyHash : Int ,
223
- newKey : K , newValue : V , shift : Int , mutatorMarker : Marker ): TrieNode <K , V > {
223
+ newKey : K , newValue : V , shift : Int , owner : MutabilityOwnership ): TrieNode <K , V > {
224
224
// assert(hasEntryAt(positionMask))
225
225
// assert(!hasNodeAt(positionMask))
226
226
227
- if (marker == = mutatorMarker ) {
228
- buffer = bufferMoveEntryToNode(keyIndex, positionMask, newKeyHash, newKey, newValue, shift, mutatorMarker )
227
+ if (ownedBy == = owner ) {
228
+ buffer = bufferMoveEntryToNode(keyIndex, positionMask, newKeyHash, newKey, newValue, shift, owner )
229
229
dataMap = dataMap xor positionMask
230
230
nodeMap = nodeMap or positionMask
231
231
return this
232
232
}
233
- val newBuffer = bufferMoveEntryToNode(keyIndex, positionMask, newKeyHash, newKey, newValue, shift, mutatorMarker )
234
- return TrieNode (dataMap xor positionMask, nodeMap or positionMask, newBuffer, mutatorMarker )
233
+ val newBuffer = bufferMoveEntryToNode(keyIndex, positionMask, newKeyHash, newKey, newValue, shift, owner )
234
+ return TrieNode (dataMap xor positionMask, nodeMap or positionMask, newBuffer, owner )
235
235
}
236
236
237
237
/* * Creates a new TrieNode for holding two given key value entries */
238
238
private fun makeNode (keyHash1 : Int , key1 : K , value1 : V ,
239
- keyHash2 : Int , key2 : K , value2 : V , shift : Int , mutatorMarker : Marker ? ): TrieNode <K , V > {
239
+ keyHash2 : Int , key2 : K , value2 : V , shift : Int , owner : MutabilityOwnership ? ): TrieNode <K , V > {
240
240
if (shift > MAX_SHIFT ) {
241
241
// assert(key1 != key2)
242
242
// when two key hashes are entirely equal: the last level subtrie node stores them just as unordered list
243
- return TrieNode (0 , 0 , arrayOf(key1, value1, key2, value2), mutatorMarker )
243
+ return TrieNode (0 , 0 , arrayOf(key1, value1, key2, value2), owner )
244
244
}
245
245
246
246
val setBit1 = indexSegment(keyHash1, shift)
@@ -252,11 +252,11 @@ internal class TrieNode<K, V>(
252
252
} else {
253
253
arrayOf(key2, value2, key1, value1)
254
254
}
255
- return TrieNode ((1 shl setBit1) or (1 shl setBit2), 0 , nodeBuffer, mutatorMarker )
255
+ return TrieNode ((1 shl setBit1) or (1 shl setBit2), 0 , nodeBuffer, owner )
256
256
}
257
257
// hash segments at the given shift are equal: move these entries into the subtrie
258
- val node = makeNode(keyHash1, key1, value1, keyHash2, key2, value2, shift + LOG_MAX_BRANCHING_FACTOR , mutatorMarker )
259
- return TrieNode (0 , 1 shl setBit1, arrayOf<Any ?>(node), mutatorMarker )
258
+ val node = makeNode(keyHash1, key1, value1, keyHash2, key2, value2, shift + LOG_MAX_BRANCHING_FACTOR , owner )
259
+ return TrieNode (0 , 1 shl setBit1, arrayOf<Any ?>(node), owner )
260
260
}
261
261
262
262
private fun removeEntryAtIndex (keyIndex : Int , positionMask : Int ): TrieNode <K , V >? {
@@ -273,13 +273,13 @@ internal class TrieNode<K, V>(
273
273
mutator.operationResult = valueAtKeyIndex(keyIndex)
274
274
if (buffer.size == ENTRY_SIZE ) return null
275
275
276
- if (marker == = mutator.marker ) {
276
+ if (ownedBy == = mutator.ownership ) {
277
277
buffer = buffer.removeEntryAtIndex(keyIndex)
278
278
dataMap = dataMap xor positionMask
279
279
return this
280
280
}
281
281
val newBuffer = buffer.removeEntryAtIndex(keyIndex)
282
- return TrieNode (dataMap xor positionMask, nodeMap, newBuffer, mutator.marker )
282
+ return TrieNode (dataMap xor positionMask, nodeMap, newBuffer, mutator.ownership )
283
283
}
284
284
285
285
private fun collisionRemoveEntryAtIndex (i : Int ): TrieNode <K , V >? {
@@ -294,12 +294,12 @@ internal class TrieNode<K, V>(
294
294
mutator.operationResult = valueAtKeyIndex(i)
295
295
if (buffer.size == ENTRY_SIZE ) return null
296
296
297
- if (marker == = mutator.marker ) {
297
+ if (ownedBy == = mutator.ownership ) {
298
298
buffer = buffer.removeEntryAtIndex(i)
299
299
return this
300
300
}
301
301
val newBuffer = buffer.removeEntryAtIndex(i)
302
- return TrieNode (0 , 0 , newBuffer, mutator.marker )
302
+ return TrieNode (0 , 0 , newBuffer, mutator.ownership )
303
303
}
304
304
305
305
private fun removeNodeAtIndex (nodeIndex : Int , positionMask : Int ): TrieNode <K , V >? {
@@ -310,17 +310,17 @@ internal class TrieNode<K, V>(
310
310
return TrieNode (dataMap, nodeMap xor positionMask, newBuffer)
311
311
}
312
312
313
- private fun mutableRemoveNodeAtIndex (nodeIndex : Int , positionMask : Int , mutatorMarker : Marker ): TrieNode <K , V >? {
313
+ private fun mutableRemoveNodeAtIndex (nodeIndex : Int , positionMask : Int , owner : MutabilityOwnership ): TrieNode <K , V >? {
314
314
// assert(hasNodeAt(positionMask))
315
315
if (buffer.size == 1 ) return null
316
316
317
- if (marker == = mutatorMarker ) {
317
+ if (ownedBy == = owner ) {
318
318
buffer = buffer.removeNodeAtIndex(nodeIndex)
319
319
nodeMap = nodeMap xor positionMask
320
320
return this
321
321
}
322
322
val newBuffer = buffer.removeNodeAtIndex(nodeIndex)
323
- return TrieNode (dataMap, nodeMap xor positionMask, newBuffer, mutatorMarker )
323
+ return TrieNode (dataMap, nodeMap xor positionMask, newBuffer, owner )
324
324
}
325
325
326
326
private fun collisionContainsKey (key : K ): Boolean {
@@ -361,7 +361,7 @@ internal class TrieNode<K, V>(
361
361
mutator.operationResult = valueAtKeyIndex(i)
362
362
363
363
// If the [mutator] is exclusive owner of this node, update value of the entry in-place.
364
- if (marker == = mutator.marker ) {
364
+ if (ownedBy == = mutator.ownership ) {
365
365
buffer[i + 1 ] = value
366
366
return this
367
367
}
@@ -371,13 +371,13 @@ internal class TrieNode<K, V>(
371
371
// Create new node with updated entry value.
372
372
val newBuffer = buffer.copyOf()
373
373
newBuffer[i + 1 ] = value
374
- return TrieNode (0 , 0 , newBuffer, mutator.marker )
374
+ return TrieNode (0 , 0 , newBuffer, mutator.ownership )
375
375
}
376
376
}
377
377
// Create new collision node with the specified entry added to it.
378
378
mutator.size++
379
379
val newBuffer = buffer.insertEntryAtIndex(0 , key, value)
380
- return TrieNode (0 , 0 , newBuffer, mutator.marker )
380
+ return TrieNode (0 , 0 , newBuffer, mutator.ownership )
381
381
}
382
382
383
383
private fun collisionRemove (key : K ): TrieNode <K , V >? {
@@ -501,7 +501,7 @@ internal class TrieNode<K, V>(
501
501
return mutableUpdateValueAtIndex(keyIndex, value, mutator)
502
502
}
503
503
mutator.size++
504
- return mutableMoveEntryToNode(keyIndex, keyPositionMask, keyHash, key, value, shift, mutator.marker )
504
+ return mutableMoveEntryToNode(keyIndex, keyPositionMask, keyHash, key, value, shift, mutator.ownership )
505
505
}
506
506
if (hasNodeAt(keyPositionMask)) { // key is in node
507
507
val nodeIndex = nodeIndex(keyPositionMask)
@@ -515,12 +515,12 @@ internal class TrieNode<K, V>(
515
515
if (targetNode == = newNode) {
516
516
return this
517
517
}
518
- return mutableUpdateNodeAtIndex(nodeIndex, newNode, mutator.marker )
518
+ return mutableUpdateNodeAtIndex(nodeIndex, newNode, mutator.ownership )
519
519
}
520
520
521
521
// key is absent
522
522
mutator.size++
523
- return mutableInsertEntryAt(keyPositionMask, key, value, mutator.marker )
523
+ return mutableInsertEntryAt(keyPositionMask, key, value, mutator.ownership )
524
524
}
525
525
526
526
fun remove (keyHash : Int , key : K , shift : Int ): TrieNode <K , V >? {
@@ -576,8 +576,8 @@ internal class TrieNode<K, V>(
576
576
}
577
577
return when {
578
578
targetNode == = newNode -> this
579
- newNode == null -> mutableRemoveNodeAtIndex(nodeIndex, keyPositionMask, mutator.marker )
580
- else -> mutableUpdateNodeAtIndex(nodeIndex, newNode, mutator.marker )
579
+ newNode == null -> mutableRemoveNodeAtIndex(nodeIndex, keyPositionMask, mutator.ownership )
580
+ else -> mutableUpdateNodeAtIndex(nodeIndex, newNode, mutator.ownership )
581
581
}
582
582
}
583
583
@@ -638,8 +638,8 @@ internal class TrieNode<K, V>(
638
638
}
639
639
return when {
640
640
targetNode == = newNode -> this
641
- newNode == null -> mutableRemoveNodeAtIndex(nodeIndex, keyPositionMask, mutator.marker )
642
- else -> mutableUpdateNodeAtIndex(nodeIndex, newNode, mutator.marker )
641
+ newNode == null -> mutableRemoveNodeAtIndex(nodeIndex, keyPositionMask, mutator.ownership )
642
+ else -> mutableUpdateNodeAtIndex(nodeIndex, newNode, mutator.ownership )
643
643
}
644
644
}
645
645
0 commit comments