}
-StageVisitor::StageVisitor():
- stage(0)
-{ }
-
-void StageVisitor::apply(Stage &s)
-{
- SetForScope<Stage *> set(stage, &s);
- stage->content.visit(*this);
-}
-
-
BlockModifier::BlockModifier():
remove_node(false)
{ }
}
-NodeRemover::NodeRemover(const set<Node *> &r):
- to_remove(r)
+NodeRemover::NodeRemover():
+ stage(0),
+ to_remove(0)
{ }
+void NodeRemover::apply(Stage &s, const set<Node *> &tr)
+{
+ stage = &s;
+ to_remove = &tr;
+ visit(s.content);
+}
+
void NodeRemover::visit(Block &block)
{
for(NodeList<Statement>::iterator i=block.body.begin(); i!=block.body.end(); )
{
(*i)->visit(*this);
- if(to_remove.count(i->get()))
+ if(to_remove->count(i->get()))
block.body.erase(i++);
else
++i;
void NodeRemover::visit(VariableDeclaration &var)
{
- if(to_remove.count(&var))
+ if(to_remove->count(&var))
{
stage->in_variables.erase(var.name);
stage->out_variables.erase(var.name);
if(var.linked_declaration)
var.linked_declaration->linked_declaration = 0;
}
- else if(var.init_expression && to_remove.count(var.init_expression.get()))
+ else if(var.init_expression && to_remove->count(var.init_expression.get()))
var.init_expression = 0;
}
void NodeRemover::visit(Iteration &iter)
{
- if(to_remove.count(iter.init_statement.get()))
+ if(to_remove->count(iter.init_statement.get()))
iter.init_statement = 0;
TraversingVisitor::visit(iter);
}