@@ -72,6 +72,37 @@ extends AbstractMap[A, B]
72
72
else Some (e.value)
73
73
}
74
74
75
+ override def getOrElseUpdate (key : A , defaultValue : => B ): B = {
76
+ val i = index(elemHashCode(key))
77
+ val entry = findEntry(key, i)
78
+ if (entry != null ) entry.value
79
+ else addEntry(createNewEntry(key, defaultValue), i)
80
+ }
81
+
82
+ /* inlined HashTable.findEntry0 to preserve its visibility */
83
+ private [this ] def findEntry (key : A , h : Int ): Entry = {
84
+ var e = table(h).asInstanceOf [Entry ]
85
+ while (notFound(key, e))
86
+ e = e.next
87
+ e
88
+ }
89
+ private [this ] def notFound (key : A , e : Entry ): Boolean = (e != null ) && ! elemEquals(e.key, key)
90
+
91
+ /* inlined HashTable.addEntry0 to preserve its visibility */
92
+ private [this ] def addEntry (e : Entry , h : Int ): B = {
93
+ if (tableSize >= threshold) addEntry(e)
94
+ else addEntry0(e, h)
95
+ e.value
96
+ }
97
+
98
+ /* extracted to make addEntry inlinable */
99
+ private [this ] def addEntry0 (e : Entry , h : Int ) {
100
+ e.next = table(h).asInstanceOf [Entry ]
101
+ table(h) = e
102
+ tableSize += 1
103
+ nnSizeMapAdd(h)
104
+ }
105
+
75
106
override def put (key : A , value : B ): Option [B ] = {
76
107
val e = findOrAddEntry(key, value)
77
108
if (e eq null ) None
0 commit comments