diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2012-08-24 11:52:17 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2012-08-24 11:52:17 (GMT) |
| commit | 7ead5edd5f2f6ed8e3b62adcc25d897ddba5fb3c (patch) | |
| tree | 6e26fa4d0a82f8efbf6b1726ed1553972e09c317 | |
| parent | a28121b166d510b7b4153998154bafc26b7285ac (diff) | |
| download | powder-7ead5edd5f2f6ed8e3b62adcc25d897ddba5fb3c.zip powder-7ead5edd5f2f6ed8e3b62adcc25d897ddba5fb3c.tar.gz | |
Update generator to support derived element classes (In the form of Element_TWO:Element_ONE where Element_TWO derives from Element_ONE)
| -rw-r--r-- | generator.py | 112 |
1 files changed, 83 insertions, 29 deletions
diff --git a/generator.py b/generator.py index fa211fb..16407b4 100644 --- a/generator.py +++ b/generator.py @@ -3,13 +3,17 @@ import re, os, shutil, string, sys def generateElements(elementFiles, outputCpp, outputH): elementClasses = dict() + baseClasses = dict() elementHeader = """#ifndef ELEMENTCLASSES_H - #define ELEMENTCLASSES_H - #include <vector> - #include "simulation/Element.h" - #include "simulation/elements/Element.h" - """ +#define ELEMENTCLASSES_H + +#include <vector> + +#include "simulation/Element.h" +#include "simulation/elements/Element.h" + +""" directives = [] @@ -28,42 +32,92 @@ def generateElements(elementFiles, outputCpp, outputH): 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")) + elementIDs = sorted(classDirectives, key=lambda directive: directive[3]) - elementHeader += """std::vector<Element> GetElements(); - #endif + for d in elementIDs: + tmpClass = d[1] + newClass = "" + baseClass = "Element" + if ':' in tmpClass: + classBits = tmpClass.split(':') + newClass = classBits[0] + baseClass = classBits[1] + else: + newClass = tmpClass + + elementClasses[newClass] = [] + baseClasses[newClass] = baseClass + elementHeader += "#define %s %s\n" % (d[2], d[3]) + + for d in directives: + if d[0] == "ElementHeader": + tmpClass = d[1] + newClass = "" + baseClass = "Element" + if ':' in tmpClass: + classBits = tmpClass.split(':') + newClass = classBits[0] + baseClass = classBits[1] + else: + newClass = tmpClass + elementClasses[newClass].append(string.join(d[2:], " ")+";") + + #for className, classMembers in elementClasses.items(): + for d in elementIDs: + tmpClass = d[1] + newClass = "" + baseClass = "Element" + if ':' in tmpClass: + classBits = tmpClass.split(':') + newClass = classBits[0] + baseClass = classBits[1] + else: + newClass = tmpClass + + className = newClass + classMembers = elementClasses[newClass] + elementBase = baseClass + elementHeader += """ +class {0}: public {1} +{{ +public: + {0}(); + virtual ~{0}(); + {2} +}}; + """.format(className, elementBase, string.join(classMembers, "\n\t")) + + elementHeader += """ +std::vector<Element> GetElements(); + +#endif """ elementContent = """#include "ElementClasses.h" - std::vector<Element> GetElements() - { - std::vector<Element> elements; + +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]) + tmpClass = d[1] + newClass = "" + baseClass = "Element" + if ':' in tmpClass: + classBits = tmpClass.split(':') + newClass = classBits[0] + baseClass = classBits[1] + else: + newClass = tmpClass + elementContent += """elements.push_back(%s()); + """ % (newClass) elementContent += """ return elements; - } +} """; f = open(outputH, "w") |
