edits
[satune.git] / src / ASTAnalyses / Order / ordergraph.h
1 /*
2  * File:   ordergraph.h
3  * Author: hamed
4  *
5  * Created on August 7, 2017, 3:42 PM
6  */
7
8 #ifndef ORDERGRAPH_H
9 #define ORDERGRAPH_H
10 #include "classlist.h"
11 #include "structs.h"
12 #include "mymemory.h"
13
14 class OrderGraph {
15 public:
16         OrderGraph(Order *order);
17         ~OrderGraph();
18         void addOrderConstraintToOrderGraph(BooleanOrder *bOrder);
19         void addMustOrderConstraintToOrderGraph(BooleanOrder *bOrder);
20         OrderNode *getOrderNodeFromOrderGraph(uint64_t id);
21         OrderEdge *getOrderEdgeFromOrderGraph(OrderNode *begin, OrderNode *end);
22         OrderNode *lookupOrderNodeFromOrderGraph(uint64_t id);
23         OrderEdge *lookupOrderEdgeFromOrderGraph(OrderNode *begin, OrderNode *end);
24         void addOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *constr);
25         void addMustOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *constr);
26         OrderEdge *getInverseOrderEdge(OrderEdge *edge);
27         Order *getOrder() {return order;}
28         bool isTherePath(OrderNode *source, OrderNode *destination);
29         bool isTherePathVisit(HashsetOrderNode &visited, OrderNode *current, OrderNode *destination);
30         SetIteratorOrderNode *getNodes() {return nodes.iterator();}
31         SetIteratorOrderEdge *getEdges() {return edges.iterator();}
32         void DFS(Vector<OrderNode *> *finishNodes);
33         void DFSMust(Vector<OrderNode *> *finishNodes);
34         void computeStronglyConnectedComponentGraph();
35         void resetNodeInfoStatusSCC();
36         void completePartialOrderGraph();
37         void removeNode(OrderNode *node) {nodes.remove(node);}
38         
39         CMEMALLOC;
40 private:
41         HashsetOrderNode nodes;
42         Vector<OrderNode *> allNodes;
43         HashsetOrderEdge edges;
44         Order *order;
45         void DFSNodeVisit(OrderNode *node, Vector<OrderNode *> *finishNodes, bool isReverse, bool mustvisit, uint sccNum);
46         void DFSReverse(Vector<OrderNode *> *finishNodes);
47 };
48
49 OrderGraph *buildOrderGraph(Order *order);
50 OrderGraph *buildMustOrderGraph(Order *order);
51 #endif/* ORDERGRAPH_H */
52