@@ -311,9 +311,9 @@ private[collection] object RedBlackTree {
311
311
if (tree.right ne null ) _foreachEntry(tree.right.nn, f)
312
312
}
313
313
314
- def iterator [A : Ordering , B ](tree : Tree [A , B ], start : Option [A ] = None ): Iterator [(A , B )] = new EntriesIterator (tree, start)
315
- def keysIterator [A : Ordering ](tree : Tree [A , _], start : Option [A ] = None ): Iterator [A ] = new KeysIterator (tree, start)
316
- def valuesIterator [A : Ordering , B ](tree : Tree [A , B ], start : Option [A ] = None ): Iterator [B ] = new ValuesIterator (tree, start)
314
+ def iterator [A : Ordering , B ](tree : Tree [A , B ] | Null , start : Option [A ] = None ): Iterator [(A , B )] = new EntriesIterator (tree, start)
315
+ def keysIterator [A : Ordering ](tree : Tree [A , _] | Null , start : Option [A ] = None ): Iterator [A ] = new KeysIterator (tree, start)
316
+ def valuesIterator [A : Ordering , B ](tree : Tree [A , B ] | Null , start : Option [A ] = None ): Iterator [B ] = new ValuesIterator (tree, start)
317
317
318
318
@ tailrec
319
319
def nth [A , B ](tree : Tree [A , B ], n : Int ): Tree [A , B ] = {
@@ -927,16 +927,16 @@ private[collection] object RedBlackTree {
927
927
equal && (this .lookahead eq null ) && (that.lookahead eq null )
928
928
}
929
929
}
930
- private [this ] class EntriesIterator [A : Ordering , B ](tree : Tree [A , B ], focus : Option [A ]) extends TreeIterator [A , B , (A , B )](tree, focus) {
931
- override def nextResult (tree : Tree [A , B ]) = (tree.key, tree.value)
930
+ private [this ] class EntriesIterator [A : Ordering , B ](tree : Tree [A , B ] | Null , focus : Option [A ]) extends TreeIterator [A , B , (A , B )](tree, focus) {
931
+ override def nextResult (tree : Tree [A , B ]) = (tree.nn. key, tree.nn .value)
932
932
}
933
933
934
- private [this ] class KeysIterator [A : Ordering , B ](tree : Tree [A , B ], focus : Option [A ]) extends TreeIterator [A , B , A ](tree, focus) {
935
- override def nextResult (tree : Tree [A , B ]) = tree.key
934
+ private [this ] class KeysIterator [A : Ordering , B ](tree : Tree [A , B ] | Null , focus : Option [A ]) extends TreeIterator [A , B , A ](tree, focus) {
935
+ override def nextResult (tree : Tree [A , B ]) = tree.nn. key
936
936
}
937
937
938
- private [this ] class ValuesIterator [A : Ordering , B ](tree : Tree [A , B ], focus : Option [A ]) extends TreeIterator [A , B , B ](tree, focus) {
939
- override def nextResult (tree : Tree [A , B ]) = tree.value
938
+ private [this ] class ValuesIterator [A : Ordering , B ](tree : Tree [A , B ] | Null , focus : Option [A ]) extends TreeIterator [A , B , B ](tree, focus) {
939
+ override def nextResult (tree : Tree [A , B ]) = tree.nn. value
940
940
}
941
941
942
942
/** Build a Tree suitable for a TreeSet from an ordered sequence of keys */
@@ -1139,33 +1139,35 @@ private[collection] object RedBlackTree {
1139
1139
else 2 * bh- 1
1140
1140
}
1141
1141
1142
- private [this ] def joinRight [A , B ](tl : Tree [A , B ], k : A , v : B , tr : Tree [A , B ], bhtl : Int , rtr : Int ): Tree [A , B ] = {
1142
+ private [this ] def joinRight [A , B ](tl : Tree [A , B ] | Null , k : A , v : B , tr : Tree [A , B ] | Null , bhtl : Int , rtr : Int ): Tree [A , B ] = {
1143
1143
val rtl = rank(tl, bhtl)
1144
1144
if (rtl == (rtr/ 2 )* 2 ) RedTree (k, v, tl, tr)
1145
1145
else {
1146
+ val tlnn = tl.nn
1146
1147
val tlBlack = isBlackTree(tl)
1147
1148
val bhtlr = if (tlBlack) bhtl- 1 else bhtl
1148
- val ttr = joinRight(tl .right.nn , k, v, tr, bhtlr, rtr)
1149
+ val ttr = joinRight(tlnn .right, k, v, tr, bhtlr, rtr)
1149
1150
if (tlBlack && isRedTree(ttr) && isRedTree(ttr.right))
1150
1151
RedTree (ttr.key, ttr.value,
1151
- BlackTree (tl .key, tl .value, tl .left, ttr.left),
1152
+ BlackTree (tlnn .key, tlnn .value, tlnn .left, ttr.left),
1152
1153
ttr.right.nn.black)
1153
- else mkTree(tlBlack, tl .key, tl .value, tl .left, ttr)
1154
+ else mkTree(tlBlack, tlnn .key, tlnn .value, tlnn .left, ttr)
1154
1155
}
1155
1156
}
1156
1157
1157
- private [this ] def joinLeft [A , B ](tl : Tree [A , B ], k : A , v : B , tr : Tree [A , B ], rtl : Int , bhtr : Int ): Tree [A , B ] = {
1158
+ private [this ] def joinLeft [A , B ](tl : Tree [A , B ] | Null , k : A , v : B , tr : Tree [A , B ] | Null , rtl : Int , bhtr : Int ): Tree [A , B ] = {
1158
1159
val rtr = rank(tr, bhtr)
1159
1160
if (rtr == (rtl/ 2 )* 2 ) RedTree (k, v, tl, tr)
1160
1161
else {
1162
+ val trnn = tr.nn
1161
1163
val trBlack = isBlackTree(tr)
1162
1164
val bhtrl = if (trBlack) bhtr- 1 else bhtr
1163
- val ttl = joinLeft(tl, k, v, tr .left.nn , rtl, bhtrl)
1165
+ val ttl = joinLeft(tl, k, v, trnn .left, rtl, bhtrl)
1164
1166
if (trBlack && isRedTree(ttl) && isRedTree(ttl.left))
1165
1167
RedTree (ttl.key, ttl.value,
1166
1168
ttl.left.nn.black,
1167
- BlackTree (tr .key, tr .value, ttl.right, tr .right))
1168
- else mkTree(trBlack, tr .key, tr .value, ttl, tr .right)
1169
+ BlackTree (trnn .key, trnn .value, ttl.right, trnn .right))
1170
+ else mkTree(trBlack, trnn .key, trnn .value, ttl, trnn .right)
1169
1171
}
1170
1172
}
1171
1173
@@ -1175,7 +1177,7 @@ private[collection] object RedBlackTree {
1175
1177
val bhtl = h(tl, 0 )
1176
1178
val bhtr = h(tr, 0 )
1177
1179
if (bhtl > bhtr) {
1178
- val tt = joinRight(tl.nn, k, v, tr.nn, bhtl, rank(tr, bhtr))
1180
+ val tt = joinRight(tl.nn, k, v, tr.nn, bhtl, rank(tr, bhtr)) // todo: nullable
1179
1181
if (isRedTree(tt) && isRedTree(tt.right)) tt.black
1180
1182
else tt
1181
1183
} else if (bhtr > bhtl) {
0 commit comments