@@ -290,20 +290,18 @@ internal class TrieNode<K, V>(
290290 return TrieNode (0 , 1 shl setBit1, arrayOf<Any ?>(node), owner)
291291 }
292292
293- private fun removeEntryAtIndex (keyIndex : Int , positionMask : Int ): TrieNode <K , V >? {
293+ private fun removeEntryAtIndex (keyIndex : Int , positionMask : Int ): TrieNode <K , V > {
294294// 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
298296 val newBuffer = buffer.removeEntryAtIndex(keyIndex)
299297 return TrieNode (dataMap xor positionMask, nodeMap, newBuffer)
300298 }
301299
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 > {
303301// assert(hasEntryAt(positionMask))
302+ // assert(buffer.size > ENTRY_SIZE)
304303 mutator.size--
305304 mutator.operationResult = valueAtKeyIndex(keyIndex)
306- if (buffer.size == ENTRY_SIZE ) return null
307305
308306 if (ownedBy == = mutator.ownership) {
309307 buffer = buffer.removeEntryAtIndex(keyIndex)
@@ -314,17 +312,16 @@ internal class TrieNode<K, V>(
314312 return TrieNode (dataMap xor positionMask, nodeMap, newBuffer, mutator.ownership)
315313 }
316314
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)
320317 val newBuffer = buffer.removeEntryAtIndex(i)
321318 return TrieNode (0 , 0 , newBuffer)
322319 }
323320
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)
325323 mutator.size--
326324 mutator.operationResult = valueAtKeyIndex(i)
327- if (buffer.size == ENTRY_SIZE ) return null
328325
329326 if (ownedBy == = mutator.ownership) {
330327 buffer = buffer.removeEntryAtIndex(i)
@@ -391,7 +388,7 @@ internal class TrieNode<K, V>(
391388 return TrieNode (0 , 0 , newBuffer, mutator.ownership)
392389 }
393390
394- private fun collisionRemove (key : K ): TrieNode <K , V >? {
391+ private fun collisionRemove (key : K ): TrieNode <K , V > {
395392 for (i in 0 until buffer.size step ENTRY_SIZE ) {
396393 if (key == keyAtIndex(i)) {
397394 return collisionRemoveEntryAtIndex(i)
@@ -400,7 +397,7 @@ internal class TrieNode<K, V>(
400397 return this
401398 }
402399
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 > {
404401 for (i in 0 until buffer.size step ENTRY_SIZE ) {
405402 if (key == keyAtIndex(i)) {
406403 return mutableCollisionRemoveEntryAtIndex(i, mutator)
@@ -409,7 +406,7 @@ internal class TrieNode<K, V>(
409406 return this
410407 }
411408
412- private fun collisionRemove (key : K , value : V ): TrieNode <K , V >? {
409+ private fun collisionRemove (key : K , value : V ): TrieNode <K , V > {
413410 for (i in 0 until buffer.size step ENTRY_SIZE ) {
414411 if (key == keyAtIndex(i) && value == valueAtKeyIndex(i)) {
415412 return collisionRemoveEntryAtIndex(i)
@@ -418,7 +415,7 @@ internal class TrieNode<K, V>(
418415 return this
419416 }
420417
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 > {
422419 for (i in 0 until buffer.size step ENTRY_SIZE ) {
423420 if (key == keyAtIndex(i) && value == valueAtKeyIndex(i)) {
424421 return mutableCollisionRemoveEntryAtIndex(i, mutator)
@@ -534,7 +531,7 @@ internal class TrieNode<K, V>(
534531 return mutableInsertEntryAt(keyPositionMask, key, value, mutator.ownership)
535532 }
536533
537- fun remove (keyHash : Int , key : K , shift : Int ): TrieNode <K , V >? {
534+ fun remove (keyHash : Int , key : K , shift : Int ): TrieNode <K , V > {
538535 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
539536
540537 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -554,7 +551,6 @@ internal class TrieNode<K, V>(
554551 } else {
555552 targetNode.remove(keyHash, key, shift + LOG_MAX_BRANCHING_FACTOR )
556553 }
557- checkNotNull(newNode)
558554 if (targetNode == = newNode) return this
559555 return updateNodeAtIndex(nodeIndex, keyPositionMask, newNode)
560556 }
@@ -563,7 +559,7 @@ internal class TrieNode<K, V>(
563559 return this
564560 }
565561
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 > {
567563 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
568564
569565 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -583,7 +579,6 @@ internal class TrieNode<K, V>(
583579 } else {
584580 targetNode.mutableRemove(keyHash, key, shift + LOG_MAX_BRANCHING_FACTOR , mutator)
585581 }
586- checkNotNull(newNode)
587582 if (ownedBy == = mutator.ownership || targetNode != = newNode) {
588583 return mutableUpdateNodeAtIndex(nodeIndex, keyPositionMask, newNode, mutator.ownership)
589584 }
@@ -594,7 +589,7 @@ internal class TrieNode<K, V>(
594589 return this
595590 }
596591
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 > {
598593 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
599594
600595 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -614,7 +609,6 @@ internal class TrieNode<K, V>(
614609 } else {
615610 targetNode.remove(keyHash, key, value, shift + LOG_MAX_BRANCHING_FACTOR )
616611 }
617- checkNotNull(newNode)
618612 if (targetNode == = newNode) return this
619613 return updateNodeAtIndex(nodeIndex, keyPositionMask, newNode)
620614 }
@@ -623,7 +617,7 @@ internal class TrieNode<K, V>(
623617 return this
624618 }
625619
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 > {
627621 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
628622
629623 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -643,7 +637,6 @@ internal class TrieNode<K, V>(
643637 } else {
644638 targetNode.mutableRemove(keyHash, key, value, shift + LOG_MAX_BRANCHING_FACTOR , mutator)
645639 }
646- checkNotNull(newNode)
647640 if (ownedBy == = mutator.ownership || targetNode != = newNode) {
648641 return mutableUpdateNodeAtIndex(nodeIndex, keyPositionMask, newNode, mutator.ownership)
649642 }
0 commit comments