summaryrefslogtreecommitdiff
path: root/generator.py
blob: dc975949b82515b3e40a7eb18cb26cb5ab82eb40 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import re, os, shutil, string

if os.path.isdir("generated/"):
	shutil.rmtree("generated/")
os.mkdir("generated")

elementClasses = dict()

elementHeader = """#ifndef ELEMENTCLASSES_H
#define ELEMENTCLASSES_H
#include <vector>
#include "simulation/Element.h"
#include "simulation/elements/Element.h"
"""

directives = []

elementFiles = os.listdir("src/simulation/Elements")
for elementFile in elementFiles:
	f = open("src/simulation/Elements/"+elementFile, "r")
	fileData = f.read()
	f.close()

	directiveMatcher = '//#TPT-Directive\s+([^\r\n]+)'
	matcher = re.compile(directiveMatcher)
	directiveMatches = matcher.findall(fileData)

	for match in directiveMatches:
		directives.append(match.split(" "))

classDirectives = []
for d in directives:
	if d[0] == "ElementClass":
		elementClasses[d[1]] = []
		elementHeader += "#define %s %s\n" % (d[2], d[3])
		d[3] = string.atoi(d[3])
		classDirectives.append(d)
	
for d in directives:
	if d[0] == "ElementHeader":
		elementClasses[d[1]].append(string.join(d[2:], " ")+";")

for className, classMembers in elementClasses.items():
	elementHeader += """class {0}: public Element
{{
	public:
		{0}();
		virtual ~{0}();
		{1}
}};
""".format(className, string.join(classMembers, "\n"))

elementHeader += """std::vector<Element> GetElements();
#endif
"""

elementContent = """#include "ElementClasses.h"
std::vector<Element> GetElements()
{
	std::vector<Element> elements;
""";

elementIDs = sorted(classDirectives, key=lambda directive: directive[3])
for d in elementIDs:
	elementContent += """	elements.push_back(%s());
""" % (d[1])

elementContent += """	return elements;
}
""";

f = open("generated/ElementClasses.h", "w")
f.write(elementHeader)
f.close()

f = open("generated/ElementClasses.cpp", "w")
f.write(elementContent)
f.close()