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 Hashtable<EncodingNode *, EncodingSubGraph *, uintptr_t, PTRSHIFT> HashtableNodeToSubGraph;
18 EncodingGraph(CSolver * solver);
24 HashtableEncoding encodingMap;
25 HashtableEdge edgeMap;
26 HashsetElement discovered;
27 HashtableNodeToSubGraph graphMap;
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);
40 EncodingNode(Set *_s);
41 void addElement(Element *e);
44 void setEncoding(ElementEncodingType e) {encoding=e;}
49 HashsetElement elements;
51 ElementEncodingType encoding;
52 friend class EncodingGraph;
53 friend class EncodingSubGraph;
56 class EncodingSubGraph {
59 void addNode(EncodingNode *n);
60 SetIteratorEncodingNode * nodeIterator();
64 HashsetEncodingNode nodes;
68 enum EdgeEncodingType { EDGE_UNASSIGNED, EDGE_BREAK, EDGE_MATCH};
69 typedef enum EdgeEncodingType EdgeEncodingType;
73 EncodingEdge(EncodingNode *_l, EncodingNode *_r);
74 EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d);
75 void setEncoding(EdgeEncodingType e) {encoding=e;}
82 EdgeEncodingType encoding;
86 friend uint hashEncodingEdge(EncodingEdge *edge);
87 friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
88 friend class EncodingGraph;