+
+NodeReorderer::NodeReorderer():
+ reorder_before(0),
+ to_reorder(0)
+{ }
+
+void NodeReorderer::apply(Stage &stage, Node &before, const set<Node *> &tr)
+{
+ reorder_before = &before;
+ to_reorder = &tr;
+ stage.content.visit(*this);
+}
+
+void NodeReorderer::visit(Block &block)
+{
+ auto insert_point = block.body.end();
+ for(auto i=block.body.begin(); i!=block.body.end(); )
+ {
+ (*i)->visit(*this);
+ if(insert_point!=block.body.end() && to_reorder->count(i->get()))
+ block.body.splice(insert_point, block.body, i++);
+ else
+ {
+ if(i->get()==reorder_before)
+ insert_point = i;
+ ++i;
+ }
+ }
+}
+