Skip to content

Commit 697f2aa

Browse files
authored
Merge pull request scala/scala#8952 from mkeskells/2.12.x_TreeMap_TreeSet_sameCBF
2 parents 5320f0b + 3530997 commit 697f2aa

File tree

4 files changed

+24
-10
lines changed

4 files changed

+24
-10
lines changed

library/src/scala/collection/generic/SortedMapFactory.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ abstract class SortedMapFactory[CC[A, B] <: SortedMap[A, B] with SortedMapLike[A
3333
new MapBuilder[A, B, CC[A, B]](empty(ord))
3434

3535
class SortedMapCanBuildFrom[A, B](implicit ord: Ordering[A]) extends CanBuildFrom[Coll, (A, B), CC[A, B]] {
36+
private[collection] def factory = SortedMapFactory.this
3637
private[collection] def ordering = ord
3738
def apply(from: Coll) = newBuilder[A, B](ord)
3839
def apply() = newBuilder[A, B]

library/src/scala/collection/generic/SortedSetFactory.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ abstract class SortedSetFactory[CC[A] <: SortedSet[A] with SortedSetLike[A, CC[A
3333
implicit def newCanBuildFrom[A](implicit ord : Ordering[A]) : CanBuildFrom[Coll, A, CC[A]] = new SortedSetCanBuildFrom()(ord)
3434

3535
class SortedSetCanBuildFrom[A](implicit ord: Ordering[A]) extends CanBuildFrom[Coll, A, CC[A]] {
36+
private[collection] def factory = SortedSetFactory.this
37+
private[collection] def ordering = ord
3638
def apply(from: Coll) = newBuilder[A](ord)
3739
def apply() = newBuilder[A](ord)
3840
}

library/src/scala/collection/immutable/TreeMap.scala

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -328,14 +328,22 @@ final class TreeMap[A, +B] private (tree: RB.Tree[A, B])(implicit val ordering:
328328
val (l, r) = RB.partitionEntries[A, B](tree, (k, v) => p((k, v)))
329329
(newMapOrSelf(l), newMapOrSelf(r))
330330
}
331-
332-
override def transform[W, That](f: (A, B) => W)(implicit bf: CanBuildFrom[TreeMap[A, B], (A, W), That]): That = {
331+
private def sameCBF(bf: CanBuildFrom[_,_,_]): Boolean = {
333332
bf match {
334-
case sm: TreeMap.SortedMapCanBuildFrom[A, B] if sm.ordering == ordering =>
335-
val t2 = RB.transform[A, B, W](tree, f)
336-
if (t2 eq tree) this.asInstanceOf[That]
337-
else new TreeMap(t2).asInstanceOf[That]
338-
case _ => super.transform(f)
333+
case cbf: SortedMapFactory[_]#SortedMapCanBuildFrom[_,_] => {
334+
val factory:AnyRef = cbf.factory
335+
((factory eq TreeMap) || (factory eq immutable.SortedMap) || (factory eq collection.SortedMap)) &&
336+
cbf.ordering == ordering
337+
}
338+
case w: WrappedCanBuildFrom[_,_,_] => sameCBF(w.wrapped)
339+
case _ => false
339340
}
340341
}
342+
343+
344+
override def transform[W, That](f: (A, B) => W)(implicit bf: CanBuildFrom[TreeMap[A, B], (A, W), That]): That = {
345+
if (sameCBF(bf))
346+
newMapOrSelf(RB.transform[A, B, W](tree, f)).asInstanceOf[That]
347+
else super.transform(f)
348+
}
341349
}

library/src/scala/collection/immutable/TreeSet.scala

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,13 @@ final class TreeSet[A] private[immutable] (private[immutable] val tree: RB.Tree[
205205
override def firstKey = head
206206
override def lastKey = last
207207

208-
209208
private def sameCBF(bf: CanBuildFrom[_,_,_]): Boolean = {
210209
bf match {
211-
case tsb: TreeSet.TreeSetBuilder[_] if tsb.ordering == ordering => true
210+
case cbf: SortedSetFactory[_]#SortedSetCanBuildFrom[_] => {
211+
val factory:AnyRef = cbf.factory
212+
((factory eq TreeSet) || (factory eq immutable.SortedSet) || (factory eq collection.SortedSet)) &&
213+
cbf.ordering == ordering
214+
}
212215
case w: WrappedCanBuildFrom[_,_,_] => sameCBF(w.wrapped)
213216
case _ => false
214217
}
@@ -221,7 +224,7 @@ final class TreeSet[A] private[immutable] (private[immutable] val tree: RB.Tree[
221224

222225
private[scala] def addAllImpl[B >: A, That](that: GenTraversableOnce[B])(implicit bf: CanBuildFrom[TreeSet[A], B, That]): That = {
223226
that match {
224-
case ts: TreeSet[A] if ordering == ts.ordering && sameCBF(bf) =>
227+
case ts: TreeSet[A] if sameCBF(bf) =>
225228
newSetOrSelf(RB.union(tree, ts.tree)).asInstanceOf[That]
226229
case _ =>
227230
val b = bf(repr)

0 commit comments

Comments
 (0)