首页 > 系统相关 >solidity 内存(memory) 可变数组的增删改查 操作

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

时间:2023-01-10 19:55:58浏览次数:46  
标签:mload index nums uint256 solidity 改查 num 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);
    }
}

标签:mload,index,nums,uint256,solidity,改查,num,memory
From: https://www.cnblogs.com/xiaobaiskill/p/17041245.html

相关文章

  • 三层架构增删改查功能
    ppublicinterfaceBrandMapper{/***查询所有*@return*/@Select("select*fromtb_brand")@ResultMap("brandResultMap")List<Brand>......
  • 【前端调试】- 利用 Performance 和 Memory 分析内存
    欢迎阅读本系列其他文章【前端调试】-更好的调试方式VSCodeDebugger【前端调试】-断点调试的正确打开方式【前端调试】-借助Performance分析并优化性能分析:下面......
  • 为什么 java 容器推荐使用 ExitOnOutOfMemoryError 而非 HeapDumpOnOutOfMemoryError
    前言好久没写文章了,今天之所以突然心血来潮,是因为昨天出现了这样一个情况:我们公司的某个手机APP后端的用户(customer)微服务出现内存泄露,导致OutOfMemoryError,但......
  • dataframe的增删改查
    介绍因为dataframe这个数据结构是一张表,既然是表,那么我们可以将数据像sql一样进行增、删、改、查。以下是对dataframe表操作的一些常用方法。导入模块importpandasas......
  • mysql执行增删改查语句返回受影响行数
    mysql执行增删改查语句返回受影响行数insertinto`MyTestTable`(`ID`,`Name`)select'1','role1'unionallselect'2','role2'unionallselect'3','role3'......
  • golang连接mysql操作示例增删改查
    golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动。这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/MySQL这个驱动......
  • SQL常用语句一览(增删改查Easy)
    SQL常用语句一览(1)数据记录筛选:sql="select*from数据表where字段名=字段值orderby字段名[desc]"sql="select*from数据表where字段名like'%字段值%'orderby字段名[desc]"......
  • 3.CRUD--增删改查
    1.namespace  namespace中的包名要和Dao/Mapper接口的包名一致!2.select  选择,查询语句  id:对应namespace中的方法名  resultType:sql执行的返回类型 ......
  • .NET性能优化-使用RecyclableMemoryStream替代MemoryStream
     提到MemoryStream大家可能都不陌生,在编写代码中或多或少有使用过;比如Json序列化反序列化、导出PDF/Excel/Word、进行图片或者文字处理等场景。但是如果使用它高频、......
  • .NET性能优化-使用RecyclableMemoryStream替代MemoryStream
    提到MemoryStream大家可能都不陌生,在编写代码中或多或少有使用过;比如Json序列化反序列化、导出PDF/Excel/Word、进行图片或者文字处理等场景。但是如果使用它高频、大数据......