@@ -76,7 +76,8 @@ internal class TrieNode<K, V>(
7676 internal var buffer: Array <Any ?> = buffer
7777 private set
7878
79- internal fun isCollision (): Boolean {
79+ @Suppress(" NOTHING_TO_INLINE" )
80+ internal inline fun isCollision (): Boolean {
8081 return dataMap == 0 && nodeMap == 0 && buffer.isNotEmpty()
8182 }
8283
@@ -487,10 +488,6 @@ internal class TrieNode<K, V>(
487488 }
488489
489490 fun containsKey (keyHash : Int , key : K , shift : Int ): Boolean {
490- if (isCollision()) {
491- return collisionContainsKey(key)
492- }
493-
494491 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
495492
496493 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -501,15 +498,15 @@ internal class TrieNode<K, V>(
501498 return targetNode.containsKey(keyHash, key, shift + LOG_MAX_BRANCHING_FACTOR )
502499 }
503500
501+ if (isCollision()) {
502+ return collisionContainsKey(key)
503+ }
504+
504505 // key is absent
505506 return false
506507 }
507508
508509 fun get (keyHash : Int , key : K , shift : Int ): V ? {
509- if (isCollision()) {
510- return collisionGet(key)
511- }
512-
513510 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
514511
515512 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -525,15 +522,15 @@ internal class TrieNode<K, V>(
525522 return targetNode.get(keyHash, key, shift + LOG_MAX_BRANCHING_FACTOR )
526523 }
527524
525+ if (isCollision()) {
526+ return collisionGet(key)
527+ }
528+
528529 // key is absent
529530 return null
530531 }
531532
532533 fun put (keyHash : Int , key : K , value : @UnsafeVariance V , shift : Int ): ModificationResult <K , V >? {
533- if (isCollision()) {
534- return collisionPut(key, value, shift)
535- }
536-
537534 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
538535
539536 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -554,15 +551,15 @@ internal class TrieNode<K, V>(
554551 return putResult.replaceNode { node -> updateNodeAtIndex(nodeIndex, node) }
555552 }
556553
554+ if (isCollision()) {
555+ return collisionPut(key, value, shift)
556+ }
557+
557558 // no entry at this key hash segment
558559 return insertEntryAt(keyPositionMask, key, value).asInsertResult()
559560 }
560561
561562 fun mutablePut (keyHash : Int , key : K , value : @UnsafeVariance V , shift : Int , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V > {
562- if (isCollision()) {
563- return mutableCollisionPut(key, value, shift, mutator)
564- }
565-
566563 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
567564
568565 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -590,16 +587,16 @@ internal class TrieNode<K, V>(
590587 return mutableUpdateNodeAtIndex(nodeIndex, newNode, mutator.ownership)
591588 }
592589
590+ if (isCollision()) {
591+ return mutableCollisionPut(key, value, shift, mutator)
592+ }
593+
593594 // key is absent
594595 mutator.size++
595596 return mutableInsertEntryAt(keyPositionMask, key, value, mutator.ownership)
596597 }
597598
598599 fun remove (keyHash : Int , key : K , shift : Int ): TrieNode <K , V >? {
599- if (isCollision()) {
600- return collisionRemove(key)
601- }
602-
603600 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
604601
605602 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -622,15 +619,15 @@ internal class TrieNode<K, V>(
622619 }
623620 }
624621
622+ if (isCollision()) {
623+ return collisionRemove(key)
624+ }
625+
625626 // key is absent
626627 return this
627628 }
628629
629630 fun mutableRemove (keyHash : Int , key : K , shift : Int , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V >? {
630- if (isCollision()) {
631- return mutableCollisionRemove(key, mutator)
632- }
633-
634631 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
635632
636633 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -653,15 +650,15 @@ internal class TrieNode<K, V>(
653650 }
654651 }
655652
653+ if (isCollision()) {
654+ return mutableCollisionRemove(key, mutator)
655+ }
656+
656657 // key is absent
657658 return this
658659 }
659660
660661 fun remove (keyHash : Int , key : K , value : @UnsafeVariance V , shift : Int ): TrieNode <K , V >? {
661- if (isCollision()) {
662- return collisionRemove(key, value)
663- }
664-
665662 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
666663
667664 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -684,15 +681,15 @@ internal class TrieNode<K, V>(
684681 }
685682 }
686683
684+ if (isCollision()) {
685+ return collisionRemove(key, value)
686+ }
687+
687688 // key is absent
688689 return this
689690 }
690691
691692 fun mutableRemove (keyHash : Int , key : K , value : @UnsafeVariance V , shift : Int , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V >? {
692- if (isCollision()) {
693- return mutableCollisionRemove(key, value, mutator)
694- }
695-
696693 val keyPositionMask = 1 shl indexSegment(keyHash, shift)
697694
698695 if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -715,6 +712,10 @@ internal class TrieNode<K, V>(
715712 }
716713 }
717714
715+ if (isCollision()) {
716+ return mutableCollisionRemove(key, value, mutator)
717+ }
718+
718719 // key is absent
719720 return this
720721 }
0 commit comments