Skip to content

Commit d5a0cf1

Browse files
radik878Amxx
andauthored
Optimize gas cost of Heap.pop() when size==1 (#6155)
Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com>
1 parent de239d7 commit d5a0cf1

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

contracts/utils/structs/Heap.sol

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,17 @@ library Heap {
8585

8686
// cache
8787
uint256 rootValue = self.tree.unsafeAccess(0).value;
88-
uint256 lastValue = self.tree.unsafeAccess(size - 1).value;
89-
90-
// swap last leaf with root, shrink tree and re-heapify
91-
self.tree.pop();
92-
self.tree.unsafeAccess(0).value = lastValue;
93-
_siftDown(self, size - 1, 0, lastValue, comp);
94-
88+
if (size == 1) {
89+
self.tree.pop();
90+
} else {
91+
// swap last leaf with root ...
92+
uint256 lastValue = self.tree.unsafeAccess(size - 1).value;
93+
self.tree.unsafeAccess(0).value = lastValue;
94+
// ... shrink tree ...
95+
self.tree.pop();
96+
// ... re-heapify
97+
_siftDown(self, size - 1, 0, lastValue, comp);
98+
}
9599
return rootValue;
96100
}
97101
}

0 commit comments

Comments
 (0)