summaryrefslogtreecommitdiffstats
path: root/lib/tolua++/src/bin/lua/template_class.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lib/tolua++/src/bin/lua/template_class.lua')
-rw-r--r--lib/tolua++/src/bin/lua/template_class.lua82
1 files changed, 82 insertions, 0 deletions
diff --git a/lib/tolua++/src/bin/lua/template_class.lua b/lib/tolua++/src/bin/lua/template_class.lua
new file mode 100644
index 000000000..b1ed05abe
--- /dev/null
+++ b/lib/tolua++/src/bin/lua/template_class.lua
@@ -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