1 #ifndef ENCODINGGRAPH_H
2 #define ENCODINGGRAPH_H
6 uint hashEncodingEdge(EncodingEdge *edge);
7 bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
8 class EncodingSubGraph;
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 Hashset<EncodingEdge *, uintptr_t, PTRSHIFT> HashsetEncodingEdge;
15 typedef SetIterator<EncodingEdge *, uintptr_t, PTRSHIFT> SetIteratorEncodingEdge;
17 typedef Hashtable<EncodingNode *, EncodingSubGraph *, uintptr_t, PTRSHIFT> HashtableNodeToSubGraph;
21 EncodingGraph(CSolver * solver);
27 HashtableEncoding encodingMap;
28 HashtableEdge edgeMap;
29 Vector<EncodingEdge *> edgeVector;
30 HashsetElement discovered;
31 HashtableNodeToSubGraph graphMap;
34 void mergeNodes(EncodingNode *first, EncodingNode *second);
35 void processElement(Element *e);
36 void processFunction(ElementFunction *f);
37 void processPredicate(BooleanPredicate *b);
38 EncodingNode * createNode(Element *e);
39 EncodingEdge * getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
44 EncodingNode(Set *_s);
45 void addElement(Element *e);
47 VarType getType() const;
48 void setEncoding(ElementEncodingType e) {encoding=e;}
53 HashsetElement elements;
54 HashsetEncodingEdge edges;
55 ElementEncodingType encoding;
56 friend class EncodingGraph;
57 friend class EncodingSubGraph;
60 class EncodingSubGraph {
63 void addNode(EncodingNode *n);
64 SetIteratorEncodingNode * nodeIterator();
68 uint estimateNewSize(EncodingNode *n);
69 uint estimateNewSize(EncodingSubGraph *sg);
71 HashsetEncodingNode nodes;
75 friend class EncodingGraph;
78 enum EdgeEncodingType { EDGE_UNASSIGNED, EDGE_BREAK, EDGE_MATCH};
79 typedef enum EdgeEncodingType EdgeEncodingType;
83 EncodingEdge(EncodingNode *_l, EncodingNode *_r);
84 EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d);
85 void setEncoding(EdgeEncodingType e) {encoding=e;}
86 uint64_t getValue() const;
93 EdgeEncodingType encoding;
97 friend uint hashEncodingEdge(EncodingEdge *edge);
98 friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
99 friend class EncodingGraph;
100 friend class EncodingSubGraph;