Skip to content

Commit c44dff8

Browse files
committed
optimize EnumerableSet toArray functions
1 parent e9f741c commit c44dff8

File tree

1 file changed

+11
-24
lines changed

1 file changed

+11
-24
lines changed

contracts/data/EnumerableSet.sol

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -155,50 +155,37 @@ library EnumerableSet {
155155
view
156156
returns (bytes32[] memory)
157157
{
158-
uint256 len = _length(set._inner);
159-
bytes32[] memory arr = new bytes32[](len);
160-
161-
unchecked {
162-
for (uint256 index; index < len; ++index) {
163-
arr[index] = at(set, index);
164-
}
165-
}
166-
167-
return arr;
158+
return set._inner._values;
168159
}
169160

170161
function toArray(AddressSet storage set)
171162
internal
172163
view
173164
returns (address[] memory)
174165
{
175-
uint256 len = _length(set._inner);
176-
address[] memory arr = new address[](len);
166+
bytes32[] storage values = set._inner._values;
167+
address[] storage array;
177168

178-
unchecked {
179-
for (uint256 index; index < len; ++index) {
180-
arr[index] = at(set, index);
181-
}
169+
assembly {
170+
array.slot := values.slot
182171
}
183172

184-
return arr;
173+
return array;
185174
}
186175

187176
function toArray(UintSet storage set)
188177
internal
189178
view
190179
returns (uint256[] memory)
191180
{
192-
uint256 len = _length(set._inner);
193-
uint256[] memory arr = new uint256[](len);
181+
bytes32[] storage values = set._inner._values;
182+
uint256[] storage array;
194183

195-
unchecked {
196-
for (uint256 index; index < len; ++index) {
197-
arr[index] = at(set, index);
198-
}
184+
assembly {
185+
array.slot := values.slot
199186
}
200187

201-
return arr;
188+
return array;
202189
}
203190

204191
function _at(Set storage set, uint256 index)

0 commit comments

Comments
 (0)