1
2_global_templates = {}
3
4classTemplateClass = {
5
6	name = '',
7	body = '',
8	parents = {},
9	args = {}, -- the template arguments
10}
11
12classTemplateClass.__index = classTemplateClass
13
14
15function classTemplateClass:throw(types, local_scope)
16
17	--if table.getn(types) ~= table.getn(self.args) then
18	--	error("#invalid parameter count")
19	--end
20
21	-- replace
22	for i =1 , types.n do
23
24		local Il = split_c_tokens(types[i], " ")
25		if #Il ~= #self.args then
26			error("#invalid parameter count for "..types[i])
27		end
28		local bI = self.body
29		local pI = {}
30		for j = 1,self.args.n do
31			--Tl[j] = findtype(Tl[j]) or Tl[j]
32			bI = string.gsub(bI, "([^_%w])"..self.args[j].."([^_%w])", "%1"..Il[j].."%2")
33			if self.parents then
34				for i=1,#self.parents do
35					pI[i] = string.gsub(self.parents[i], "([^_%w]?)"..self.args[j].."([^_%w]?)", "%1"..Il[j].."%2")
36				end
37			end
38		end
39		--local append = "<"..string.gsub(types[i], "%s+", ",")..">"
40		local append = "<"..concat(Il, 1, #Il, ",")..">"
41		append = string.gsub(append, "%s*,%s*", ",")
42		append = string.gsub(append, ">>", "> >")
43		for i=1,#pI do
44			--pI[i] = string.gsub(pI[i], ">>", "> >")
45			pI[i] = resolve_template_types(pI[i])
46		end
47		bI = string.gsub(bI, ">>", "> >")
48		local n = self.name
49		if local_scope then
50			n = self.local_name
51		end
52
53		Class(n..append, pI, bI)
54	end
55end
56
57
58function TemplateClass(name, parents, body, parameters)
59
60	local o = {
61
62		parents = parents,
63		body = body,
64		args = parameters,
65	}
66
67	local oname = string.gsub(name, "@.*$", "")
68	oname = getnamespace(classContainer.curr)..oname
69	o.name = oname
70
71	o.local_name = name
72
73	setmetatable(o, classTemplateClass)
74
75	if _global_templates[oname] then
76		warning("Duplicate declaration of template "..oname)
77	else
78		_global_templates[oname] = o
79	end
80
81	return o
82end
83