More EncodingGraph work
[satune.git] / src / ASTAnalyses / Encoding / encodinggraph.h
index 62e3b8fa92de5b15ddf8c489d7eeb2eaceaf5cdf..e44ccfd69c539b3eaaec6afdc7b1cce018a7a17e 100644 (file)
@@ -5,8 +5,13 @@
 
 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;
 
 class EncodingGraph {
  public:
@@ -19,6 +24,10 @@ class EncodingGraph {
        HashtableEncoding encodingMap;
        HashtableEdge edgeMap;
        HashsetElement discovered;
+       HashtableNodeToSubGraph graphMap;
+
+       
+       void mergeNodes(EncodingNode *first, EncodingNode *second);
        void processElement(Element *e);
        void processFunction(ElementFunction *f);
        void processPredicate(BooleanPredicate *b);
@@ -41,17 +50,36 @@ class EncodingNode {
        uint numElements;
        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:
        EncodingEdge(EncodingNode *_l, EncodingNode *_r);
        EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d);
+       void setEncoding(EdgeEncodingType e) {encoding=e;}
        CMEMALLOC;
+       
  private:
        EncodingNode *left;
        EncodingNode *right;
        EncodingNode *dst;
+       EdgeEncodingType encoding;
        uint numArithOps;
        uint numEquals;
        uint numComparisons;
@@ -59,4 +87,7 @@ class EncodingEdge {
        friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
        friend class EncodingGraph;
 };
+
+
+
 #endif