-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
LibraryMappingAddress.sol
178 lines (168 loc) · 7.85 KB
/
LibraryMappingAddress.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
// SPDX-License-Identifier: AGPL-3.0
pragma solidity 0.8.7;
/// @title Organizes methods that may be attached to `mapping(address => address)` type
/// @notice **Warning** any value of `address(0x0)` is treated as _null_ or _undefined_
/// @author S0AndS0
library LibraryMappingAddress {
/// @notice Retrieves stored value `address` or throws an error if _undefined_
/// @param _self **{mapping(address => address)}** Mapping of key/value `address` pairs
/// @param _key **{address}** Mapping key `address` to lookup corresponding value `address` for
/// @return **{address}** Value for given key `address`
/// @custom:throws **{Error}** `"LibraryMappingAddress.get: value not defined"`
function get(mapping(address => address) storage _self, address _key)
external
view
returns (address)
{
address _value = _self[_key];
require(
_value != address(0x0),
"LibraryMappingAddress.get: value not defined"
);
return _value;
}
/// @notice Retrieves stored value `address` or provided default `address` if _undefined_
/// @param _self **{mapping(address => address)}** Mapping of key/value `address` pairs
/// @param _key **{address}** Mapping key `address` to lookup corresponding value `address` for
/// @param _default **{address}** Value to return if key `address` lookup is _undefined_
/// @return **{address}** Value `address` for given key `address` or `_default` if _undefined_
function getOrElse(
mapping(address => address) storage _self,
address _key,
address _default
) external view returns (address) {
address _value = _self[_key];
return _value != address(0x0) ? _value : _default;
}
/// @notice Allows for defining custom error reason if value `address` is _undefined_
/// @param _self **{mapping(address => address)}** Mapping of key/value `address` pairs
/// @param _key **{address}** Mapping key `address` to lookup corresponding value `address` for
/// @param _reason **{string}** Custom error message to throw if value `address` is _undefined_
/// @return **{address}** Value for given key `address`
/// @custom:throws **{Error}** _reason if value is _undefined_
function getOrError(
mapping(address => address) storage _self,
address _key,
string memory _reason
) external view returns (address) {
address _value = _self[_key];
require(_value != address(0x0), _reason);
return _value;
}
/// @notice Check if `address` key has a corresponding value `address` defined
/// @param _self **{mapping(address => address)}** Mapping of key/value `address` pairs
/// @param _key **{address}** Mapping key to check if value `address` is defined
/// @return **{bool}** true if value `address` is defined, or `false` if _undefined_
function has(mapping(address => address) storage _self, address _key)
external
view
returns (bool)
{
return _self[_key] != address(0x0);
}
/// @notice Store `_value` under given `_key` **without** preventing unintentional overwrites
/// @param _self **{mapping(address => address)}** Mapping of key/value `address` pairs
/// @param _key **{address}** Mapping key to set corresponding value `address` for
/// @param _value **{address}** Mapping value to set
/// @custom:throws **{Error}** `"LibraryMappingAddress.overwrite: value cannot be 0x0"`
function overwrite(
mapping(address => address) storage _self,
address _key,
address _value
) external {
require(
_value != address(0x0),
"LibraryMappingAddress.overwrite: value cannot be 0x0"
);
_self[_key] = _value;
}
/// @notice Store `_value` under given `_key` **without** preventing unintentional overwrites
/// @param _self **{mapping(address => address)}** Mapping of key/value `address` pairs
/// @param _key **{address}** Mapping key to set corresponding value `address` for
/// @param _value **{address}** Mapping value to set
/// @param _reason **{string}** Custom error message to present if value `address` is `0x0`
/// @custom:throws **{Error}** `_reason` if value is `0x0`
function overwriteOrError(
mapping(address => address) storage _self,
address _key,
address _value,
string memory _reason
) external {
require(_value != address(0x0), _reason);
_self[_key] = _value;
}
/// @notice Delete value `address` for given `_key`
/// @param _self **{mapping(address => address)}** Mapping of key/value `address` pairs
/// @param _key **{address}** Mapping key to delete corresponding value `address` for
/// @return **{address}** Stored value `address` for given key `address`
/// @custom:throws **{Error}** `"LibraryMappingAddress.remove: value not defined"`
function remove(mapping(address => address) storage _self, address _key)
external
returns (address)
{
address _value = _self[_key];
require(
_value != address(0x0),
"LibraryMappingAddress.remove: value not defined"
);
delete _self[_key];
return _value;
}
/// @notice Delete value `address` for given `_key`
/// @param _self **{mapping(address => address)}** Mapping of key/value `address` pairs
/// @param _key **{address}** Mapping key to delete corresponding value `address` for
/// @param _reason **{string}** Custom error message to throw if value `address` is _undefined_
/// @return **{address}** Stored value `address` for given key `address`
/// @custom:throws **{Error}** _reason if value is _undefined_
function removeOrError(
mapping(address => address) storage _self,
address _key,
string memory _reason
) external returns (address) {
address _value = _self[_key];
require(_value != address(0x0), _reason);
delete _self[_key];
return _value;
}
/// @notice Store `_value` under given `_key` while preventing unintentional overwrites
/// @param _self **{mapping(address => address)}** Mapping of key/value `address` pairs
/// @param _key **{address}** Mapping key to set corresponding value `address` for
/// @param _value **{address}** Mapping value to set
/// @custom:throws **{Error}** `"LibraryMappingAddress.set: value already defined"`
/// @custom:throws **{Error}** `"LibraryMappingAddress.set: value cannot be 0x0"`
function set(
mapping(address => address) storage _self,
address _key,
address _value
) external {
require(
_self[_key] == address(0x0),
"LibraryMappingAddress.set: value already defined"
);
require(
_value != address(0x0),
"LibraryMappingAddress.set: value cannot be 0x0"
);
_self[_key] = _value;
}
/// @notice Store `_value` under given `_key` while preventing unintentional overwrites
/// @param _self **{mapping(address => address)}** Mapping of key/value `address` pairs
/// @param _key **{address}** Mapping key to set corresponding value `address` for
/// @param _value **{address}** Mapping value to set
/// @param _reason **{string}** Custom error message to present if value `address` is defined
/// @custom:throws **{Error}** _reason if value is defined
/// @custom:throws **{Error}** `"LibraryMappingAddress.setOrError: value cannot be 0x0"`
function setOrError(
mapping(address => address) storage _self,
address _key,
address _value,
string memory _reason
) external {
require(_self[_key] == address(0x0), _reason);
require(
_value != address(0x0),
"LibraryMappingAddress.setOrError: value cannot be 0x0"
);
_self[_key] = _value;
}
}