Fix some memory leaks
[satune.git] / src / ASTAnalyses / Encoding / encodinggraph.h
index 62e3b8fa92de5b15ddf8c489d7eeb2eaceaf5cdf..ab9cac6cc3621e5d1f340cac4e95305c807f390a 100644 (file)
@@ -2,61 +2,81 @@
 #define ENCODINGGRAPH_H
 #include "classlist.h"
 #include "structs.h"
-
-uint hashEncodingEdge(EncodingEdge *edge);
-bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
-
-typedef Hashtable<EncodingEdge *, EncodingEdge *, uintptr_t, PTRSHIFT, hashEncodingEdge, equalsEncodingEdge> HashtableEdge;
+#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;
 };
 
+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;}
+       uint64_t getValue() const;
+       EdgeEncodingType getEncoding() {return encoding;}
+
        CMEMALLOC;
- private:
+
+private:
        EncodingNode *left;
        EncodingNode *right;
        EncodingNode *dst;
+       EdgeEncodingType encoding;
        uint numArithOps;
        uint numEquals;
        uint numComparisons;
        friend uint hashEncodingEdge(EncodingEdge *edge);
        friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
        friend class EncodingGraph;
+       friend class EncodingSubGraph;
 };
+
 #endif