More code towards graph
[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
9 typedef Hashtable<EncodingEdge *, EncodingEdge *, uintptr_t, PTRSHIFT, hashEncodingEdge, equalsEncodingEdge> HashtableEdge;
10
11 class EncodingGraph {
12  public:
13         EncodingGraph(CSolver * solver);
14         void buildGraph();
15         
16         CMEMALLOC;
17  private:
18         CSolver * solver;
19         HashtableEncoding encodingMap;
20         HashtableEdge edgeMap;
21         HashsetElement discovered;
22         void processElement(Element *e);
23         void processFunction(ElementFunction *f);
24         void processPredicate(BooleanPredicate *b);
25         EncodingNode * createNode(Element *e);
26         EncodingEdge * getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
27 };
28
29 class EncodingNode {
30  public:
31         EncodingNode(Set *_s);
32         void addElement(Element *e);
33         CMEMALLOC;
34  private:
35         Set *s;
36         HashsetElement elements;
37         uint numElements;
38         friend class EncodingGraph;
39 };
40
41 class EncodingEdge {
42  public:
43         EncodingEdge(EncodingNode *_l, EncodingNode *_r);
44         EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d);
45         CMEMALLOC;
46  private:
47         EncodingNode *left;
48         EncodingNode *right;
49         EncodingNode *dst;
50         uint numArithOps;
51         uint numEquals;
52         uint numComparisons;
53         friend uint hashEncodingEdge(EncodingEdge *edge);
54         friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
55         fiend class EncodingGraph;
56 };
57 #endif