@@ -311,9 +311,9 @@ private[collection] object RedBlackTree {
311311 if (tree.right ne null ) _foreachEntry(tree.right.nn, f)
312312 }
313313
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)
317317
318318 @ tailrec
319319 def nth [A , B ](tree : Tree [A , B ], n : Int ): Tree [A , B ] = {
@@ -927,16 +927,16 @@ private[collection] object RedBlackTree {
927927 equal && (this .lookahead eq null ) && (that.lookahead eq null )
928928 }
929929 }
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)
932932 }
933933
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
936936 }
937937
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
940940 }
941941
942942 /** Build a Tree suitable for a TreeSet from an ordered sequence of keys */
@@ -1139,33 +1139,35 @@ private[collection] object RedBlackTree {
11391139 else 2 * bh- 1
11401140 }
11411141
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 ] = {
11431143 val rtl = rank(tl, bhtl)
11441144 if (rtl == (rtr/ 2 )* 2 ) RedTree (k, v, tl, tr)
11451145 else {
1146+ val tlnn = tl.nn
11461147 val tlBlack = isBlackTree(tl)
11471148 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)
11491150 if (tlBlack && isRedTree(ttr) && isRedTree(ttr.right))
11501151 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),
11521153 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)
11541155 }
11551156 }
11561157
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 ] = {
11581159 val rtr = rank(tr, bhtr)
11591160 if (rtr == (rtl/ 2 )* 2 ) RedTree (k, v, tl, tr)
11601161 else {
1162+ val trnn = tr.nn
11611163 val trBlack = isBlackTree(tr)
11621164 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)
11641166 if (trBlack && isRedTree(ttl) && isRedTree(ttl.left))
11651167 RedTree (ttl.key, ttl.value,
11661168 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)
11691171 }
11701172 }
11711173
@@ -1175,7 +1177,7 @@ private[collection] object RedBlackTree {
11751177 val bhtl = h(tl, 0 )
11761178 val bhtr = h(tr, 0 )
11771179 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
11791181 if (isRedTree(tt) && isRedTree(tt.right)) tt.black
11801182 else tt
11811183 } else if (bhtr > bhtl) {
0 commit comments