@@ -1021,41 +1021,48 @@ private[collection] object NewRedBlackTree {
1021
1021
blacken(fk(t))
1022
1022
}
1023
1023
1024
- def partitionEntries [A , B ](t : Tree [A , B ], p : (A , B ) => Boolean ): (Tree [A , B ], Tree [A , B ]) = if (t eq null ) (null , null ) else {
1025
- var tmpk, tmpd = null : Tree [A , B ] // shared vars to avoid returning tuples from fk
1026
- def fk (t : Tree [A , B ]): Unit = {
1027
- val k = t.key
1028
- val v = t.value
1029
- val l = t.left
1030
- val r = t.right
1031
- var l2k, l2d, r2k, r2d = null : Tree [A , B ]
1032
- if (l ne null ) {
1033
- fk(l)
1034
- l2k = tmpk
1035
- l2d = tmpd
1036
- }
1037
- val keep = p(k, v)
1038
- if (r ne null ) {
1039
- fk(r)
1040
- r2k = tmpk
1041
- r2d = tmpd
1024
+ private [this ] val null2 = (null , null )
1025
+
1026
+ def partitionEntries [A , B ](t : Tree [A , B ], p : (A , B ) => Boolean ): (Tree [A , B ], Tree [A , B ]) = {
1027
+ if (t eq null ) null2
1028
+ else {
1029
+ object partitioner {
1030
+ var tmpk, tmpd = null : Tree [A , B ] // shared vars to avoid returning tuples from fk
1031
+ def fk (t : Tree [A , B ]): Unit = {
1032
+ val k = t.key
1033
+ val v = t.value
1034
+ val l = t.left
1035
+ val r = t.right
1036
+ var l2k, l2d, r2k, r2d = null : Tree [A , B ]
1037
+ if (l ne null ) {
1038
+ fk(l)
1039
+ l2k = tmpk
1040
+ l2d = tmpd
1041
+ }
1042
+ val keep = p(k, v)
1043
+ if (r ne null ) {
1044
+ fk(r)
1045
+ r2k = tmpk
1046
+ r2d = tmpd
1047
+ }
1048
+ val jk =
1049
+ if (! keep) join2(l2k, r2k)
1050
+ else if ((l2k eq l) && (r2k eq r)) t
1051
+ else join(l2k, k, v, r2k)
1052
+ val jd =
1053
+ if (keep) join2(l2d, r2d)
1054
+ else if ((l2d eq l) && (r2d eq r)) t
1055
+ else join(l2d, k, v, r2d)
1056
+ tmpk = jk
1057
+ tmpd = jd
1058
+ }
1042
1059
}
1043
- val jk =
1044
- if (! keep) join2(l2k, r2k)
1045
- else if ((l2k eq l) && (r2k eq r)) t
1046
- else join(l2k, k, v, r2k)
1047
- val jd =
1048
- if (keep) join2(l2d, r2d)
1049
- else if ((l2d eq l) && (r2d eq r)) t
1050
- else join(l2d, k, v, r2d)
1051
- tmpk = jk
1052
- tmpd = jd
1060
+
1061
+ partitioner.fk(t)
1062
+ (blacken(partitioner.tmpk), blacken(partitioner.tmpd))
1053
1063
}
1054
- fk(t)
1055
- (blacken(tmpk), blacken(tmpd))
1056
1064
}
1057
1065
1058
-
1059
1066
// Based on Stefan Kahrs' Haskell version of Okasaki's Red&Black Trees
1060
1067
// Constructing Red-Black Trees, Ralf Hinze: [[http://www.cs.ox.ac.uk/ralf.hinze/publications/WAAAPL99b.ps.gz]]
1061
1068
// Red-Black Trees in a Functional Setting, Chris Okasaki: [[https://wiki.rice.edu/confluence/download/attachments/2761212/Okasaki-Red-Black.pdf]] */
@@ -1253,4 +1260,4 @@ private[collection] object NewRedBlackTree {
1253
1260
val tr = _difference(r1, t2.right)
1254
1261
join2(tl, tr)
1255
1262
}
1256
- }
1263
+ }
0 commit comments