Skip to content

Instantly share code, notes, and snippets.

@ethers
Forked from Arachnid/itmap.sol
Last active May 19, 2022 02:29
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save ethers/7e6d443818cbc9ad2c38efa7c0f363d1 to your computer and use it in GitHub Desktop.
Save ethers/7e6d443818cbc9ad2c38efa7c0f363d1 to your computer and use it in GitHub Desktop.
Solidity iterable map
library itmap {
struct entry {
// Equal to the index of the key of this item in keys, plus 1.
uint keyIndex;
uint value;
}
struct itmap {
mapping(uint => entry) data;
uint[] keys;
}
function insert(itmap storage self, uint key, uint value) internal returns (bool replaced) {
entry storage e = self.data[key];
e.value = value;
if (e.keyIndex > 0) {
return true;
} else {
e.keyIndex = ++self.keys.length;
self.keys[e.keyIndex - 1] = key;
return false;
}
}
function remove(itmap storage self, uint key) internal returns (bool success) {
entry storage e = self.data[key];
if (e.keyIndex == 0)
return false;
if (e.keyIndex < self.keys.length) {
// Move an existing element into the vacated key slot.
self.data[self.keys[self.keys.length - 1]].keyIndex = e.keyIndex;
self.keys[e.keyIndex - 1] = self.keys[self.keys.length - 1];
self.keys.length -= 1;
delete self.data[key];
return true;
}
}
function contains(itmap storage self, uint key) internal constant returns (bool exists) {
return self.data[key].keyIndex > 0;
}
function size(itmap storage self) internal constant returns (uint) {
return self.keys.length;
}
function get(itmap storage self, uint key) internal constant returns (uint) {
return self.data[key].value;
}
function getKey(itmap storage self, uint idx) internal constant returns (uint) {
return self.keys[idx];
}
}
contract Test {
// Use itmap for all functions on the struct
using itmap for itmap.itmap;
// Declare an iterable mapping
itmap.itmap mymap;
function insert(uint key, uint value) {
mymap.insert(key, value);
}
function get(uint key) returns (uint value) {
return mymap.get(key);
}
}
@szerintedmi
Copy link

Hi! I've tweaked this, fixed a bug (it wasn't removing the item when there was only 1 item in map) plus added a few new type mappings.
All of it in a new repo: https://github.com/szerintedmi/solidity-itMapsLib
You don't have any licence here, so I've added Apache 2.0. Please let me know if you have any issue with that license.
Suggestions about my changes are welcome too! :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment