openscad/src/traverser.cc

45 lines
1.1 KiB
C++
Raw Normal View History

#include "traverser.h"
#include "visitor.h"
#include "node.h"
#include "state.h"
2011-08-04 06:58:17 +04:00
#include <algorithm>
void Traverser::execute()
{
State state(NULL);
traverse(this->root, state);
}
2011-08-04 06:58:17 +04:00
struct TraverseNode
{
Traverser *traverser;
const State &state;
TraverseNode(Traverser *traverser, const State &state) :
traverser(traverser), state(state) {}
void operator()(const AbstractNode *node) { traverser->traverse(*node, state); }
};
void Traverser::traverse(const AbstractNode &node, const State &state)
{
// 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);
2011-08-04 06:58:17 +04:00
std::for_each(node.getChildren().begin(), node.getChildren().end(), TraverseNode(this, newstate));
if (traversaltype == POSTFIX || traversaltype == PRE_AND_POSTFIX) {
newstate.setParent(state.parent());
newstate.setPrefix(false);
newstate.setPostfix(true);
node.accept(newstate, this->visitor);
}
}