Skip to content

Commit 6b21347

Browse files
authored
Merge pull request scala/scala#8986 from mkeskells/2.12.x_smallMap++
Map ++ without CBF should use the same optimised path as ++ with CBF
2 parents 4ce351c + 08d8f8a commit 6b21347

File tree

1 file changed

+63
-1
lines changed
  • library/src/scala/collection/immutable

1 file changed

+63
-1
lines changed

library/src/scala/collection/immutable/Map.scala

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ object Map extends ImmutableMapFactory[Map] {
117117
if (isMapCBF(bf))
118118
that match {
119119
case hm: HashMap[a, b] if hm.size > 4 => hm.asInstanceOf[That]
120-
case EmptyMap => this.asInstanceOf[That]
120+
case m: AnyRef if m eq EmptyMap => this.asInstanceOf[That]
121121
case m: Map1[_, _] => m.asInstanceOf[That]
122122
case m: Map2[_, _] => m.asInstanceOf[That]
123123
case m: Map3[_, _] => m.asInstanceOf[That]
@@ -172,6 +172,20 @@ object Map extends ImmutableMapFactory[Map] {
172172
if (key == key1) new Map1(key1, value)
173173
else new Map2(key1, value1, key, value)
174174
def + [V1 >: V](kv: (K, V1)): Map[K, V1] = updated(kv._1, kv._2)
175+
override def ++[V1 >: V](xs: GenTraversableOnce[(K, V1)]): Map[K, V1] = ++[(K, V1), Map[K, V1]](xs)(Map.canBuildFrom[K, V1])
176+
override def ++[B >: (K, V), That](that: GenTraversableOnce[B])(implicit bf: CanBuildFrom[Map[K, V], B, That]): That = {
177+
if (isMapCBF(bf)) that match {
178+
case m: AnyRef if m eq EmptyMap => this.asInstanceOf[That]
179+
case m: Map1[K, V] => m.addTo(this).asInstanceOf[That]
180+
case m: Map2[K, V] => m.addTo(this).asInstanceOf[That]
181+
case m: Map3[K, V] => m.addTo(this).asInstanceOf[That]
182+
case m: Map4[K, V] => m.addTo(this).asInstanceOf[That]
183+
case _ => super.++(that)(bf)
184+
} else super.++(that)(bf)
185+
}
186+
private[Map] def addTo[V1 >: V](m : Map[K,V1]): Map[K, V1] = {
187+
m.updated(key1, value1)
188+
}
175189
def - (key: K): Map[K, V] =
176190
if (key == key1) Map.empty else this
177191
override def foreach[U](f: ((K, V)) => U): Unit = {
@@ -235,6 +249,21 @@ object Map extends ImmutableMapFactory[Map] {
235249
else if (key == key2) new Map2(key1, value1, key2, value)
236250
else new Map3(key1, value1, key2, value2, key, value)
237251
def + [V1 >: V](kv: (K, V1)): Map[K, V1] = updated(kv._1, kv._2)
252+
override def ++[V1 >: V](xs: GenTraversableOnce[(K, V1)]): Map[K, V1] = ++[(K, V1), Map[K, V1]](xs)(Map.canBuildFrom[K, V1])
253+
override def ++[B >: (K, V), That](that: GenTraversableOnce[B])(implicit bf: CanBuildFrom[Map[K, V], B, That]): That = {
254+
if (isMapCBF(bf)) that match {
255+
case m: AnyRef if m eq EmptyMap => this.asInstanceOf[That]
256+
case m: Map1[K, V] => m.addTo(this).asInstanceOf[That]
257+
case m: Map2[K, V] => m.addTo(this).asInstanceOf[That]
258+
case m: Map3[K, V] => m.addTo(this).asInstanceOf[That]
259+
case m: Map4[K, V] => m.addTo(this).asInstanceOf[That]
260+
case _ => super.++(that)(bf)
261+
} else super.++(that)(bf)
262+
}
263+
private[Map] def addTo[V1 >: V](m : Map[K,V1]): Map[K, V1] = {
264+
m.updated(key1, value1).
265+
updated(key2, value2)
266+
}
238267
def - (key: K): Map[K, V] =
239268
if (key == key1) new Map1(key2, value2)
240269
else if (key == key2) new Map1(key1, value1)
@@ -321,6 +350,22 @@ object Map extends ImmutableMapFactory[Map] {
321350
else if (key == key3) new Map3(key1, value1, key2, value2, key3, value)
322351
else new Map4(key1, value1, key2, value2, key3, value3, key, value)
323352
def + [V1 >: V](kv: (K, V1)): Map[K, V1] = updated(kv._1, kv._2)
353+
override def ++[V1 >: V](xs: GenTraversableOnce[(K, V1)]): Map[K, V1] = ++[(K, V1), Map[K, V1]](xs)(Map.canBuildFrom[K, V1])
354+
override def ++[B >: (K, V), That](that: GenTraversableOnce[B])(implicit bf: CanBuildFrom[Map[K, V], B, That]): That = {
355+
if (isMapCBF(bf)) that match {
356+
case m: AnyRef if m eq EmptyMap => this.asInstanceOf[That]
357+
case m: Map1[K, V] => m.addTo(this).asInstanceOf[That]
358+
case m: Map2[K, V] => m.addTo(this).asInstanceOf[That]
359+
case m: Map3[K, V] => m.addTo(this).asInstanceOf[That]
360+
case m: Map4[K, V] => m.addTo(this).asInstanceOf[That]
361+
case _ => super.++(that)(bf)
362+
} else super.++(that)(bf)
363+
}
364+
private[Map] def addTo[V1 >: V](m : Map[K,V1]): Map[K, V1] = {
365+
m.updated(key1, value1).
366+
updated(key2, value2).
367+
updated(key3, value3)
368+
}
324369
def - (key: K): Map[K, V] =
325370
if (key == key1) new Map2(key2, value2, key3, value3)
326371
else if (key == key2) new Map2(key1, value1, key3, value3)
@@ -420,6 +465,23 @@ object Map extends ImmutableMapFactory[Map] {
420465
else if (key == key4) new Map4(key1, value1, key2, value2, key3, value3, key4, value)
421466
else (new HashMap).updated(key1,value1).updated(key2, value2).updated(key3, value3).updated(key4, value4).updated(key, value)
422467
def + [V1 >: V](kv: (K, V1)): Map[K, V1] = updated(kv._1, kv._2)
468+
override def ++[V1 >: V](xs: GenTraversableOnce[(K, V1)]): Map[K, V1] = ++[(K, V1), Map[K, V1]](xs)(Map.canBuildFrom[K, V1])
469+
override def ++[B >: (K, V), That](that: GenTraversableOnce[B])(implicit bf: CanBuildFrom[Map[K, V], B, That]): That = {
470+
if (isMapCBF(bf)) that match {
471+
case m: AnyRef if m eq EmptyMap => this.asInstanceOf[That]
472+
case m: Map1[K, V] => m.addTo(this).asInstanceOf[That]
473+
case m: Map2[K, V] => m.addTo(this).asInstanceOf[That]
474+
case m: Map3[K, V] => m.addTo(this).asInstanceOf[That]
475+
case m: Map4[K, V] => m.addTo(this).asInstanceOf[That]
476+
case _ => super.++(that)(bf)
477+
} else super.++(that)(bf)
478+
}
479+
private[Map] def addTo[V1 >: V](m : Map[K,V1]): Map[K, V1] = {
480+
m.updated(key1, value1).
481+
updated(key2, value2).
482+
updated(key3, value3).
483+
updated(key4, value4)
484+
}
423485
def - (key: K): Map[K, V] =
424486
if (key == key1) new Map3(key2, value2, key3, value3, key4, value4)
425487
else if (key == key2) new Map3(key1, value1, key3, value3, key4, value4)

0 commit comments

Comments
 (0)