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