1 #include "cyclegraph.h"
3 CycleGraph::CycleGraph() {
7 CycleNode * CycleGraph::getNode(ModelAction * action) {
8 CycleNode *node=actionToNode.get(action);
10 node=new CycleNode(action);
11 actionToNode.put(action, node);
16 void CycleGraph::addEdge(ModelAction *from, ModelAction *to) {
17 CycleNode *fromnode=getNode(from);
18 CycleNode *tonode=getNode(to);
21 hasCycles=checkReachable(fromnode, tonode);
23 fromnode->addEdge(tonode);
26 bool CycleGraph::checkReachable(CycleNode *from, CycleNode *to) {
27 std::vector<class CycleNode *> queue;
28 HashTable<class CycleNode *, class CycleNode *, uintptr_t, 4> discovered;
30 queue.push_back(from);
31 discovered.put(from, from);
32 while(!queue.empty()) {
33 class CycleNode * node=queue.back();
38 for(unsigned int i=0;i<node->getEdges()->size();i++) {
39 CycleNode *next=(*node->getEdges())[i];
40 if (!discovered.contains(next)) {
41 discovered.put(next,next);
42 queue.push_back(next);
49 CycleNode::CycleNode(ModelAction *modelaction) {
53 std::vector<class CycleNode *> * CycleNode::getEdges() {
57 void CycleNode::addEdge(CycleNode * node) {
58 edges.push_back(node);