edits
[satune.git] / src / ASTAnalyses / Encoding / encodinggraph.h
index 4057dd2ed7c10115081320768bf04d0fa150dd43..0c94c3892be692822f885d3f554f2d625414a15c 100644 (file)
@@ -2,36 +2,31 @@
 #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);
        void buildGraph();
+       void encode();
        
        CMEMALLOC;
  private:
        CSolver * solver;
        HashtableEncoding encodingMap;
        HashtableEdge edgeMap;
+       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);
 };
 
@@ -39,34 +34,20 @@ class EncodingNode {
  public:
        EncodingNode(Set *_s);
        void addElement(Element *e);
-       uint getSize();
-       VarType getType();
+       uint getSize() const;
+       VarType getType() const;
        void setEncoding(ElementEncodingType e) {encoding=e;}
-       
+       ElementEncodingType getEncoding() {return encoding;}
        CMEMALLOC;
  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();
-       uint computeIntersection(Set *s);
-       uint computeIntersection(EncodingSubGraph *g);
-       
-       CMEMALLOC;
- private:
-       HashsetEncodingNode nodes;
-       Hashset64Int values;
-};
-
 enum EdgeEncodingType { EDGE_UNASSIGNED, EDGE_BREAK, EDGE_MATCH};
 typedef enum EdgeEncodingType EdgeEncodingType;
 
@@ -75,6 +56,7 @@ class EncodingEdge {
        EncodingEdge(EncodingNode *_l, EncodingNode *_r);
        EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d);
        void setEncoding(EdgeEncodingType e) {encoding=e;}
+       uint64_t getValue() const;
        CMEMALLOC;
        
  private:
@@ -88,6 +70,7 @@ class EncodingEdge {
        friend uint hashEncodingEdge(EncodingEdge *edge);
        friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
        friend class EncodingGraph;
+       friend class EncodingSubGraph;
 };
 
 #endif