|
@@ -130,6 +130,18 @@ library EnumerableSet {
|
|
|
return set._values[index];
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * @dev Return the entire set in an array
|
|
|
+ *
|
|
|
+ * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
|
|
|
+ * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
|
|
|
+ * this function has an unbounded cost, and using it as part of a state-changing function may render the function
|
|
|
+ * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
|
|
|
+ */
|
|
|
+ function _values(Set storage set) private view returns (bytes32[] memory) {
|
|
|
+ return set._values;
|
|
|
+ }
|
|
|
+
|
|
|
// Bytes32Set
|
|
|
|
|
|
struct Bytes32Set {
|
|
@@ -184,6 +196,18 @@ library EnumerableSet {
|
|
|
return _at(set._inner, index);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * @dev Return the entire set in an array
|
|
|
+ *
|
|
|
+ * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
|
|
|
+ * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
|
|
|
+ * this function has an unbounded cost, and using it as part of a state-changing function may render the function
|
|
|
+ * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
|
|
|
+ */
|
|
|
+ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
|
|
|
+ return _values(set._inner);
|
|
|
+ }
|
|
|
+
|
|
|
// AddressSet
|
|
|
|
|
|
struct AddressSet {
|
|
@@ -238,6 +262,25 @@ library EnumerableSet {
|
|
|
return address(uint160(uint256(_at(set._inner, index))));
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * @dev Return the entire set in an array
|
|
|
+ *
|
|
|
+ * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
|
|
|
+ * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
|
|
|
+ * this function has an unbounded cost, and using it as part of a state-changing function may render the function
|
|
|
+ * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
|
|
|
+ */
|
|
|
+ function values(AddressSet storage set) internal view returns (address[] memory) {
|
|
|
+ bytes32[] memory store = _values(set._inner);
|
|
|
+ address[] memory result;
|
|
|
+
|
|
|
+ assembly {
|
|
|
+ result := store
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
// UintSet
|
|
|
|
|
|
struct UintSet {
|
|
@@ -291,4 +334,23 @@ library EnumerableSet {
|
|
|
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
|
|
|
return uint256(_at(set._inner, index));
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @dev Return the entire set in an array
|
|
|
+ *
|
|
|
+ * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
|
|
|
+ * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
|
|
|
+ * this function has an unbounded cost, and using it as part of a state-changing function may render the function
|
|
|
+ * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
|
|
|
+ */
|
|
|
+ function values(UintSet storage set) internal view returns (uint256[] memory) {
|
|
|
+ bytes32[] memory store = _values(set._inner);
|
|
|
+ uint256[] memory result;
|
|
|
+
|
|
|
+ assembly {
|
|
|
+ result := store
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
}
|