You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.5 KiB
Lua
110 lines
2.5 KiB
Lua
local setmetatable = setmetatable
|
|
|
|
local DoubleQueue = {}
|
|
|
|
-- Class attributes and methods goes on this table --
|
|
local DoubleQueueObject = {}
|
|
|
|
-- Metamethods goes on this table --
|
|
local DoubleQueueObject_mt = {
|
|
__index = DoubleQueueObject,
|
|
}
|
|
|
|
-- Module exported functions --
|
|
|
|
---
|
|
-- Creates a new double queue.
|
|
function DoubleQueue.new()
|
|
local object = setmetatable({}, DoubleQueueObject_mt)
|
|
|
|
-- create all the instance state data.
|
|
object.data = {}
|
|
object.data_position = {}
|
|
object.first = 1
|
|
object.last = 0
|
|
return object
|
|
end
|
|
|
|
-- Private methods --
|
|
local function refresh_first(self)
|
|
while (self.first <= self.last) do
|
|
if (self.data[self.first]) then
|
|
return true
|
|
end
|
|
self.first = self.first + 1
|
|
end
|
|
end
|
|
|
|
-- Public methods --
|
|
|
|
---
|
|
-- Check if the queue is empty
|
|
-- @return true if it is empty, false otherwise.
|
|
function DoubleQueueObject:is_empty()
|
|
return self.first > self.last
|
|
end
|
|
|
|
---
|
|
-- Pushes data on the front of the queue.
|
|
-- @param data The data thas is being pushed.
|
|
function DoubleQueueObject:push_front(data)
|
|
if (self.data_position[data]) then
|
|
return
|
|
end
|
|
self.first = self.first - 1
|
|
self.data[self.first] = data
|
|
self.data_position[data] = self.first
|
|
end
|
|
|
|
---
|
|
-- Pushes data on the back of the queue.
|
|
-- @param data The data thas is being pushed.
|
|
function DoubleQueueObject:push_back(data)
|
|
if (self.data_position[data]) then
|
|
return
|
|
end
|
|
self.last = self.last + 1
|
|
self.data[self.last] = data
|
|
self.data_position[data] = self.last
|
|
end
|
|
|
|
---
|
|
-- Get the queue iterator.
|
|
-- Each call to the iterator function returns the next element.
|
|
-- Example:
|
|
--
|
|
-- for data in queue:get_iterator() do
|
|
-- print("mydata: "..tostring(data))
|
|
-- end
|
|
--
|
|
-- @return An iterator function.
|
|
function DoubleQueueObject:get_iterator()
|
|
local first = self.first
|
|
local function iterator()
|
|
while (first <= self.last) do
|
|
local data = self.data[first]
|
|
first = first + 1
|
|
if (data) then
|
|
return data
|
|
end
|
|
end
|
|
end
|
|
return iterator
|
|
end
|
|
|
|
---
|
|
-- Removes the first ocurrence of data from the queue.
|
|
-- If the data cant be found on the queue, nothing happens.
|
|
-- @param data The data that is going the be removed.
|
|
function DoubleQueueObject:remove(data)
|
|
if (not self.data_position[data]) then
|
|
return
|
|
end
|
|
self.data[self.data_position[data]] = nil
|
|
self.data_position[data] = nil
|
|
refresh_first(self)
|
|
end
|
|
|
|
return DoubleQueue
|
|
|