Add support for more types in Arrays.sol (#5568)
This commit is contained in:
@ -414,6 +414,32 @@ library Arrays {
|
||||
return slot.deriveArray().offset(pos).getUint256Slot();
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
|
||||
*
|
||||
* WARNING: Only use if you are certain `pos` is lower than the array length.
|
||||
*/
|
||||
function unsafeAccess(bytes[] storage arr, uint256 pos) internal pure returns (StorageSlot.BytesSlot storage) {
|
||||
bytes32 slot;
|
||||
assembly ("memory-safe") {
|
||||
slot := arr.slot
|
||||
}
|
||||
return slot.deriveArray().offset(pos).getBytesSlot();
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
|
||||
*
|
||||
* WARNING: Only use if you are certain `pos` is lower than the array length.
|
||||
*/
|
||||
function unsafeAccess(string[] storage arr, uint256 pos) internal pure returns (StorageSlot.StringSlot storage) {
|
||||
bytes32 slot;
|
||||
assembly ("memory-safe") {
|
||||
slot := arr.slot
|
||||
}
|
||||
return slot.deriveArray().offset(pos).getStringSlot();
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
|
||||
*
|
||||
@ -447,6 +473,28 @@ library Arrays {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
|
||||
*
|
||||
* WARNING: Only use if you are certain `pos` is lower than the array length.
|
||||
*/
|
||||
function unsafeMemoryAccess(bytes[] memory arr, uint256 pos) internal pure returns (bytes memory res) {
|
||||
assembly {
|
||||
res := mload(add(add(arr, 0x20), mul(pos, 0x20)))
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
|
||||
*
|
||||
* WARNING: Only use if you are certain `pos` is lower than the array length.
|
||||
*/
|
||||
function unsafeMemoryAccess(string[] memory arr, uint256 pos) internal pure returns (string memory res) {
|
||||
assembly {
|
||||
res := mload(add(add(arr, 0x20), mul(pos, 0x20)))
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Helper to set the length of a dynamic array. Directly writing to `.length` is forbidden.
|
||||
*
|
||||
@ -479,4 +527,26 @@ library Arrays {
|
||||
sstore(array.slot, len)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Helper to set the length of a dynamic array. Directly writing to `.length` is forbidden.
|
||||
*
|
||||
* WARNING: this does not clear elements if length is reduced, of initialize elements if length is increased.
|
||||
*/
|
||||
function unsafeSetLength(bytes[] storage array, uint256 len) internal {
|
||||
assembly ("memory-safe") {
|
||||
sstore(array.slot, len)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Helper to set the length of a dynamic array. Directly writing to `.length` is forbidden.
|
||||
*
|
||||
* WARNING: this does not clear elements if length is reduced, of initialize elements if length is increased.
|
||||
*/
|
||||
function unsafeSetLength(string[] storage array, uint256 len) internal {
|
||||
assembly ("memory-safe") {
|
||||
sstore(array.slot, len)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user