@@ -290,20 +290,18 @@ internal class TrieNode<K, V>(
290
290
return TrieNode (0 , 1 shl setBit1, arrayOf<Any ?>(node), owner)
291
291
}
292
292
293
- private fun removeEntryAtIndex (keyIndex : Int , positionMask : Int ): TrieNode <K , V >? {
293
+ private fun removeEntryAtIndex (keyIndex : Int , positionMask : Int ): TrieNode <K , V > {
294
294
// assert(hasEntryAt(positionMask))
295
- // It is possible only when this node is the root node
296
- if (buffer.size == ENTRY_SIZE ) return null
297
-
295
+ // assert(buffer.size > ENTRY_SIZE) // can be false only for the root node
298
296
val newBuffer = buffer.removeEntryAtIndex(keyIndex)
299
297
return TrieNode (dataMap xor positionMask, nodeMap, newBuffer)
300
298
}
301
299
302
- private fun mutableRemoveEntryAtIndex (keyIndex : Int , positionMask : Int , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V >? {
300
+ private fun mutableRemoveEntryAtIndex (keyIndex : Int , positionMask : Int , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V > {
303
301
// assert(hasEntryAt(positionMask))
302
+ // assert(buffer.size > ENTRY_SIZE)
304
303
mutator.size--
305
304
mutator.operationResult = valueAtKeyIndex(keyIndex)
306
- if (buffer.size == ENTRY_SIZE ) return null
307
305
308
306
if (ownedBy == = mutator.ownership) {
309
307
buffer = buffer.removeEntryAtIndex(keyIndex)
@@ -314,17 +312,16 @@ internal class TrieNode<K, V>(
314
312
return TrieNode (dataMap xor positionMask, nodeMap, newBuffer, mutator.ownership)
315
313
}
316
314
317
- private fun collisionRemoveEntryAtIndex (i : Int ): TrieNode <K , V >? {
318
- if (buffer.size == ENTRY_SIZE ) return null
319
-
315
+ private fun collisionRemoveEntryAtIndex (i : Int ): TrieNode <K , V > {
316
+ // assert(buffer.size > ENTRY_SIZE)
320
317
val newBuffer = buffer.removeEntryAtIndex(i)
321
318
return TrieNode (0 , 0 , newBuffer)
322
319
}
323
320
324
- private fun mutableCollisionRemoveEntryAtIndex (i : Int , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V >? {
321
+ private fun mutableCollisionRemoveEntryAtIndex (i : Int , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V > {
322
+ // assert(buffer.size > ENTRY_SIZE)
325
323
mutator.size--
326
324
mutator.operationResult = valueAtKeyIndex(i)
327
- if (buffer.size == ENTRY_SIZE ) return null
328
325
329
326
if (ownedBy == = mutator.ownership) {
330
327
buffer = buffer.removeEntryAtIndex(i)
@@ -391,7 +388,7 @@ internal class TrieNode<K, V>(
391
388
return TrieNode (0 , 0 , newBuffer, mutator.ownership)
392
389
}
393
390
394
- private fun collisionRemove (key : K ): TrieNode <K , V >? {
391
+ private fun collisionRemove (key : K ): TrieNode <K , V > {
395
392
for (i in 0 until buffer.size step ENTRY_SIZE ) {
396
393
if (key == keyAtIndex(i)) {
397
394
return collisionRemoveEntryAtIndex(i)
@@ -400,7 +397,7 @@ internal class TrieNode<K, V>(
400
397
return this
401
398
}
402
399
403
- private fun mutableCollisionRemove (key : K , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V >? {
400
+ private fun mutableCollisionRemove (key : K , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V > {
404
401
for (i in 0 until buffer.size step ENTRY_SIZE ) {
405
402
if (key == keyAtIndex(i)) {
406
403
return mutableCollisionRemoveEntryAtIndex(i, mutator)
@@ -409,7 +406,7 @@ internal class TrieNode<K, V>(
409
406
return this
410
407
}
411
408
412
- private fun collisionRemove (key : K , value : V ): TrieNode <K , V >? {
409
+ private fun collisionRemove (key : K , value : V ): TrieNode <K , V > {
413
410
for (i in 0 until buffer.size step ENTRY_SIZE ) {
414
411
if (key == keyAtIndex(i) && value == valueAtKeyIndex(i)) {
415
412
return collisionRemoveEntryAtIndex(i)
@@ -418,7 +415,7 @@ internal class TrieNode<K, V>(
418
415
return this
419
416
}
420
417
421
- private fun mutableCollisionRemove (key : K , value : V , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V >? {
418
+ private fun mutableCollisionRemove (key : K , value : V , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V > {
422
419
for (i in 0 until buffer.size step ENTRY_SIZE ) {
423
420
if (key == keyAtIndex(i) && value == valueAtKeyIndex(i)) {
424
421
return mutableCollisionRemoveEntryAtIndex(i, mutator)
@@ -534,7 +531,7 @@ internal class TrieNode<K, V>(
534
531
return mutableInsertEntryAt(keyPositionMask, key, value, mutator.ownership)
535
532
}
536
533
537
- fun remove (keyHash : Int , key : K , shift : Int ): TrieNode <K , V >? {
534
+ fun remove (keyHash : Int , key : K , shift : Int ): TrieNode <K , V > {
538
535
val keyPositionMask = 1 shl indexSegment(keyHash, shift)
539
536
540
537
if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -554,7 +551,6 @@ internal class TrieNode<K, V>(
554
551
} else {
555
552
targetNode.remove(keyHash, key, shift + LOG_MAX_BRANCHING_FACTOR )
556
553
}
557
- checkNotNull(newNode)
558
554
if (targetNode == = newNode) return this
559
555
return updateNodeAtIndex(nodeIndex, keyPositionMask, newNode)
560
556
}
@@ -563,7 +559,7 @@ internal class TrieNode<K, V>(
563
559
return this
564
560
}
565
561
566
- fun mutableRemove (keyHash : Int , key : K , shift : Int , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V >? {
562
+ fun mutableRemove (keyHash : Int , key : K , shift : Int , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V > {
567
563
val keyPositionMask = 1 shl indexSegment(keyHash, shift)
568
564
569
565
if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -583,7 +579,6 @@ internal class TrieNode<K, V>(
583
579
} else {
584
580
targetNode.mutableRemove(keyHash, key, shift + LOG_MAX_BRANCHING_FACTOR , mutator)
585
581
}
586
- checkNotNull(newNode)
587
582
if (ownedBy == = mutator.ownership || targetNode != = newNode) {
588
583
return mutableUpdateNodeAtIndex(nodeIndex, keyPositionMask, newNode, mutator.ownership)
589
584
}
@@ -594,7 +589,7 @@ internal class TrieNode<K, V>(
594
589
return this
595
590
}
596
591
597
- fun remove (keyHash : Int , key : K , value : @UnsafeVariance V , shift : Int ): TrieNode <K , V >? {
592
+ fun remove (keyHash : Int , key : K , value : @UnsafeVariance V , shift : Int ): TrieNode <K , V > {
598
593
val keyPositionMask = 1 shl indexSegment(keyHash, shift)
599
594
600
595
if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -614,7 +609,6 @@ internal class TrieNode<K, V>(
614
609
} else {
615
610
targetNode.remove(keyHash, key, value, shift + LOG_MAX_BRANCHING_FACTOR )
616
611
}
617
- checkNotNull(newNode)
618
612
if (targetNode == = newNode) return this
619
613
return updateNodeAtIndex(nodeIndex, keyPositionMask, newNode)
620
614
}
@@ -623,7 +617,7 @@ internal class TrieNode<K, V>(
623
617
return this
624
618
}
625
619
626
- fun mutableRemove (keyHash : Int , key : K , value : @UnsafeVariance V , shift : Int , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V >? {
620
+ fun mutableRemove (keyHash : Int , key : K , value : @UnsafeVariance V , shift : Int , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V > {
627
621
val keyPositionMask = 1 shl indexSegment(keyHash, shift)
628
622
629
623
if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -643,7 +637,6 @@ internal class TrieNode<K, V>(
643
637
} else {
644
638
targetNode.mutableRemove(keyHash, key, value, shift + LOG_MAX_BRANCHING_FACTOR , mutator)
645
639
}
646
- checkNotNull(newNode)
647
640
if (ownedBy == = mutator.ownership || targetNode != = newNode) {
648
641
return mutableUpdateNodeAtIndex(nodeIndex, keyPositionMask, newNode, mutator.ownership)
649
642
}
0 commit comments