sk_server/luafight/Modules/Battle/Logic/Misc/BattleObjectPool.lua

82 lines
1.9 KiB
Lua

BattleObjectPool = {}
function BattleObjectPool.New(onCreate)
local o = {}
setmetatable(o, BattleObjectPool)
BattleObjectPool.__index = BattleObjectPool
o.buffer = {}
o.size = 0
o.onCreate = onCreate
return o
end
function BattleObjectPool:Get(...)
local e = self.buffer[self.size]
if not e then
return self.onCreate(...)
end
self.size = self.size - 1
return e
end
function BattleObjectPool:Put(item)
self.size = self.size + 1
self.buffer[self.size] = item
end
function BattleObjectPool:Foreach(func)
if self.size<=0 then return end
for i=1,self.size do
if func then
func(self.buffer[i])
end
end
end
function BattleObjectPool:Find(obj,ICompare)
if self.size<=0 then return end
for i=1,self.size do
if ICompare ~=nil then
if ICompare(obj,self.buffer[i]) then
return self.buffer[i]
end
end
end
--LogError("f role:"..obj.roleId)
return nil
end
function BattleObjectPool:Count()
return self.size
end
--浅克隆
function BattleObjectPool:Clone()
local _battlePool =BattleObjectPool.New(self.onCreate)
if self.size<=0 then return _battlePool end
for i , v in pairs(self.buffer) do
_battlePool:Put(self.buffer[i]) -- table
end
return _battlePool
end
--浅克隆
function BattleObjectPool:CloneType(str)
local _battlePool =BattleObjectPool.New(self.onCreate)
if self.size<=0 then return _battlePool end
if str == "RoleLogic" then
for i , v in pairs(self.buffer) do
local _role = self.buffer[i]
--LogError(type(_role))
_battlePool:Put(_role:Clone()) -- table
end
else
for i , v in pairs(self.buffer) do
--LogError(type(self.buffer[i]))
_battlePool:Put(self.buffer[i]) -- table
end
end
return _battlePool
end