Lua 简易table池

目的

为了避免经常申请分配table表,实现个table池,方便复用。

实现

---@class tablePool @表池,避免经常分配
tablePool = {}
local tbPool = {}

---空表
tablePool.EmptyTable = {}

---Get 获取表
---@generic T
---@param tag string
---@param create T @table|function
---@return T
function tablePool.Get(tag, create)
    local pool = tbPool[tag]
    if not pool then
        pool = {}
        pool.get = create
        pool.func = type(create) ~= 'table'
        pool.len = 0
        tbPool[tag] = pool
    end

    local len = pool.len
    if len > 0 then
        pool.len = len - 1
        return pool[len]
    end

    if pool.func then
        return pool.get()
    else
        return clone(pool.get)
    end
end

---Release 释放表,会自动调用其Clear方法
---@param tag string
---@param obj table
function tablePool.Release(tag, obj)
    if not obj then
        return
    end
    local pool = tbPool[tag]
    if not pool then
        return
    end

    local len = pool.len + 1
    pool.len = len
    pool[len] = obj

    if obj.Clear then
        obj:Clear()
    end
end

---ArrayClear 数组的清除,数组里简单数据类型,非table池申请
function tablePool.ArrayClear(list)
    local count = #list
    for i = 1, count do
        list[i] = nil
    end
end

---ArrayRelease 数组的清除,数组里是table池申请的子表
function tablePool.ArrayRelease(tag, list)
    local count = #list
    for i = 1, count do
        tablePool.Release(tag, list[i])
        list[i] = nil
    end
end

---DictionaryRelease 字典的清除,字典里是table池申请的子表
function tablePool.DictionaryRelease(tag, list)
    for k, v in pairs(list) do
        tablePool.Release(tag, v)
        list[k] = nil
    end
end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值