#include "common/LGraph-cdt.h"
#include "common/StrAttr.h"
using namespace std;
struct Collapsing {
StrGraph *subg;
NamedAttrs nodeInfo;
};
typedef vector<Collapsing> Collapsings;
void collapse(StrGraph *start,const Collapsings colls,StrGraph *out) {
vector<StrGraph::Node*> collapsed;
Collapsings::const_iterator ci;
for(ci = colls.begin(); ci!=colls.end(); ++ci)
collapsed[ci-colls.begin()] = out->create_node(ci->nodeInfo);
map<StrGraph::Node*,StrGraph::Node*> replace;
for(StrGraph::node_iter ni = start->nodes().begin(); ni!=start->nodes().end(); ++ni) {
for(ci = colls.begin(); ci!=colls.end(); ++ci)
if(ci->subg->find(*ni)) { replace[*ni] = collapsed[ci-colls.begin()];
break;
}
if(ci==colls.end()) replace[*ni] = out->create_node(gd<NamedAttrs>(*ni));
}
for(StrGraph::graphedge_iter ei = start->edges().begin(); ei!=start->edges().end(); ++ei) {
for(ci = colls.begin(); ci!=colls.end(); ++ci)
if(ci->subg->find(*ei))
break;
if(ci!=colls.end()) continue;
out->create_edge(replace[(*ei)->tail],replace[(*ei)->head],gd<NamedAttrs>(*ei));
}
}