------------------------------------------------
--作者: gzg
--日期: 2021-02-20
--文件: Queue.lua
--模块: Queue
--描述: 队列,执行先进先出的原则
------------------------------------------------
local Queue = {}
Queue.__index = Queue

--创建一个新的Queue。obj 可 nil, isNotCopy 默认深度拷贝
function Queue:New(obj, isNotCopy)
    local _Queue = nil
    if obj ~= nil then
        if type(obj) =="table" then
            _Queue = isNotCopy and obj or Utils.DeepCopy(obj)
        else
            _Queue = {first = 0, last = -1}
            for i = 0, obj.Count - 1 do
                table.insert(_Queue, obj[i])
            end
        end
    else
        _Queue = {first = 0, last = -1}
    end
    setmetatable(_Queue, Queue)
    return _Queue
end


--往队列尾部增加一个数据
function Queue:Enqueue(item)
    local _last = self.last + 1;
    self.last = _last;
    self[_last] = item;
end

--返回一个队列头部的数据,并删除之
function Queue:Dequeue()
    local _first = self.first
    if _first > self.last then
        error("List is empty")
    end
    local value = self[_first]
    self[_first] = nil
    self.first = _first + 1
    return value
end

--返回一个队列头部的数据
function Queue:Peek()
    local _first = self.first
    if _first > self.last then
        error("List is empty")
    end
    return self[_first];
end

--清除所有队列所有内容
function Queue:Clear()
    local _count = #self;
    for i=_count, 1, -1 do
        table.remove(self)
    end
    self.first = 0;
    self.last = -1;
end

--item的数量
function Queue:Count()
    return self.last - self.first + 1;
end

-- eg: UIUtils.CSFormat("{0}{1}",_Queue:Unpack())
function Queue:Unpack()
    return table.unpack(self);
end

return Queue