@@ -126,7 +126,7 @@ the ``sum`` function iterates over to sum all the values.
126
126
:force:
127
127
128
128
// SPDX-License-Identifier: GPL-3.0
129
- pragma solidity >=0.6.8 <0.9.0 ;
129
+ pragma solidity ^0.8.8 ;
130
130
131
131
struct IndexValue { uint keyIndex; uint value; }
132
132
struct KeyFlag { uint key; bool deleted; }
@@ -137,6 +137,8 @@ the ``sum`` function iterates over to sum all the values.
137
137
uint size;
138
138
}
139
139
140
+ type Iterator is uint;
141
+
140
142
library IterableMapping {
141
143
function insert(itmap storage self, uint key, uint value) internal returns (bool replaced) {
142
144
uint keyIndex = self.data[key].keyIndex;
@@ -166,25 +168,29 @@ the ``sum`` function iterates over to sum all the values.
166
168
return self.data[key].keyIndex > 0;
167
169
}
168
170
169
- function iterateStart(itmap storage self) internal view returns (uint keyIndex ) {
170
- return iterateNext (self, type(uint).max );
171
+ function iterateStart(itmap storage self) internal view returns (Iterator ) {
172
+ return iteratorSkipDeleted (self, 0 );
171
173
}
172
174
173
- function iterateValid(itmap storage self, uint keyIndex ) internal view returns (bool) {
174
- return keyIndex < self.keys.length;
175
+ function iterateValid(itmap storage self, Iterator iterator ) internal view returns (bool) {
176
+ return Iterator.unwrap(iterator) < self.keys.length;
175
177
}
176
178
177
- function iterateNext(itmap storage self, uint keyIndex) internal view returns (uint r_keyIndex) {
178
- keyIndex++;
179
- while (keyIndex < self.keys.length && self.keys[keyIndex].deleted)
180
- keyIndex++;
181
- return keyIndex;
179
+ function iterateNext(itmap storage self, Iterator iterator) internal view returns (Iterator) {
180
+ return iteratorSkipDeleted(self, Iterator.unwrap(iterator) + 1);
182
181
}
183
182
184
- function iterateGet(itmap storage self, uint keyIndex) internal view returns (uint key, uint value) {
183
+ function iterateGet(itmap storage self, Iterator iterator) internal view returns (uint key, uint value) {
184
+ uint keyIndex = Iterator.unwrap(iterator);
185
185
key = self.keys[keyIndex].key;
186
186
value = self.data[key].value;
187
187
}
188
+
189
+ function iteratorSkipDeleted(itmap storage self, uint keyIndex) private view returns (Iterator) {
190
+ while (keyIndex < self.keys.length && self.keys[keyIndex].deleted)
191
+ keyIndex++;
192
+ return Iterator.wrap(keyIndex);
193
+ }
188
194
}
189
195
190
196
// How to use it
@@ -206,7 +212,7 @@ the ``sum`` function iterates over to sum all the values.
206
212
// Computes the sum of all stored data.
207
213
function sum() public view returns (uint s) {
208
214
for (
209
- uint i = data.iterateStart();
215
+ Iterator i = data.iterateStart();
210
216
data.iterateValid(i);
211
217
i = data.iterateNext(i)
212
218
) {
0 commit comments