summaryrefslogtreecommitdiff
path: root/src/traverser.cc
diff options
context:
space:
mode:
authorkintel <kintel@b57f626f-c46c-0410-a088-ec61d464b74c>2010-10-31 01:19:06 (GMT)
committerkintel <kintel@b57f626f-c46c-0410-a088-ec61d464b74c>2010-10-31 01:19:06 (GMT)
commit53337ff65426ff1ebd87160b502ec383d201ac7b (patch)
treefbcb75d32e8763aac3f0ad28528936a0ec11930b /src/traverser.cc
parent746159d1838e895e80725cdc892f7bef85feb1af (diff)
Committed current version of visitor refactoring
git-svn-id: http://svn.clifford.at/openscad/trunk@571 b57f626f-c46c-0410-a088-ec61d464b74c
Diffstat (limited to 'src/traverser.cc')
-rw-r--r--src/traverser.cc40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/traverser.cc b/src/traverser.cc
new file mode 100644
index 0000000..af29132
--- /dev/null
+++ b/src/traverser.cc
@@ -0,0 +1,40 @@
+#include "traverser.h"
+#include "visitor.h"
+#include "node.h"
+#include "state.h"
+
+void Traverser::execute()
+{
+ State state(NULL);
+ traverse(state, this->root);
+}
+
+void Traverser::traverse(const State &state, const AbstractNode &node)
+{
+ // FIXME: Handle abort
+
+ State newstate = state;
+ newstate.setNumChildren(node.getChildren().size());
+
+ if (traversaltype == PREFIX || traversaltype == PRE_AND_POSTFIX) {
+ newstate.setPrefix(true);
+ newstate.setParent(state.parent());
+ node.accept(newstate, this->visitor);
+ }
+
+ newstate.setParent(&node);
+ const std::list<AbstractNode*> &children = node.getChildren();
+ for (std::list<AbstractNode*>::const_iterator iter = children.begin();
+ iter != children.end();
+ iter++) {
+
+ traverse(newstate, **iter);
+ }
+
+ if (traversaltype == POSTFIX || traversaltype == PRE_AND_POSTFIX) {
+ newstate.setParent(state.parent());
+ newstate.setPrefix(false);
+ newstate.setPostfix(true);
+ node.accept(newstate, this->visitor);
+ }
+}
contact: Jan Huwald // Impressum