solidity 内存(memory) 可变数组的增删改查 操作

科技资讯 投稿 6400 0 评论

solidity 内存(memory) 可变数组的增删改查 操作

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

library Array {
    function push(uint256[] memory _nums, uint256 _num internal pure {
        assembly {
            mstore(add(_nums, mul(add(mload(_nums, 1, 0x20, _num
            mstore(_nums, add(mload(_nums, 1
            // 0x40 是空闲内存指针的预定义位置 (value 为 空闲指针开始位
            mstore(0x40, add(mload(0x40, 0x20
        }
    }

    function pop(uint256[] memory _nums internal pure returns (uint256 num_ {
        assembly {
            num_ := mload(add(_nums, mul(mload(_nums, 0x20
            mstore(_nums, sub(mload(_nums, 1
        }
    }

    function del(uint256[] memory _nums, uint256 _index internal pure {
        assembly {
            if lt(_index, mload(_nums {
                mstore(
                    add(_nums, mul(add(_index, 1, 0x20,
                    mload(add(_nums, mul(mload(_nums, 0x20
                
                mstore(_nums, sub(mload(_nums, 1
            }
        }
    }

    function update(
        uint256[] memory _nums,
        uint256 _index,
        uint256 _num
     internal pure {
        _nums[_index] = _num;
    }

    function get(uint256[] memory _nums, uint256 _index
        internal
        pure
        returns (uint256
    {
        return _nums[_index];
    }
}

contract testArr {
    using Array for uint256[];

    function push(uint256[] memory _nums, uint256 num
        external
        pure
        returns (uint256[] memory
    {
        _nums.push(num;
        return _nums;
    }

    function pop(uint256[] memory _nums
        external
        pure
        returns (uint256[] memory, uint256
    {
        uint256 num_ = _nums.pop(;
        return (_nums, num_;
    }

    function del(uint256[] memory _nums, uint256 _index
        external
        pure
        returns (uint256[] memory
    {
        _nums.del(_index;
        return _nums;
    }

    function update(
        uint256[] memory _nums,
        uint256 _index,
        uint256 _num
     external pure returns (uint256[] memory {
        _nums.update(_index, _num;
        return _nums;
    }

    function get(uint256[] memory _nums, uint256 _index
        external
        pure
        returns (uint256
    {
        return _nums.get(_index;
    }
}

编程笔记 » solidity 内存(memory) 可变数组的增删改查 操作

赞同 (29) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽