@@ -292,20 +292,18 @@ internal class TrieNode<K, V>(
292292 return TrieNode (0 , 1 shl setBit1, arrayOf<Any ?>(node), owner)
293293 }
294294
295- private fun removeEntryAtIndex (keyIndex : Int , positionMask : Int ): TrieNode <K , V >? {
295+ private fun removeEntryAtIndex (keyIndex : Int , positionMask : Int ): TrieNode <K , V > {
296296// 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
300298 val newBuffer = buffer.removeEntryAtIndex(keyIndex)
301299 return TrieNode (dataMap xor positionMask, nodeMap, newBuffer)
302300 }
303301
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 > {
305303// assert(hasEntryAt(positionMask))
304+ // assert(buffer.size > ENTRY_SIZE)
306305 mutator.size--
307306 mutator.operationResult = valueAtKeyIndex(keyIndex)
308- if (buffer.size == ENTRY_SIZE ) return null
309307
310308 if (ownedBy == = mutator.ownership) {
311309 buffer = buffer.removeEntryAtIndex(keyIndex)
@@ -316,17 +314,16 @@ internal class TrieNode<K, V>(
316314 return TrieNode (dataMap xor positionMask, nodeMap, newBuffer, mutator.ownership)
317315 }
318316
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)
322319 val newBuffer = buffer.removeEntryAtIndex(i)
323320 return TrieNode (0 , 0 , newBuffer)
324321 }
325322
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)
327325 mutator.size--
328326 mutator.operationResult = valueAtKeyIndex(i)
329- if (buffer.size == ENTRY_SIZE ) return null
330327
331328 if (ownedBy == = mutator.ownership) {
332329 buffer = buffer.removeEntryAtIndex(i)
@@ -393,7 +390,7 @@ internal class TrieNode<K, V>(
393390 return TrieNode (0 , 0 , newBuffer, mutator.ownership)
394391 }
395392
396- private fun collisionRemove (key : K ): TrieNode <K , V >? {
393+ private fun collisionRemove (key : K ): TrieNode <K , V > {
397394 for (i in 0 until buffer.size step ENTRY_SIZE ) {
398395 if (key == keyAtIndex(i)) {
399396 return collisionRemoveEntryAtIndex(i)
@@ -402,7 +399,7 @@ internal class TrieNode<K, V>(
402399 return this
403400 }
404401
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 > {
406403 for (i in 0 until buffer.size step ENTRY_SIZE ) {
407404 if (key == keyAtIndex(i)) {
408405 return mutableCollisionRemoveEntryAtIndex(i, mutator)
@@ -411,7 +408,7 @@ internal class TrieNode<K, V>(
411408 return this
412409 }
413410
414- private fun collisionRemove (key : K , value : V ): TrieNode <K , V >? {
411+ private fun collisionRemove (key : K , value : V ): TrieNode <K , V > {
415412 for (i in 0 until buffer.size step ENTRY_SIZE ) {
416413 if (key == keyAtIndex(i) && value == valueAtKeyIndex(i)) {
417414 return collisionRemoveEntryAtIndex(i)
@@ -420,7 +417,7 @@ internal class TrieNode<K, V>(
420417 return this
421418 }
422419
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 > {
424421 for (i in 0 until buffer.size step ENTRY_SIZE ) {
425422 if (key == keyAtIndex(i) && value == valueAtKeyIndex(i)) {
426423 return mutableCollisionRemoveEntryAtIndex(i, mutator)
@@ -536,7 +533,7 @@ internal class TrieNode<K, V>(
536533 return mutableInsertEntryAt(keyPositionMask, key, value, mutator.ownership)
537534 }
538535
539- fun remove (keyHash : Int , key : K , shift : Int ): TrieNode <K , V >? {
536+ fun remove (keyHash : Int , key : K , shift : Int ): TrieNode <K , V > {
540537 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
541538
542539 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -556,7 +553,6 @@ internal class TrieNode<K, V>(
556553 } else {
557554 targetNode.remove(keyHash, key, shift + LOG_MAX_BRANCHING_FACTOR )
558555 }
559- checkNotNull(newNode)
560556 if (targetNode == = newNode) return this
561557 return updateNodeAtIndex(nodeIndex, keyPositionMask, newNode)
562558 }
@@ -565,7 +561,7 @@ internal class TrieNode<K, V>(
565561 return this
566562 }
567563
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 > {
569565 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
570566
571567 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -585,7 +581,6 @@ internal class TrieNode<K, V>(
585581 } else {
586582 targetNode.mutableRemove(keyHash, key, shift + LOG_MAX_BRANCHING_FACTOR , mutator)
587583 }
588- checkNotNull(newNode)
589584 if (ownedBy == = mutator.ownership || targetNode != = newNode) {
590585 return mutableUpdateNodeAtIndex(nodeIndex, keyPositionMask, newNode, mutator.ownership)
591586 }
@@ -596,7 +591,7 @@ internal class TrieNode<K, V>(
596591 return this
597592 }
598593
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 > {
600595 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
601596
602597 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -616,7 +611,6 @@ internal class TrieNode<K, V>(
616611 } else {
617612 targetNode.remove(keyHash, key, value, shift + LOG_MAX_BRANCHING_FACTOR )
618613 }
619- checkNotNull(newNode)
620614 if (targetNode == = newNode) return this
621615 return updateNodeAtIndex(nodeIndex, keyPositionMask, newNode)
622616 }
@@ -625,7 +619,7 @@ internal class TrieNode<K, V>(
625619 return this
626620 }
627621
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 > {
629623 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
630624
631625 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -645,7 +639,6 @@ internal class TrieNode<K, V>(
645639 } else {
646640 targetNode.mutableRemove(keyHash, key, value, shift + LOG_MAX_BRANCHING_FACTOR , mutator)
647641 }
648- checkNotNull(newNode)
649642 if (ownedBy == = mutator.ownership || targetNode != = newNode) {
650643 return mutableUpdateNodeAtIndex(nodeIndex, keyPositionMask, newNode, mutator.ownership)
651644 }
0 commit comments