Skip to content

Commit

Permalink
T
Browse files Browse the repository at this point in the history
  • Loading branch information
Vectorized committed Feb 6, 2024
1 parent da851e7 commit 93fa110
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 74 deletions.
44 changes: 22 additions & 22 deletions .gas-snapshot
Original file line number Diff line number Diff line change
Expand Up @@ -922,29 +922,29 @@ ReceiverTest:testOnERC1155BatchReceived() (gas: 48975)
ReceiverTest:testOnERC1155Received() (gas: 46717)
ReceiverTest:testOnERC721Received() (gas: 64127)
ReceiverTest:test__codesize() (gas: 3310)
RedBlackTreeLibTest:testRedBlackTreeBenchUint160() (gas: 3432597)
RedBlackTreeLibTest:testRedBlackTreeBenchUint256() (gas: 5846304)
RedBlackTreeLibTest:testRedBlackTreeInsertAndRemove(uint256) (runs: 256, μ: 686128, ~: 528349)
RedBlackTreeLibTest:testRedBlackTreeInsertAndRemove2(uint256) (runs: 256, μ: 423537, ~: 390377)
RedBlackTreeLibTest:testRedBlackTreeInsertAndRemove3() (gas: 21559226)
RedBlackTreeLibTest:testRedBlackTreeInsertBenchStep() (gas: 3707644)
RedBlackTreeLibTest:testRedBlackTreeInsertBenchUint160() (gas: 3473262)
RedBlackTreeLibTest:testRedBlackTreeInsertBenchUint256() (gas: 6372882)
RedBlackTreeLibTest:testRedBlackTreeInsertOneGas() (gas: 45595)
RedBlackTreeLibTest:testRedBlackTreeInsertTenGas() (gas: 283061)
RedBlackTreeLibTest:testRedBlackTreeInsertThreeGas() (gas: 96286)
RedBlackTreeLibTest:testRedBlackTreeInsertTwoGas() (gas: 69859)
RedBlackTreeLibTest:testRedBlackTreeNearest(uint256) (runs: 256, μ: 247471, ~: 227634)
RedBlackTreeLibTest:testRedBlackTreeNearestAfter(uint256) (runs: 256, μ: 253681, ~: 248938)
RedBlackTreeLibTest:testRedBlackTreeNearestBefore(uint256) (runs: 256, μ: 229243, ~: 195540)
RedBlackTreeLibTest:testRedBlackTreePointers() (gas: 91959)
RedBlackTreeLibTest:testRedBlackTreeBenchUint160() (gas: 3429423)
RedBlackTreeLibTest:testRedBlackTreeBenchUint256() (gas: 5843130)
RedBlackTreeLibTest:testRedBlackTreeInsertAndRemove(uint256) (runs: 256, μ: 627514, ~: 487609)
RedBlackTreeLibTest:testRedBlackTreeInsertAndRemove2(uint256) (runs: 256, μ: 420920, ~: 390160)
RedBlackTreeLibTest:testRedBlackTreeInsertAndRemove3() (gas: 21546528)
RedBlackTreeLibTest:testRedBlackTreeInsertBenchStep() (gas: 3703676)
RedBlackTreeLibTest:testRedBlackTreeInsertBenchUint160() (gas: 3469294)
RedBlackTreeLibTest:testRedBlackTreeInsertBenchUint256() (gas: 6368914)
RedBlackTreeLibTest:testRedBlackTreeInsertOneGas() (gas: 45564)
RedBlackTreeLibTest:testRedBlackTreeInsertTenGas() (gas: 282751)
RedBlackTreeLibTest:testRedBlackTreeInsertThreeGas() (gas: 96193)
RedBlackTreeLibTest:testRedBlackTreeInsertTwoGas() (gas: 69797)
RedBlackTreeLibTest:testRedBlackTreeNearest(uint256) (runs: 256, μ: 228165, ~: 224911)
RedBlackTreeLibTest:testRedBlackTreeNearestAfter(uint256) (runs: 256, μ: 251011, ~: 248814)
RedBlackTreeLibTest:testRedBlackTreeNearestBefore(uint256) (runs: 256, μ: 232084, ~: 195909)
RedBlackTreeLibTest:testRedBlackTreePointers() (gas: 91897)
RedBlackTreeLibTest:testRedBlackTreeRejectsEmptyValue() (gas: 3238)
RedBlackTreeLibTest:testRedBlackTreeRemoveViaPointer() (gas: 58221)
RedBlackTreeLibTest:testRedBlackTreeTreeFullReverts() (gas: 50366)
RedBlackTreeLibTest:testRedBlackTreeTryInsertAndRemove() (gas: 56188)
RedBlackTreeLibTest:testRedBlackTreeValues() (gas: 191692)
RedBlackTreeLibTest:testRedBlackTreeValues(uint256) (runs: 256, μ: 366611, ~: 266718)
RedBlackTreeLibTest:test__codesize() (gas: 14100)
RedBlackTreeLibTest:testRedBlackTreeRemoveViaPointer() (gas: 58172)
RedBlackTreeLibTest:testRedBlackTreeTreeFullReverts() (gas: 50335)
RedBlackTreeLibTest:testRedBlackTreeTryInsertAndRemove() (gas: 56139)
RedBlackTreeLibTest:testRedBlackTreeValues() (gas: 191599)
RedBlackTreeLibTest:testRedBlackTreeValues(uint256) (runs: 256, μ: 383999, ~: 267070)
RedBlackTreeLibTest:test__codesize() (gas: 14087)
ReentrancyGuardTest:testRecursiveDirectUnguardedCall() (gas: 34254)
ReentrancyGuardTest:testRecursiveIndirectUnguardedCall() (gas: 47771)
ReentrancyGuardTest:testRevertGuardLocked() (gas: 53917)
Expand Down
105 changes: 53 additions & 52 deletions src/utils/RedBlackTreeLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,55 @@ library RedBlackTreeLib {
sstore(or(nodes_, cursor_), setKey(cursorPacked_, L, key_))
}

function insertFixup(nodes_, key_) {
function insert(nodes_, cursor_, key_, x_) -> err_ {
if key_ {
err_ := ERROR_VALUE_ALREADY_EXISTS
leave
}

let totalNodes_ := add(shr(128, mload(0x20)), 1)
if gt(totalNodes_, _BITMASK_KEY) {
err_ := ERROR_TREE_IS_FULL
leave
}

mstore(0x20, shl(128, totalNodes_))

{
let packed_ := or(_BITMASK_RED, shl(_BITPOS_PARENT, cursor_))
let nodePointer_ := or(nodes_, totalNodes_)

for {} 1 {} {
if iszero(gt(x_, _BITMASK_PACKED_VALUE)) {
packed_ := or(shl(_BITPOS_PACKED_VALUE, x_), packed_)
break
}
sstore(or(nodePointer_, _BIT_FULL_VALUE_SLOT), x_)
break
}
sstore(nodePointer_, packed_)

for {} 1 {} {
if iszero(cursor_) {
mstore(0x00, totalNodes_)
break
}
let s_ := or(nodes_, cursor_)
let cPacked_ := sload(s_)
let cValue_ := shr(_BITPOS_PACKED_VALUE, cPacked_)
if iszero(cValue_) { cValue_ := sload(or(s_, _BIT_FULL_VALUE_SLOT)) }
if iszero(lt(x_, cValue_)) {
sstore(s_, setKey(cPacked_, _BITPOS_RIGHT, totalNodes_))
break
}
sstore(s_, setKey(cPacked_, _BITPOS_LEFT, totalNodes_))
break
}
}

// Insert fixup workflow:

key_ := totalNodes_
let BR := _BITMASK_RED
for {} iszero(eq(key_, mload(0x00))) {} {
let packed_ := sload(or(nodes_, key_))
Expand All @@ -405,9 +453,9 @@ library RedBlackTreeLib {
let R := mul(eq(parent_, getKey(grandParentPacked_, 0)), _BITPOS_RIGHT)
let L := xor(R, _BITPOS_RIGHT)

let cursor_ := getKey(grandParentPacked_, R)
let cursorPacked_ := sload(or(nodes_, cursor_))
if iszero(and(BR, cursorPacked_)) {
let c_ := getKey(grandParentPacked_, R)
let cPacked_ := sload(or(nodes_, c_))
if iszero(and(BR, cPacked_)) {
if eq(key_, getKey(parentPacked_, R)) {
key_ := parent_
rotate(nodes_, key_, L, R)
Expand All @@ -422,61 +470,14 @@ library RedBlackTreeLib {
continue
}
sstore(or(nodes_, parent_), and(parentPacked_, not(BR)))
sstore(or(nodes_, cursor_), and(cursorPacked_, not(BR)))
sstore(or(nodes_, c_), and(cPacked_, not(BR)))
sstore(or(nodes_, grandParent_), or(grandParentPacked_, BR))
key_ := grandParent_
}
let root_ := or(nodes_, mload(0x00))
sstore(root_, and(sload(root_), not(BR)))
}

function insert(nodes_, cursor_, key_, x_) -> err_ {
if key_ {
err_ := ERROR_VALUE_ALREADY_EXISTS
leave
}

let totalNodes_ := add(shr(128, mload(0x20)), 1)

if gt(totalNodes_, _BITMASK_KEY) {
err_ := ERROR_TREE_IS_FULL
leave
}

mstore(0x20, shl(128, totalNodes_))

let packed_ := or(_BITMASK_RED, shl(_BITPOS_PARENT, cursor_))
let nodePointer_ := or(nodes_, totalNodes_)

for {} 1 {} {
if iszero(gt(x_, _BITMASK_PACKED_VALUE)) {
packed_ := or(shl(_BITPOS_PACKED_VALUE, x_), packed_)
break
}
sstore(or(nodePointer_, _BIT_FULL_VALUE_SLOT), x_)
break
}
sstore(nodePointer_, packed_)

for {} 1 {} {
if iszero(cursor_) {
mstore(0x00, totalNodes_)
break
}
let s_ := or(nodes_, cursor_)
let cursorPacked_ := sload(s_)
let cursorValue_ := shr(_BITPOS_PACKED_VALUE, cursorPacked_)
if iszero(cursorValue_) { cursorValue_ := sload(or(s_, _BIT_FULL_VALUE_SLOT)) }
if iszero(lt(x_, cursorValue_)) {
sstore(s_, setKey(cursorPacked_, _BITPOS_RIGHT, totalNodes_))
break
}
sstore(s_, setKey(cursorPacked_, _BITPOS_LEFT, totalNodes_))
break
}
insertFixup(nodes_, totalNodes_)
}

function removeFixup(nodes_, key_) {
let BR := _BITMASK_RED
for {} iszero(eq(key_, mload(0x00))) {} {
Expand Down

0 comments on commit 93fa110

Please sign in to comment.