sk-client/Assets/ManagedResources/~Lua/Modules/Battle/Logic/Misc/BattleQueue.lua

138 lines
3.0 KiB
Lua

BattleQueue = {}
function BattleQueue.New()
local o = {}
setmetatable(o, BattleQueue)
BattleQueue.__index = BattleQueue
o.head = -1
o.rear = -1
o.list = {}
o.size = 0
return o
end
function BattleQueue:Enqueue(e)
if self.size == 0 then
self.head = 0
self.rear = 1
self.size = 1
self.list[self.rear] = e
else
self.rear = self.rear + 1
self.list[self.rear] = e
self.size = self.size + 1
end
end
function BattleQueue:Dequeue()
if self.size == 0 then
error("lua queue is isEmpty")
return nil
end
self.size = self.size - 1
self.head = self.head + 1
return self.list[self.head]
end
function BattleQueue:Clear()
--self.list = {}
self.size = 0
self.head = -1
self.rear = -1
end
function BattleQueue:Count()
return self.size
end
function BattleQueue:Foreach(func)
for i = self.head + 1, self.rear do
if func then
func(self.list[i])
end
end
end
function BattleQueue:Contain(e)
for i = self.head + 1, self.rear do
if e == self.list[i] then
return true
end
end
return false
end
--浅克隆
function BattleQueue:Clone()
local _quen = BattleQueue.New()
for i = self.head + 1, self.rear do
_quen:Enqueue(self.list[i])
end
return _quen
end
--删除index元素
function BattleQueue:Delete(index)
if index > self.size then return nil end
local obj = self.list[index]
-- 队尾移动
for i = index, self.rear do
self.list[i] = self.list[i+1]
end
self.size = self.size - 1
self.rear = self.rear - 1
return obj
end
--删除对象元素
function BattleQueue:DeleteObj(obj)
local searchfunc = function(_obj)
return obj == _obj
end
local index = self:SearchIndex(searchfunc)
if index < 0 then return nil end
return self:Delete(index)
end
--删除对象元素
function BattleQueue:DeleteObjBy(obj,Icompare)
local searchfunc = function(_obj)
return Icompare(obj,_obj)
end
local index = self:SearchIndex(searchfunc)
if index < 0 then return nil end
return self:Delete(index)
end
function BattleQueue:DeleteFunc(func)
local IsNul = false
while not IsNul do
local index = self:SearchIndex(func)
if index < 0 then
IsNul = true
else
self:Delete(index)
end
end
end
-- 查找Icompare元素 返回下标
function BattleQueue:SearchIndex(Icompare)
if self.size < 0 then return -1 end
for i = self.head + 1, self.rear do
if Icompare and Icompare(self.list[i]) then
return i
end
end
return -1
end
-- 查找Icompare元素 返回对象
function BattleQueue:SearchObject(Icompare)
if self.size < 0 then return nil end
for i = self.head + 1, self.rear do
if Icompare and Icompare(self.list[i]) then
return self.list[i]
end
end
return nil
end