@@ -42,9 +42,16 @@ class SparseIntArray:
42
42
result
43
43
}
44
44
45
+ /** All defined indices in an iterator */
46
+ def keysIterator : Iterator [Int ] = root.keysIterator(0 )
47
+
48
+ /** Perform operation for each key/value pair */
45
49
def foreachBinding (op : (Int , Value ) => Unit ): Unit =
46
50
root.foreachBinding(op, 0 )
47
51
52
+ /** Transform each defined value with transformation `op`.
53
+ * The transformation gets the element index and value as parameters.
54
+ */
48
55
def transform (op : (Int , Value ) => Value ): Unit =
49
56
root.transform(op, 0 )
50
57
@@ -82,6 +89,7 @@ object SparseIntArray:
82
89
def update (index : Int , value : Value ): Boolean
83
90
def remove (index : Int ): Boolean
84
91
def isEmpty : Boolean
92
+ def keysIterator (offset : Int ): Iterator [Int ]
85
93
def foreachBinding (op : (Int , Value ) => Unit , offset : Int ): Unit
86
94
def transform (op : (Int , Value ) => Value , offset : Int ): Unit
87
95
def nodeCount : Int
@@ -111,6 +119,17 @@ object SparseIntArray:
111
119
112
120
def isEmpty = present == 0
113
121
122
+ private def skipUndefined (i : Int ): Int =
123
+ if i < NodeSize && ! contains(i) then skipUndefined(i + 1 ) else i
124
+
125
+ def keysIterator (offset : Int ) = new Iterator [Int ]:
126
+ private var curIdx = skipUndefined(0 )
127
+ def hasNext = curIdx < NodeSize
128
+ def next (): Int =
129
+ val result = curIdx + offset
130
+ curIdx = skipUndefined(curIdx + 1 )
131
+ result
132
+
114
133
def foreachBinding (op : (Int , Value ) => Unit , offset : Int ): Unit =
115
134
var i = 0
116
135
while i < NodeSize do
@@ -167,6 +186,20 @@ object SparseIntArray:
167
186
168
187
def isEmpty = empty
169
188
189
+ private def skipUndefined (i : Int ): Int =
190
+ if i < NodeSize && elems(i) == null then skipUndefined(i + 1 ) else i
191
+
192
+ def keysIterator (offset : Int ) = new Iterator [Value ]:
193
+ private var curIdx = skipUndefined(0 )
194
+ private var elemIt = Iterator .empty[Int ]
195
+ def hasNext = elemIt.hasNext || curIdx < NodeSize
196
+ def next (): Value =
197
+ if elemIt.hasNext then elemIt.next()
198
+ else
199
+ elemIt = elems(curIdx).keysIterator(offset + curIdx * elemSize)
200
+ curIdx = skipUndefined(curIdx + 1 )
201
+ elemIt.next()
202
+
170
203
def foreachBinding (op : (Int , Value ) => Unit , offset : Int ): Unit =
171
204
var i = 0
172
205
while i < NodeSize do
@@ -205,6 +238,7 @@ end SparseIntArray
205
238
println(s " a = $a" )
206
239
a(55555 ) = 44
207
240
println(s " a = $a" )
241
+ println(s " iterator of a yields ${a.keysIterator.toList}" )
208
242
assert(a.size == 3 , a)
209
243
assert(a.contains(1 ), a)
210
244
assert(a.contains(222 ), a)
0 commit comments