mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #12721 from ethereum/fixIterableMapping
Fix iterable mapping example.
This commit is contained in:
commit
198b705361
@ -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)
|
||||||
) {
|
) {
|
||||||
|
Loading…
Reference in New Issue
Block a user