@@ -19,17 +19,19 @@ import scala.util.hashing.MurmurHash3
19
19
*
20
20
* @author Michael J. Steindorfer
21
21
* @since 2.13
22
- * @define Coll `immutable.ChampHashMap `
22
+ * @define Coll `immutable.HashMap `
23
23
* @define coll immutable champ hash map
24
24
*/
25
25
26
- final class ChampHashMap [K , + V ] private [immutable] (private val rootNode : MapNode [K , V ], private val cachedJavaKeySetHashCode : Int )
26
+ final class HashMap [K , + V ] private [immutable] (private val rootNode : MapNode [K , V ], private val cachedJavaKeySetHashCode : Int )
27
27
extends AbstractMap [K , V ]
28
- with MapOps [K , V , ChampHashMap , ChampHashMap [K , V ]]
29
- with StrictOptimizedIterableOps [(K , V ), Iterable , ChampHashMap [K , V ]]
30
- with StrictOptimizedMapOps [K , V , ChampHashMap , ChampHashMap [K , V ]] {
28
+ with MapOps [K , V , HashMap , HashMap [K , V ]]
29
+ with StrictOptimizedIterableOps [(K , V ), Iterable , HashMap [K , V ]]
30
+ with StrictOptimizedMapOps [K , V , HashMap , HashMap [K , V ]] {
31
31
32
- override def mapFactory : MapFactory [ChampHashMap ] = ChampHashMap
32
+ def this () = this (MapNode .empty, 0 )
33
+
34
+ override def mapFactory : MapFactory [HashMap ] = HashMap
33
35
34
36
override def knownSize : Int = rootNode.size
35
37
@@ -74,7 +76,7 @@ final class ChampHashMap[K, +V] private[immutable] (private val rootNode: MapNod
74
76
rootNode.getOrElse(key, keyUnimprovedHash, keyHash, 0 , default)
75
77
}
76
78
77
- def updated [V1 >: V ](key : K , value : V1 ): ChampHashMap [K , V1 ] = {
79
+ def updated [V1 >: V ](key : K , value : V1 ): HashMap [K , V1 ] = {
78
80
val keyUnimprovedHash = key.##
79
81
val keyHash = improve(keyUnimprovedHash)
80
82
@@ -83,30 +85,30 @@ final class ChampHashMap[K, +V] private[immutable] (private val rootNode: MapNod
83
85
if (newRootNode ne rootNode) {
84
86
val replaced = rootNode.size == newRootNode.size
85
87
val newCachedJavaKeySetHashCode = cachedJavaKeySetHashCode + (if (replaced) 0 else keyHash)
86
- ChampHashMap (newRootNode.get, newCachedJavaKeySetHashCode)
88
+ HashMap (newRootNode.get, newCachedJavaKeySetHashCode)
87
89
} else
88
90
this
89
91
}
90
92
91
- def remove (key : K ): ChampHashMap [K , V ] = {
93
+ def remove (key : K ): HashMap [K , V ] = {
92
94
val keyUnimprovedHash = key.##
93
95
val keyHash = improve(keyUnimprovedHash)
94
96
95
97
val newRootNode = rootNode.removed(key, keyUnimprovedHash, keyHash, 0 )
96
98
97
99
if (newRootNode ne rootNode)
98
- ChampHashMap (newRootNode, cachedJavaKeySetHashCode - keyHash)
100
+ HashMap (newRootNode, cachedJavaKeySetHashCode - keyHash)
99
101
else this
100
102
}
101
103
102
- override def concat [V1 >: V ](that : scala.IterableOnce [(K , V1 )]): ChampHashMap [K , V1 ] = {
103
- // TODO PERF We could avoid recomputing entry hash's when `that` is another `ChampHashMap `
104
+ override def concat [V1 >: V ](that : scala.IterableOnce [(K , V1 )]): HashMap [K , V1 ] = {
105
+ // TODO PERF We could avoid recomputing entry hash's when `that` is another `HashMap `
104
106
super .concat(that)
105
107
}
106
108
107
- override def tail : ChampHashMap [K , V ] = this - head._1
109
+ override def tail : HashMap [K , V ] = this - head._1
108
110
109
- override def init : ChampHashMap [K , V ] = this - last._1
111
+ override def init : HashMap [K , V ] = this - last._1
110
112
111
113
override def head : (K , V ) = iterator.next()
112
114
@@ -116,7 +118,7 @@ final class ChampHashMap[K, +V] private[immutable] (private val rootNode: MapNod
116
118
117
119
override def equals (that : Any ): Boolean =
118
120
that match {
119
- case map : ChampHashMap [K , V ] =>
121
+ case map : HashMap [K , V ] =>
120
122
(this eq map) ||
121
123
(this .size == map.size) &&
122
124
(this .cachedJavaKeySetHashCode == map.cachedJavaKeySetHashCode) &&
@@ -130,7 +132,21 @@ final class ChampHashMap[K, +V] private[immutable] (private val rootNode: MapNod
130
132
// assert(hash == super.hashCode())
131
133
hash
132
134
}
133
- override protected [this ] def className = " ChampHashMap"
135
+
136
+ override protected [this ] def className = " HashMap"
137
+
138
+ private type MergeFunction [A1 , B1 ] = ((A1 , B1 ), (A1 , B1 )) => (A1 , B1 )
139
+
140
+ // TODO optimize (https://github.com/scala/bug/issues/11077)
141
+ def merged [V1 >: V ](that : HashMap [K , V1 ])(mergef : MergeFunction [K , V1 ]): HashMap [K , V1 ] = {
142
+ val thisKeys = this .keySet
143
+ if (mergef eq null )
144
+ that.removeAll(thisKeys) ++ this
145
+ else {
146
+ val thatKeys = that.keySet
147
+ that.removeAll(thisKeys) ++ this .removeAll(thatKeys) ++ thisKeys.intersect(thatKeys).map { case k => mergef((k, this (k)), (k, that(k))) }
148
+ }
149
+ }
134
150
}
135
151
136
152
private [immutable] object MapNode {
@@ -726,28 +742,28 @@ private final class MapKeyValueTupleHashIterator[K, V](rootNode: MapNode[K, V])
726
742
/**
727
743
* $factoryInfo
728
744
*
729
- * @define Coll `immutable.ChampHashMap `
745
+ * @define Coll `immutable.HashMap `
730
746
* @define coll immutable champ hash map
731
747
*/
732
748
@ SerialVersionUID (3L )
733
- object ChampHashMap extends MapFactory [ChampHashMap ] {
749
+ object HashMap extends MapFactory [HashMap ] {
734
750
735
- private [ChampHashMap ] def apply [K , V ](rootNode : MapNode [K , V ], cachedJavaHashCode : Int ) =
736
- new ChampHashMap [K , V ](rootNode, cachedJavaHashCode)
751
+ private [HashMap ] def apply [K , V ](rootNode : MapNode [K , V ], cachedJavaHashCode : Int ) =
752
+ new HashMap [K , V ](rootNode, cachedJavaHashCode)
737
753
738
- private final val EmptyMap = new ChampHashMap (MapNode .empty, 0 )
754
+ private final val EmptyMap = new HashMap (MapNode .empty, 0 )
739
755
740
- def empty [K , V ]: ChampHashMap [K , V ] =
741
- EmptyMap .asInstanceOf [ChampHashMap [K , V ]]
756
+ def empty [K , V ]: HashMap [K , V ] =
757
+ EmptyMap .asInstanceOf [HashMap [K , V ]]
742
758
743
- def from [K , V ](source : collection.IterableOnce [(K , V )]): ChampHashMap [K , V ] =
759
+ def from [K , V ](source : collection.IterableOnce [(K , V )]): HashMap [K , V ] =
744
760
source match {
745
- case hs : ChampHashMap [K , V ] => hs
761
+ case hs : HashMap [K , V ] => hs
746
762
case _ => (newBuilder[K , V ] ++= source).result()
747
763
}
748
764
749
- def newBuilder [K , V ]: Builder [(K , V ), ChampHashMap [K , V ]] =
750
- new ImmutableBuilder [(K , V ), ChampHashMap [K , V ]](empty) {
765
+ def newBuilder [K , V ]: Builder [(K , V ), HashMap [K , V ]] =
766
+ new ImmutableBuilder [(K , V ), HashMap [K , V ]](empty) {
751
767
def addOne (element : (K , V )): this .type = {
752
768
elems = elems + element
753
769
this
0 commit comments