Fix iterable mapping example.

This commit is contained in:
chriseth 2022-02-28 17:57:19 +01:00
parent 1aacb67a10
commit fb7cdda891

View File

@ -126,7 +126,7 @@ the ``sum`` function iterates over to sum all the values.
:force: :force:
// SPDX-License-Identifier: GPL-3.0 // SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.6.8 <0.9.0; pragma solidity ^0.8.8;
struct IndexValue { uint keyIndex; uint value; } struct IndexValue { uint keyIndex; uint value; }
struct KeyFlag { uint key; bool deleted; } struct KeyFlag { uint key; bool deleted; }
@ -137,6 +137,8 @@ the ``sum`` function iterates over to sum all the values.
uint size; uint size;
} }
type Iterator is uint;
library IterableMapping { library IterableMapping {
function insert(itmap storage self, uint key, uint value) internal returns (bool replaced) { function insert(itmap storage self, uint key, uint value) internal returns (bool replaced) {
uint keyIndex = self.data[key].keyIndex; uint keyIndex = self.data[key].keyIndex;
@ -166,25 +168,29 @@ the ``sum`` function iterates over to sum all the values.
return self.data[key].keyIndex > 0; return self.data[key].keyIndex > 0;
} }
function iterateStart(itmap storage self) internal view returns (uint keyIndex) { function iterateStart(itmap storage self) internal view returns (Iterator) {
return iterateNext(self, type(uint).max); return iteratorSkipDeleted(self, 0);
} }
function iterateValid(itmap storage self, uint keyIndex) internal view returns (bool) { function iterateValid(itmap storage self, Iterator iterator) internal view returns (bool) {
return keyIndex < self.keys.length; return Iterator.unwrap(iterator) < self.keys.length;
} }
function iterateNext(itmap storage self, uint keyIndex) internal view returns (uint r_keyIndex) { function iterateNext(itmap storage self, Iterator iterator) internal view returns (Iterator) {
keyIndex++; return iteratorSkipDeleted(self, Iterator.unwrap(iterator) + 1);
while (keyIndex < self.keys.length && self.keys[keyIndex].deleted)
keyIndex++;
return keyIndex;
} }
function iterateGet(itmap storage self, uint keyIndex) internal view returns (uint key, uint value) { function iterateGet(itmap storage self, Iterator iterator) internal view returns (uint key, uint value) {
uint keyIndex = Iterator.unwrap(iterator);
key = self.keys[keyIndex].key; key = self.keys[keyIndex].key;
value = self.data[key].value; value = self.data[key].value;
} }
function iteratorSkipDeleted(itmap storage self, uint keyIndex) private view returns (Iterator) {
while (keyIndex < self.keys.length && self.keys[keyIndex].deleted)
keyIndex++;
return Iterator.wrap(keyIndex);
}
} }
// How to use it // How to use it
@ -206,7 +212,7 @@ the ``sum`` function iterates over to sum all the values.
// Computes the sum of all stored data. // Computes the sum of all stored data.
function sum() public view returns (uint s) { function sum() public view returns (uint s) {
for ( for (
uint i = data.iterateStart(); Iterator i = data.iterateStart();
data.iterateValid(i); data.iterateValid(i);
i = data.iterateNext(i) i = data.iterateNext(i)
) { ) {