Start of Lua-based collection implementation

* Will eventually replace the entire Collection userdata with full backwards compatibility
 * See fortressforever/fortressforever#91
This commit is contained in:
squeek 2015-03-23 04:13:56 -07:00
parent 4dac32dcf9
commit 171376e24c
2 changed files with 120 additions and 0 deletions

View file

@ -8,6 +8,7 @@
-----------------------------------------------------------------------------
Class = require "util.class"
Collection = require "util.collection"
-----------------------------------------------------------------------------
-- defines

View file

@ -0,0 +1,119 @@
-- backwards compatibility for the Collection class
local Class = require "util.class"
local function setup_items_key(self)
-- keep a usable reference to the base metatable
local real_obj = setmetatable({}, getmetatable(self))
-- add special handling of the items key
setmetatable(self, {
-- the items key returns an iterator
__index = function(t, k)
if k == "items" then
local i = 0
local n = self:Count()
return function()
i = i + 1
if i <= n then return self.entities[i] end
end
end
return real_obj[k]
end,
-- protect the items key from being assigned
__newindex = function(t, k, v)
if k == "items" then
return
end
real_obj[k] = v
end
})
end
local Collection = Class(function(self)
setup_items_key(self)
self.entities = {}
end)
local function get_param_as_table(param)
if param == nil then return {} end
if type(param) == "table" then return param end
return {param}
end
-- lua tables start at index 1
local function to_lua_index(collection_index)
return collection_index+1
end
-- Collection started at index 0
local function to_collection_index(lua_index)
return lua_index-1
end
function Collection:AddItem(entity_or_entities)
local entities_to_add = get_param_as_table(entity_or_entities)
for i,entity_to_add in ipairs(entities_to_add) do
table.insert(self.entities, entity_to_add)
end
end
function Collection:RemoveItem(entity_or_entities)
local entities_to_find = get_param_as_table(entity_or_entities)
for i,entity_to_find in ipairs(entities_to_find) do
local i = self:FindItemIndex(entity_to_find)
if i then
table.remove(self.entities, to_lua_index(i))
end
end
end
function Collection:RemoveAllItems()
for k in ipairs(self.entities) do
self.entities[k] = nil
end
end
function Collection:Count()
return #self.entities
end
function Collection:HasItem(entity_or_entities)
local entities_to_find = get_param_as_table(entity_or_entities)
for i,entity_to_find in ipairs(entities_to_find) do
if self:FindItemIndex(entity_to_find) then
return true
end
end
return false
end
-- this is a strange function
function Collection:GetItem(entity_or_entities)
local entities_to_find = get_param_as_table(entity_or_entities)
for i,entity_to_find in ipairs(entities_to_find) do
local i = self:FindItemIndex(entity_to_find)
if i then
return self:Element(i)
end
end
end
function Collection:FindItemIndex(entity_to_find)
for i,entity in ipairs(self.entities) do
if entity:GetId() == entity_to_find:GetId() then
return to_collection_index(i)
end
end
return nil
end
function Collection:Element(i)
return self.entities[to_lua_index(i)]
end
return Collection