Skip to content

Commit f0355fb

Browse files
authored
Merge pull request #151 from solidstate-network/EnumerableMapTests
Update and test `EnumerableMap`
2 parents f46df77 + 4e1edc1 commit f0355fb

File tree

4 files changed

+653
-5
lines changed

4 files changed

+653
-5
lines changed

contracts/data/EnumerableMap.sol

Lines changed: 107 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ library EnumerableMap {
3535
returns (address, address)
3636
{
3737
(bytes32 key, bytes32 value) = _at(map._inner, index);
38-
address addressKey;
39-
assembly {
40-
addressKey := mload(add(key, 20))
41-
}
42-
return (addressKey, address(uint160(uint256(value))));
38+
39+
return (
40+
address(uint160(uint256(key))),
41+
address(uint160(uint256(value)))
42+
);
4343
}
4444

4545
function at(UintToAddressMap storage map, uint256 index)
@@ -139,6 +139,108 @@ library EnumerableMap {
139139
return _remove(map._inner, bytes32(key));
140140
}
141141

142+
function toArray(AddressToAddressMap storage map)
143+
internal
144+
view
145+
returns (address[] memory keys, address[] memory values)
146+
{
147+
uint256 len = map._inner._entries.length;
148+
keys = new address[](len);
149+
values = new address[](len);
150+
unchecked {
151+
for (uint256 i; i < len; ++i) {
152+
keys[i] = address(
153+
uint160(uint256(map._inner._entries[i]._key))
154+
);
155+
values[i] = address(
156+
uint160(uint256(map._inner._entries[i]._value))
157+
);
158+
}
159+
}
160+
}
161+
162+
function toArray(UintToAddressMap storage map)
163+
internal
164+
view
165+
returns (uint256[] memory keys, address[] memory values)
166+
{
167+
uint256 len = map._inner._entries.length;
168+
keys = new uint256[](len);
169+
values = new address[](len);
170+
unchecked {
171+
for (uint256 i; i < len; ++i) {
172+
keys[i] = uint256(map._inner._entries[i]._key);
173+
values[i] = address(
174+
uint160(uint256(map._inner._entries[i]._value))
175+
);
176+
}
177+
}
178+
}
179+
180+
function keys(AddressToAddressMap storage map)
181+
internal
182+
view
183+
returns (address[] memory keys)
184+
{
185+
uint256 len = map._inner._entries.length;
186+
keys = new address[](len);
187+
188+
unchecked {
189+
for (uint256 i; i < len; ++i) {
190+
keys[i] = address(
191+
uint160(uint256(map._inner._entries[i]._key))
192+
);
193+
}
194+
}
195+
}
196+
197+
function keys(UintToAddressMap storage map)
198+
internal
199+
view
200+
returns (uint256[] memory keys)
201+
{
202+
uint256 len = map._inner._entries.length;
203+
keys = new uint256[](len);
204+
205+
unchecked {
206+
for (uint256 i; i < len; ++i) {
207+
keys[i] = uint256(map._inner._entries[i]._key);
208+
}
209+
}
210+
}
211+
212+
function values(AddressToAddressMap storage map)
213+
internal
214+
view
215+
returns (address[] memory values)
216+
{
217+
uint256 len = map._inner._entries.length;
218+
values = new address[](len);
219+
unchecked {
220+
for (uint256 i; i < len; ++i) {
221+
values[i] = address(
222+
uint160(uint256(map._inner._entries[i]._value))
223+
);
224+
}
225+
}
226+
}
227+
228+
function values(UintToAddressMap storage map)
229+
internal
230+
view
231+
returns (address[] memory values)
232+
{
233+
uint256 len = map._inner._entries.length;
234+
values = new address[](len);
235+
unchecked {
236+
for (uint256 i; i < len; ++i) {
237+
values[i] = address(
238+
uint160(uint256(map._inner._entries[i]._value))
239+
);
240+
}
241+
}
242+
}
243+
142244
function _at(Map storage map, uint256 index)
143245
private
144246
view
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// SPDX-License-Identifier: MIT
2+
3+
pragma solidity ^0.8.8;
4+
5+
import { EnumerableMap } from './EnumerableMap.sol';
6+
7+
contract EnumerableMapAddressToAddressMock {
8+
using EnumerableMap for EnumerableMap.AddressToAddressMap;
9+
10+
EnumerableMap.AddressToAddressMap internal map;
11+
12+
function at(uint256 index) external view returns (address, address) {
13+
return map.at(index);
14+
}
15+
16+
function contains(address key) external view returns (bool) {
17+
return map.contains(key);
18+
}
19+
20+
function length() external view returns (uint256) {
21+
return map.length();
22+
}
23+
24+
function get(address key) external view returns (address) {
25+
return map.get(key);
26+
}
27+
28+
function set(address key, address value) external returns (bool) {
29+
return map.set(key, value);
30+
}
31+
32+
function remove(address key) external returns (bool) {
33+
return map.remove(key);
34+
}
35+
36+
function toArray()
37+
external
38+
view
39+
returns (address[] memory keys, address[] memory values)
40+
{
41+
(keys, values) = map.toArray();
42+
}
43+
44+
function keys() external view returns (address[] memory keys) {
45+
keys = map.keys();
46+
}
47+
48+
function values() external view returns (address[] memory values) {
49+
values = map.values();
50+
}
51+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// SPDX-License-Identifier: MIT
2+
3+
pragma solidity ^0.8.8;
4+
5+
import { EnumerableMap } from './EnumerableMap.sol';
6+
7+
contract EnumerableMapUintToAddressMock {
8+
using EnumerableMap for EnumerableMap.UintToAddressMap;
9+
10+
EnumerableMap.UintToAddressMap internal map;
11+
12+
function at(uint256 index) external view returns (uint256, address) {
13+
return map.at(index);
14+
}
15+
16+
function contains(uint256 key) external view returns (bool) {
17+
return map.contains(key);
18+
}
19+
20+
function length() external view returns (uint256) {
21+
return map.length();
22+
}
23+
24+
function get(uint256 key) external view returns (address) {
25+
return map.get(key);
26+
}
27+
28+
function set(uint256 key, address value) external returns (bool) {
29+
return map.set(key, value);
30+
}
31+
32+
function remove(uint256 key) external returns (bool) {
33+
return map.remove(key);
34+
}
35+
36+
function toArray()
37+
external
38+
view
39+
returns (uint256[] memory keys, address[] memory values)
40+
{
41+
(keys, values) = map.toArray();
42+
}
43+
44+
function keys() external view returns (uint256[] memory keys) {
45+
keys = map.keys();
46+
}
47+
48+
function values() external view returns (address[] memory values) {
49+
values = map.values();
50+
}
51+
}

0 commit comments

Comments
 (0)