@@ -698,12 +698,12 @@ private final class BitmapIndexedMapNode[K, +V](
698
698
if ((dataMap & bitpos) != 0 ) {
699
699
val index = indexFrom(dataMap, mask, bitpos)
700
700
val payload = getPayload(index)
701
- if (key == payload._1) payload else throw new NoSuchElementException
701
+ if (key == payload._1) payload else Iterator .empty.next()
702
702
} else if ((nodeMap & bitpos) != 0 ) {
703
703
val index = indexFrom(nodeMap, mask, bitpos)
704
704
getNode(index).getTuple(key, originalHash, hash, shift + BitPartitionSize )
705
705
} else {
706
- throw new NoSuchElementException
706
+ Iterator .empty.next()
707
707
}
708
708
}
709
709
@@ -1872,7 +1872,7 @@ private final class HashCollisionMapNode[K, +V ](
1872
1872
1873
1873
def size : Int = content.length
1874
1874
1875
- def apply (key : K , originalHash : Int , hash : Int , shift : Int ): V = get(key, originalHash, hash, shift).getOrElse(throw new NoSuchElementException )
1875
+ def apply (key : K , originalHash : Int , hash : Int , shift : Int ): V = get(key, originalHash, hash, shift).getOrElse(Iterator .empty.next() )
1876
1876
1877
1877
def get (key : K , originalHash : Int , hash : Int , shift : Int ): Option [V ] =
1878
1878
if (this .hash == hash) {
@@ -1882,7 +1882,7 @@ private final class HashCollisionMapNode[K, +V ](
1882
1882
1883
1883
override def getTuple (key : K , originalHash : Int , hash : Int , shift : Int ): (K , V ) = {
1884
1884
val index = indexOf(key)
1885
- if (index >= 0 ) content(index) else throw new NoSuchElementException
1885
+ if (index >= 0 ) content(index) else Iterator .empty.next()
1886
1886
}
1887
1887
1888
1888
def getOrElse [V1 >: V ](key : K , originalHash : Int , hash : Int , shift : Int , f : => V1 ): V1 = {
@@ -2095,11 +2095,10 @@ private final class HashCollisionMapNode[K, +V ](
2095
2095
}
2096
2096
2097
2097
private final class MapKeyIterator [K , V ](rootNode : MapNode [K , V ])
2098
- extends ChampBaseIterator [MapNode [K , V ]](rootNode) with Iterator [ K ] {
2098
+ extends ChampBaseIterator [K , MapNode [K , V ]](rootNode) {
2099
2099
2100
2100
def next () = {
2101
- if (! hasNext)
2102
- throw new NoSuchElementException
2101
+ if (! hasNext) Iterator .empty.next()
2103
2102
2104
2103
val key = currentValueNode.getKey(currentValueCursor)
2105
2104
currentValueCursor += 1
@@ -2110,11 +2109,10 @@ private final class MapKeyIterator[K, V](rootNode: MapNode[K, V])
2110
2109
}
2111
2110
2112
2111
private final class MapValueIterator [K , V ](rootNode : MapNode [K , V ])
2113
- extends ChampBaseIterator [MapNode [K , V ]](rootNode) with Iterator [ V ] {
2112
+ extends ChampBaseIterator [V , MapNode [K , V ]](rootNode) {
2114
2113
2115
2114
def next () = {
2116
- if (! hasNext)
2117
- throw new NoSuchElementException
2115
+ if (! hasNext) Iterator .empty.next()
2118
2116
2119
2117
val value = currentValueNode.getValue(currentValueCursor)
2120
2118
currentValueCursor += 1
@@ -2124,11 +2122,10 @@ private final class MapValueIterator[K, V](rootNode: MapNode[K, V])
2124
2122
}
2125
2123
2126
2124
private final class MapKeyValueTupleIterator [K , V ](rootNode : MapNode [K , V ])
2127
- extends ChampBaseIterator [MapNode [ K , V ]](rootNode) with Iterator [( K , V )] {
2125
+ extends ChampBaseIterator [( K , V ), MapNode [ K , V ]](rootNode) {
2128
2126
2129
2127
def next () = {
2130
- if (! hasNext)
2131
- throw new NoSuchElementException
2128
+ if (! hasNext) Iterator .empty.next()
2132
2129
2133
2130
val payload = currentValueNode.getPayload(currentValueCursor)
2134
2131
currentValueCursor += 1
@@ -2139,11 +2136,10 @@ private final class MapKeyValueTupleIterator[K, V](rootNode: MapNode[K, V])
2139
2136
}
2140
2137
2141
2138
private final class MapKeyValueTupleReverseIterator [K , V ](rootNode : MapNode [K , V ])
2142
- extends ChampBaseReverseIterator [MapNode [ K , V ]](rootNode) with Iterator [( K , V )] {
2139
+ extends ChampBaseReverseIterator [( K , V ), MapNode [ K , V ]](rootNode) {
2143
2140
2144
2141
def next () = {
2145
- if (! hasNext)
2146
- throw new NoSuchElementException
2142
+ if (! hasNext) Iterator .empty.next()
2147
2143
2148
2144
val payload = currentValueNode.getPayload(currentValueCursor)
2149
2145
currentValueCursor -= 1
@@ -2153,13 +2149,12 @@ private final class MapKeyValueTupleReverseIterator[K, V](rootNode: MapNode[K, V
2153
2149
}
2154
2150
2155
2151
private final class MapKeyValueTupleHashIterator [K , V ](rootNode : MapNode [K , V ])
2156
- extends ChampBaseReverseIterator [MapNode [K , V ]](rootNode) with Iterator [ Any ] {
2152
+ extends ChampBaseReverseIterator [Any , MapNode [K , V ]](rootNode) {
2157
2153
private [this ] var hash = 0
2158
2154
private [this ] var value : V = _
2159
2155
override def hashCode (): Int = MurmurHash3 .tuple2Hash(hash, value.## , MurmurHash3 .productSeed)
2160
2156
def next (): MapKeyValueTupleHashIterator [K , V ] = {
2161
- if (! hasNext)
2162
- throw new NoSuchElementException
2157
+ if (! hasNext) Iterator .empty.next()
2163
2158
2164
2159
hash = currentValueNode.getHash(currentValueCursor)
2165
2160
value = currentValueNode.getValue(currentValueCursor)
@@ -2169,7 +2164,7 @@ private final class MapKeyValueTupleHashIterator[K, V](rootNode: MapNode[K, V])
2169
2164
}
2170
2165
2171
2166
/** Used in HashMap[K, V]#removeAll(HashSet[K]) */
2172
- private final class MapNodeRemoveAllSetNodeIterator [K ](rootSetNode : SetNode [K ]) extends ChampBaseIterator (rootSetNode) {
2167
+ private final class MapNodeRemoveAllSetNodeIterator [K ](rootSetNode : SetNode [K ]) extends ChampBaseIterator [ K , SetNode [ K ]] (rootSetNode) {
2173
2168
/** Returns the result of immutably removing all keys in `rootSetNode` from `rootMapNode` */
2174
2169
def removeAll [V ](rootMapNode : BitmapIndexedMapNode [K , V ]): BitmapIndexedMapNode [K , V ] = {
2175
2170
var curr = rootMapNode
@@ -2185,6 +2180,8 @@ private final class MapNodeRemoveAllSetNodeIterator[K](rootSetNode: SetNode[K])
2185
2180
}
2186
2181
curr
2187
2182
}
2183
+
2184
+ override def next () = Iterator .empty.next()
2188
2185
}
2189
2186
2190
2187
/**
@@ -2370,7 +2367,7 @@ private[immutable] final class HashMapBuilder[K, V] extends ReusableBuilder[(K,
2370
2367
ensureUnaliased()
2371
2368
xs match {
2372
2369
case hm : HashMap [K , V ] =>
2373
- new ChampBaseIterator [MapNode [K , V ]](hm.rootNode) {
2370
+ new ChampBaseIterator [( K , V ), MapNode [K , V ]](hm.rootNode) {
2374
2371
while (hasNext) {
2375
2372
val originalHash = currentValueNode.getHash(currentValueCursor)
2376
2373
update(
@@ -2383,6 +2380,8 @@ private[immutable] final class HashMapBuilder[K, V] extends ReusableBuilder[(K,
2383
2380
)
2384
2381
currentValueCursor += 1
2385
2382
}
2383
+
2384
+ override def next () = Iterator .empty.next()
2386
2385
}
2387
2386
case hm : collection.mutable.HashMap [K , V ] =>
2388
2387
val iter = hm.nodeIterator
0 commit comments