Skip to content

Instantly share code, notes, and snippets.

@k06a
Created October 28, 2018 18:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save k06a/dfdcdb3988db6e954d367a97b09913bb to your computer and use it in GitHub Desktop.
Save k06a/dfdcdb3988db6e954d367a97b09913bb to your computer and use it in GitHub Desktop.
OptimizedArray.sol
pragma solidity ^0.4.24;
library OptimizedArray {
struct Data {
mapping(uint256 => uint256) m;
uint256 length;
}
function length(Data storage data) internal view returns(uint256) {
return data.length;
}
function setLength(Data storage data, uint256 newLength) internal returns(uint256) {
data.length = newLength;
}
function push(Data storage data, uint256 value) internal returns(uint256) {
data.m[data.length] = value;
return data.length++;
}
function pop(Data storage data) internal returns(uint256 value) {
value = data.m[--data.length];
delete data.m[data.length];
}
function eraseDirty(Data storage data, uint start, uint len) internal {
for (uint i = start; i < start + len; i++) {
if (i >= data.length && data.m[i] > 0) {
delete data.m[i];
}
}
}
}
library DirtyArray {
function setLength(uint[] storage arr, uint length) internal {
assembly {
sstore(arr_slot, length)
}
}
function eraseDirty(uint[] storage arr, uint start, uint length) internal {
for (uint i = start; i < start + length; i++) {
if (i >= arr.length) {
uint ptr;
assembly {
ptr := add(keccak256(arr_slot, 0x20), i)
if gt(sload(ptr), 0) {
sstore(ptr, 0)
}
}
}
}
}
}
contract Test {
using DirtyArray for *;
uint[] public arr;
function setLength(uint length) public {
arr.setLength(length);
}
function eraseDirty(uint index, uint length) public {
arr.eraseDirty(index, length);
}
function all() public view returns(uint[]) {
return arr;
}
function arrLength() public view returns(uint) {
return arr.length;
}
function func() public {
while (gasleft() >= 50000) {
arr.push(arr.length);
}
}
function func2(uint len) public {
arr.length = len;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment