@@ -76,7 +76,8 @@ internal class TrieNode<K, V>(
76
76
internal var buffer: Array <Any ?> = buffer
77
77
private set
78
78
79
- internal fun isCollision (): Boolean {
79
+ @Suppress(" NOTHING_TO_INLINE" )
80
+ internal inline fun isCollision (): Boolean {
80
81
return dataMap == 0 && nodeMap == 0 && buffer.isNotEmpty()
81
82
}
82
83
@@ -471,10 +472,6 @@ internal class TrieNode<K, V>(
471
472
}
472
473
473
474
fun containsKey (keyHash : Int , key : K , shift : Int ): Boolean {
474
- if (isCollision()) {
475
- return collisionContainsKey(keyHash, key)
476
- }
477
-
478
475
val keyPositionMask = 1 shl indexSegment(keyHash, shift)
479
476
480
477
if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -485,15 +482,15 @@ internal class TrieNode<K, V>(
485
482
return targetNode.containsKey(keyHash, key, shift + LOG_MAX_BRANCHING_FACTOR )
486
483
}
487
484
485
+ if (isCollision()) {
486
+ return collisionContainsKey(keyHash, key)
487
+ }
488
+
488
489
// key is absent
489
490
return false
490
491
}
491
492
492
493
fun get (keyHash : Int , key : K , shift : Int ): V ? {
493
- if (isCollision()) {
494
- return collisionGet(keyHash, key)
495
- }
496
-
497
494
val keyPositionMask = 1 shl indexSegment(keyHash, shift)
498
495
499
496
if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -509,15 +506,15 @@ internal class TrieNode<K, V>(
509
506
return targetNode.get(keyHash, key, shift + LOG_MAX_BRANCHING_FACTOR )
510
507
}
511
508
509
+ if (isCollision()) {
510
+ return collisionGet(keyHash, key)
511
+ }
512
+
512
513
// key is absent
513
514
return null
514
515
}
515
516
516
517
fun put (keyHash : Int , key : K , value : @UnsafeVariance V , shift : Int ): ModificationResult <K , V >? {
517
- if (isCollision()) {
518
- return collisionPut(keyHash, key, value, shift)
519
- }
520
-
521
518
val keyPositionMask = 1 shl indexSegment(keyHash, shift)
522
519
523
520
if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -538,15 +535,15 @@ internal class TrieNode<K, V>(
538
535
return putResult.replaceNode { node -> updateNodeAtIndex(nodeIndex, node) }
539
536
}
540
537
538
+ if (isCollision()) {
539
+ return collisionPut(keyHash, key, value, shift)
540
+ }
541
+
541
542
// no entry at this key hash segment
542
543
return insertEntryAt(keyPositionMask, key, value).asInsertResult()
543
544
}
544
545
545
546
fun mutablePut (keyHash : Int , key : K , value : @UnsafeVariance V , shift : Int , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V > {
546
- if (isCollision()) {
547
- return mutableCollisionPut(keyHash, key, value, shift, mutator)
548
- }
549
-
550
547
val keyPositionMask = 1 shl indexSegment(keyHash, shift)
551
548
552
549
if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -574,16 +571,16 @@ internal class TrieNode<K, V>(
574
571
return mutableUpdateNodeAtIndex(nodeIndex, newNode, mutator.ownership)
575
572
}
576
573
574
+ if (isCollision()) {
575
+ return mutableCollisionPut(keyHash, key, value, shift, mutator)
576
+ }
577
+
577
578
// key is absent
578
579
mutator.size++
579
580
return mutableInsertEntryAt(keyPositionMask, key, value, mutator.ownership)
580
581
}
581
582
582
583
fun remove (keyHash : Int , key : K , shift : Int ): TrieNode <K , V >? {
583
- if (isCollision()) {
584
- return collisionRemove(keyHash, key)
585
- }
586
-
587
584
val keyPositionMask = 1 shl indexSegment(keyHash, shift)
588
585
589
586
if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -606,15 +603,15 @@ internal class TrieNode<K, V>(
606
603
}
607
604
}
608
605
606
+ if (isCollision()) {
607
+ return collisionRemove(keyHash, key)
608
+ }
609
+
609
610
// key is absent
610
611
return this
611
612
}
612
613
613
614
fun mutableRemove (keyHash : Int , key : K , shift : Int , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V >? {
614
- if (isCollision()) {
615
- return mutableCollisionRemove(keyHash, key, mutator)
616
- }
617
-
618
615
val keyPositionMask = 1 shl indexSegment(keyHash, shift)
619
616
620
617
if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -637,15 +634,15 @@ internal class TrieNode<K, V>(
637
634
}
638
635
}
639
636
637
+ if (isCollision()) {
638
+ return mutableCollisionRemove(keyHash, key, mutator)
639
+ }
640
+
640
641
// key is absent
641
642
return this
642
643
}
643
644
644
645
fun remove (keyHash : Int , key : K , value : @UnsafeVariance V , shift : Int ): TrieNode <K , V >? {
645
- if (isCollision()) {
646
- return collisionRemove(keyHash, key, value)
647
- }
648
-
649
646
val keyPositionMask = 1 shl indexSegment(keyHash, shift)
650
647
651
648
if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -668,15 +665,15 @@ internal class TrieNode<K, V>(
668
665
}
669
666
}
670
667
668
+ if (isCollision()) {
669
+ return collisionRemove(keyHash, key, value)
670
+ }
671
+
671
672
// key is absent
672
673
return this
673
674
}
674
675
675
676
fun mutableRemove (keyHash : Int , key : K , value : @UnsafeVariance V , shift : Int , mutator : PersistentHashMapBuilder <K , V >): TrieNode <K , V >? {
676
- if (isCollision()) {
677
- return mutableCollisionRemove(keyHash, key, value, mutator)
678
- }
679
-
680
677
val keyPositionMask = 1 shl indexSegment(keyHash, shift)
681
678
682
679
if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
@@ -699,6 +696,10 @@ internal class TrieNode<K, V>(
699
696
}
700
697
}
701
698
699
+ if (isCollision()) {
700
+ return mutableCollisionRemove(keyHash, key, value, mutator)
701
+ }
702
+
702
703
// key is absent
703
704
return this
704
705
}
0 commit comments