Moved tolua++
This commit is contained in:
82
lib/tolua++/src/bin/lua/template_class.lua
Normal file
82
lib/tolua++/src/bin/lua/template_class.lua
Normal file
@@ -0,0 +1,82 @@
|
||||
|
||||
_global_templates = {}
|
||||
|
||||
classTemplateClass = {
|
||||
|
||||
name = '',
|
||||
body = '',
|
||||
parents = {},
|
||||
args = {}, -- the template arguments
|
||||
}
|
||||
|
||||
classTemplateClass.__index = classTemplateClass
|
||||
|
||||
|
||||
function classTemplateClass:throw(types, local_scope)
|
||||
|
||||
--if table.getn(types) ~= table.getn(self.args) then
|
||||
-- error("#invalid parameter count")
|
||||
--end
|
||||
|
||||
-- replace
|
||||
for i =1 , types.n do
|
||||
|
||||
local Il = split_c_tokens(types[i], " ")
|
||||
if table.getn(Il) ~= table.getn(self.args) then
|
||||
error("#invalid parameter count for "..types[i])
|
||||
end
|
||||
local bI = self.body
|
||||
local pI = {}
|
||||
for j = 1,self.args.n do
|
||||
--Tl[j] = findtype(Tl[j]) or Tl[j]
|
||||
bI = string.gsub(bI, "([^_%w])"..self.args[j].."([^_%w])", "%1"..Il[j].."%2")
|
||||
if self.parents then
|
||||
for i=1,table.getn(self.parents) do
|
||||
pI[i] = string.gsub(self.parents[i], "([^_%w]?)"..self.args[j].."([^_%w]?)", "%1"..Il[j].."%2")
|
||||
end
|
||||
end
|
||||
end
|
||||
--local append = "<"..string.gsub(types[i], "%s+", ",")..">"
|
||||
local append = "<"..concat(Il, 1, table.getn(Il), ",")..">"
|
||||
append = string.gsub(append, "%s*,%s*", ",")
|
||||
append = string.gsub(append, ">>", "> >")
|
||||
for i=1,table.getn(pI) do
|
||||
--pI[i] = string.gsub(pI[i], ">>", "> >")
|
||||
pI[i] = resolve_template_types(pI[i])
|
||||
end
|
||||
bI = string.gsub(bI, ">>", "> >")
|
||||
local n = self.name
|
||||
if local_scope then
|
||||
n = self.local_name
|
||||
end
|
||||
|
||||
Class(n..append, pI, bI)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function TemplateClass(name, parents, body, parameters)
|
||||
|
||||
local o = {
|
||||
|
||||
parents = parents,
|
||||
body = body,
|
||||
args = parameters,
|
||||
}
|
||||
|
||||
local oname = string.gsub(name, "@.*$", "")
|
||||
oname = getnamespace(classContainer.curr)..oname
|
||||
o.name = oname
|
||||
|
||||
o.local_name = name
|
||||
|
||||
setmetatable(o, classTemplateClass)
|
||||
|
||||
if _global_templates[oname] then
|
||||
warning("Duplicate declaration of template "..oname)
|
||||
else
|
||||
_global_templates[oname] = o
|
||||
end
|
||||
|
||||
return o
|
||||
end
|
||||
Reference in New Issue
Block a user