#define ENCODINGGRAPH_H
#include "classlist.h"
#include "structs.h"
-
-uint hashEncodingEdge(EncodingEdge *edge);
-bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
-class EncodingSubGraph;
-
-
-typedef Hashtable<EncodingEdge *, EncodingEdge *, uintptr_t, PTRSHIFT, hashEncodingEdge, equalsEncodingEdge> HashtableEdge;
-typedef Hashset<EncodingNode *, uintptr_t, PTRSHIFT> HashsetEncodingNode;
-typedef SetIterator<EncodingNode *, uintptr_t, PTRSHIFT> SetIteratorEncodingNode;
-typedef Hashset<EncodingEdge *, uintptr_t, PTRSHIFT> HashsetEncodingEdge;
-typedef SetIterator<EncodingEdge *, uintptr_t, PTRSHIFT> SetIteratorEncodingEdge;
-
-typedef Hashtable<EncodingNode *, EncodingSubGraph *, uintptr_t, PTRSHIFT> HashtableNodeToSubGraph;
+#include "graphstructs.h"
class EncodingGraph {
public:
EncodingGraph(CSolver * solver);
void buildGraph();
+ void encode();
CMEMALLOC;
private:
Vector<EncodingEdge *> edgeVector;
HashsetElement discovered;
HashtableNodeToSubGraph graphMap;
-
+ HashsetEncodingSubGraph subgraphs;
+
void decideEdges();
void mergeNodes(EncodingNode *first, EncodingNode *second);
void processElement(Element *e);
void processFunction(ElementFunction *f);
void processPredicate(BooleanPredicate *b);
EncodingNode * createNode(Element *e);
+ EncodingNode * getNode(Element *e);
EncodingEdge * getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
};
uint getSize() const;
VarType getType() const;
void setEncoding(ElementEncodingType e) {encoding=e;}
-
+ ElementEncodingType getEncoding() {return encoding;}
CMEMALLOC;
private:
Set *s;
friend class EncodingSubGraph;
};
-class EncodingSubGraph {
- public:
- EncodingSubGraph();
- void addNode(EncodingNode *n);
- SetIteratorEncodingNode * nodeIterator();
-
- CMEMALLOC;
- private:
- uint estimateNewSize(EncodingNode *n);
- uint estimateNewSize(EncodingSubGraph *sg);
-
- HashsetEncodingNode nodes;
- uint encodingSize;
- uint numElements;
-
- friend class EncodingGraph;
-};
-
enum EdgeEncodingType { EDGE_UNASSIGNED, EDGE_BREAK, EDGE_MATCH};
typedef enum EdgeEncodingType EdgeEncodingType;