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