#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 Hashtable<EncodingNode *, EncodingSubGraph *, uintptr_t, PTRSHIFT> HashtableNodeToSubGraph;
+#include "graphstructs.h"
class EncodingGraph {
- public:
- EncodingGraph(CSolver * solver);
+public:
+ EncodingGraph(CSolver *solver);
+ ~EncodingGraph();
void buildGraph();
-
+ void encode();
+
CMEMALLOC;
- private:
- CSolver * solver;
+private:
+ CSolver *solver;
HashtableEncoding encodingMap;
HashtableEdge edgeMap;
+ Vector<EncodingEdge *> edgeVector;
HashsetElement discovered;
HashtableNodeToSubGraph graphMap;
+ HashsetEncodingSubGraph subgraphs;
-
+ void encodeParent(Element *e);
+ void decideEdges();
void mergeNodes(EncodingNode *first, EncodingNode *second);
void processElement(Element *e);
void processFunction(ElementFunction *f);
void processPredicate(BooleanPredicate *b);
- EncodingNode * createNode(Element *e);
- EncodingEdge * getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
+ EncodingNode *createNode(Element *e);
+ EncodingNode *getNode(Element *e);
+ EncodingEdge *getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
+ EncodingEdge *createEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
};
class EncodingNode {
- public:
+public:
EncodingNode(Set *_s);
void addElement(Element *e);
- uint getSize();
- VarType getType();
- void setEncoding(ElementEncodingType e) {encoding=e;}
-
+ uint getSize() const;
+ VarType getType() const;
+ void setEncoding(ElementEncodingType e) {encoding = e;}
+ ElementEncodingType getEncoding() {return encoding;}
+ bool couldBeBinaryIndex() {return encoding == BINARYINDEX || encoding == ELEM_UNASSIGNED;}
CMEMALLOC;
- private:
+private:
Set *s;
HashsetElement elements;
- uint numElements;
+ HashsetEncodingEdge edges;
ElementEncodingType encoding;
friend class EncodingGraph;
friend class EncodingSubGraph;
};
-class EncodingSubGraph {
- public:
- EncodingSubGraph();
- void addNode(EncodingNode *n);
- SetIteratorEncodingNode * nodeIterator();
-
- CMEMALLOC;
- private:
- HashsetEncodingNode nodes;
- Hashset64Int values;
-};
-
enum EdgeEncodingType { EDGE_UNASSIGNED, EDGE_BREAK, EDGE_MATCH};
typedef enum EdgeEncodingType EdgeEncodingType;
class EncodingEdge {
- public:
+public:
EncodingEdge(EncodingNode *_l, EncodingNode *_r);
EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d);
- void setEncoding(EdgeEncodingType e) {encoding=e;}
+ void setEncoding(EdgeEncodingType e) {encoding = e;}
+ uint64_t getValue() const;
+ EdgeEncodingType getEncoding() {return encoding;}
+
CMEMALLOC;
-
- private:
+
+private:
EncodingNode *left;
EncodingNode *right;
EncodingNode *dst;
friend uint hashEncodingEdge(EncodingEdge *edge);
friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
friend class EncodingGraph;
+ friend class EncodingSubGraph;
};
-
-
#endif