Skip to content

Commit c1f0c2d

Browse files
authored
Merge pull request scala/scala#8672 from rorygraves/mike/2.12.x-HashMapLessTupling
remove tupling for foreach in keySet/values of immutable HashMap and TreeMap
2 parents 1dd5e33 + c88c976 commit c1f0c2d

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

library/src/mima-filters/2.12.0.forwards.excludes

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,7 @@ ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.L
5656
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.HashMap#HashMap1.foreachEntry")
5757
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.HashMap#HashMapCollision1.foreachEntry")
5858
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.util.hashing.MurmurHash3.product2Hash")
59-
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.util.hashing.MurmurHash3.emptyMapHash")
59+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.util.hashing.MurmurHash3.emptyMapHash")
60+
61+
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.HashMap$HashMapKeys")
62+
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.HashMap$HashMapValues")

library/src/scala/collection/immutable/HashMap.scala

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,21 @@ sealed class HashMap[A, +B] extends AbstractMap[A, B]
139139

140140
override def par = ParHashMap.fromTrie(this)
141141

142+
/* Override to avoid tuple allocation in foreach */
143+
private[collection] class HashMapKeys extends ImmutableDefaultKeySet {
144+
override def foreach[U](f: A => U) = foreachEntry((key, _) => f(key))
145+
override lazy val hashCode = super.hashCode()
146+
}
147+
override def keySet: immutable.Set[A] = new HashMapKeys
148+
149+
/** The implementation class of the iterable returned by `values`.
150+
*/
151+
private[collection] class HashMapValues extends DefaultValuesIterable {
152+
override def foreach[U](f: B => U) = foreachEntry((_, value) => f(value))
153+
}
154+
override def values: scala.collection.Iterable[B] = new HashMapValues
155+
156+
142157
}
143158

144159
/** $factoryInfo

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,4 +215,11 @@ final class TreeMap[A, +B] private (tree: RB.Tree[A, B])(implicit val ordering:
215215
}
216216
}
217217

218+
override def keySet: SortedSet[A] = new DefaultKeySortedSet {
219+
override def foreach[U](f: A => U): Unit = RB.foreachEntry(tree, {(key: A, _: B) => f(key)})
220+
}
221+
222+
override def values: scala.Iterable[B] = new DefaultValuesIterable {
223+
override def foreach[U](f: B => U): Unit = RB.foreachEntry(tree, {(_: A, value: B) => f(value)})
224+
}
218225
}

0 commit comments

Comments
 (0)