More EncodingGraph work
[satune.git] / src / ASTAnalyses / Encoding / encodinggraph.h
1 #ifndef ENCODINGGRAPH_H
2 #define ENCODINGGRAPH_H
3 #include "classlist.h"
4 #include "structs.h"
5
6 uint hashEncodingEdge(EncodingEdge *edge);
7 bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
8 class EncodingSubGraph;
9
10
11 typedef Hashtable<EncodingEdge *, EncodingEdge *, uintptr_t, PTRSHIFT, hashEncodingEdge, equalsEncodingEdge> HashtableEdge;
12 typedef Hashset<EncodingNode *, uintptr_t, PTRSHIFT> HashsetEncodingNode;
13 typedef SetIterator<EncodingNode *, uintptr_t, PTRSHIFT> SetIteratorEncodingNode;
14 typedef Hashtable<EncodingNode *, EncodingSubGraph *, uintptr_t, PTRSHIFT> HashtableNodeToSubGraph;
15
16 class EncodingGraph {
17  public:
18         EncodingGraph(CSolver * solver);
19         void buildGraph();
20         
21         CMEMALLOC;
22  private:
23         CSolver * solver;
24         HashtableEncoding encodingMap;
25         HashtableEdge edgeMap;
26         HashsetElement discovered;
27         HashtableNodeToSubGraph graphMap;
28
29         
30         void mergeNodes(EncodingNode *first, EncodingNode *second);
31         void processElement(Element *e);
32         void processFunction(ElementFunction *f);
33         void processPredicate(BooleanPredicate *b);
34         EncodingNode * createNode(Element *e);
35         EncodingEdge * getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
36 };
37
38 class EncodingNode {
39  public:
40         EncodingNode(Set *_s);
41         void addElement(Element *e);
42         uint getSize();
43         VarType getType();
44         void setEncoding(ElementEncodingType e) {encoding=e;}
45         
46         CMEMALLOC;
47  private:
48         Set *s;
49         HashsetElement elements;
50         uint numElements;
51         ElementEncodingType encoding;
52         friend class EncodingGraph;
53         friend class EncodingSubGraph;
54 };
55
56 class EncodingSubGraph {
57  public:
58         EncodingSubGraph();
59         void addNode(EncodingNode *n);
60         SetIteratorEncodingNode * nodeIterator();
61         
62         CMEMALLOC;
63  private:
64         HashsetEncodingNode nodes;
65         Hashset64Int values;
66 };
67
68 enum EdgeEncodingType { EDGE_UNASSIGNED, EDGE_BREAK, EDGE_MATCH};
69 typedef enum EdgeEncodingType EdgeEncodingType;
70
71 class EncodingEdge {
72  public:
73         EncodingEdge(EncodingNode *_l, EncodingNode *_r);
74         EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d);
75         void setEncoding(EdgeEncodingType e) {encoding=e;}
76         CMEMALLOC;
77         
78  private:
79         EncodingNode *left;
80         EncodingNode *right;
81         EncodingNode *dst;
82         EdgeEncodingType encoding;
83         uint numArithOps;
84         uint numEquals;
85         uint numComparisons;
86         friend uint hashEncodingEdge(EncodingEdge *edge);
87         friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
88         friend class EncodingGraph;
89 };
90
91
92
93 #endif