summaryrefslogtreecommitdiff
path: root/generator.py
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-05-07 16:59:50 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-05-07 16:59:50 (GMT)
commit51b17badf4c72270bb762ea795d05d51c8b355e3 (patch)
treeb66671e0496b68114c6e91eedb58bf783d5343c0 /generator.py
parentfb111f42d00dd8a2041bae970c0913e096ac5101 (diff)
downloadpowder-51b17badf4c72270bb762ea795d05d51c8b355e3.zip
powder-51b17badf4c72270bb762ea795d05d51c8b355e3.tar.gz
A bit of refactoring (elements)
Diffstat (limited to 'generator.py')
-rw-r--r--generator.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/generator.py b/generator.py
new file mode 100644
index 0000000..dc97594
--- /dev/null
+++ b/generator.py
@@ -0,0 +1,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() \ No newline at end of file