Skip to content

Commit fb7cdda

Browse files
committed
Fix iterable mapping example.
1 parent 1aacb67 commit fb7cdda

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

docs/types/mapping-types.rst

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ the ``sum`` function iterates over to sum all the values.
126126
:force:
127127
128128
// SPDX-License-Identifier: GPL-3.0
129-
pragma solidity >=0.6.8 <0.9.0;
129+
pragma solidity ^0.8.8;
130130
131131
struct IndexValue { uint keyIndex; uint value; }
132132
struct KeyFlag { uint key; bool deleted; }
@@ -137,6 +137,8 @@ the ``sum`` function iterates over to sum all the values.
137137
uint size;
138138
}
139139
140+
type Iterator is uint;
141+
140142
library IterableMapping {
141143
function insert(itmap storage self, uint key, uint value) internal returns (bool replaced) {
142144
uint keyIndex = self.data[key].keyIndex;
@@ -166,25 +168,29 @@ the ``sum`` function iterates over to sum all the values.
166168
return self.data[key].keyIndex > 0;
167169
}
168170
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);
171173
}
172174
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;
175177
}
176178
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);
182181
}
183182
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);
185185
key = self.keys[keyIndex].key;
186186
value = self.data[key].value;
187187
}
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+
}
188194
}
189195
190196
// How to use it
@@ -206,7 +212,7 @@ the ``sum`` function iterates over to sum all the values.
206212
// Computes the sum of all stored data.
207213
function sum() public view returns (uint s) {
208214
for (
209-
uint i = data.iterateStart();
215+
Iterator i = data.iterateStart();
210216
data.iterateValid(i);
211217
i = data.iterateNext(i)
212218
) {

0 commit comments

Comments
 (0)