Fix some memory leaks
[satune.git] / src / ASTAnalyses / Encoding / encodinggraph.h
1 #ifndef ENCODINGGRAPH_H
2 #define ENCODINGGRAPH_H
3 #include "classlist.h"
4 #include "structs.h"
5 #include "graphstructs.h"
6
7 class EncodingGraph {
8 public:
9         EncodingGraph(CSolver *solver);
10         ~EncodingGraph();
11         void buildGraph();
12         void encode();
13
14         CMEMALLOC;
15 private:
16         CSolver *solver;
17         HashtableEncoding encodingMap;
18         HashtableEdge edgeMap;
19         Vector<EncodingEdge *> edgeVector;
20         HashsetElement discovered;
21         HashtableNodeToSubGraph graphMap;
22         HashsetEncodingSubGraph subgraphs;
23
24         void encodeParent(Element *e);
25         void decideEdges();
26         void mergeNodes(EncodingNode *first, EncodingNode *second);
27         void processElement(Element *e);
28         void processFunction(ElementFunction *f);
29         void processPredicate(BooleanPredicate *b);
30         EncodingNode *createNode(Element *e);
31         EncodingNode *getNode(Element *e);
32         EncodingEdge *getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
33         EncodingEdge *createEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
34 };
35
36 class EncodingNode {
37 public:
38         EncodingNode(Set *_s);
39         void addElement(Element *e);
40         uint getSize() const;
41         VarType getType() const;
42         void setEncoding(ElementEncodingType e) {encoding = e;}
43         ElementEncodingType getEncoding() {return encoding;}
44         bool couldBeBinaryIndex() {return encoding == BINARYINDEX || encoding == ELEM_UNASSIGNED;}
45         CMEMALLOC;
46 private:
47         Set *s;
48         HashsetElement elements;
49         HashsetEncodingEdge edges;
50         ElementEncodingType encoding;
51         friend class EncodingGraph;
52         friend class EncodingSubGraph;
53 };
54
55 enum EdgeEncodingType { EDGE_UNASSIGNED, EDGE_BREAK, EDGE_MATCH};
56 typedef enum EdgeEncodingType EdgeEncodingType;
57
58 class EncodingEdge {
59 public:
60         EncodingEdge(EncodingNode *_l, EncodingNode *_r);
61         EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d);
62         void setEncoding(EdgeEncodingType e) {encoding = e;}
63         uint64_t getValue() const;
64         EdgeEncodingType getEncoding() {return encoding;}
65
66         CMEMALLOC;
67
68 private:
69         EncodingNode *left;
70         EncodingNode *right;
71         EncodingNode *dst;
72         EdgeEncodingType encoding;
73         uint numArithOps;
74         uint numEquals;
75         uint numComparisons;
76         friend uint hashEncodingEdge(EncodingEdge *edge);
77         friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
78         friend class EncodingGraph;
79         friend class EncodingSubGraph;
80 };
81
82 #endif