static void invert_find_roots(const NodeVect &Nodes, NodeChildrenMap &NCM, NodeVect &Roots) { typedef NodeVect::const_iterator const_iterator; for (const_iterator I = Nodes.begin(), E = Nodes.end(); I != E; ++I) { GepNode *N = *I; if (N->Flags & GepNode::Root) { Roots.push_back(N); continue; } GepNode *PN = N->Parent; NCM[PN].push_back(N); } }
static void nodes_for_root(GepNode *Root, NodeChildrenMap &NCM, NodeSet &Nodes) { NodeVect Work; Work.push_back(Root); Nodes.insert(Root); while (!Work.empty()) { NodeVect::iterator First = Work.begin(); GepNode *N = *First; Work.erase(First); NodeChildrenMap::iterator CF = NCM.find(N); if (CF != NCM.end()) { Work.insert(Work.end(), CF->second.begin(), CF->second.end()); Nodes.insert(CF->second.begin(), CF->second.end()); } } }