Improve propagation and add preprocessor pass
[satune.git] / src / ASTAnalyses / ordergraph.cc
index 9f53d1134fb3a42256f7aed05017edda007a539a..2127db9c466f06b647a54a0799ae667ffd11112a 100644 (file)
@@ -6,13 +6,14 @@
 #include "order.h"
 
 OrderGraph::OrderGraph(Order *_order) :
-       nodes(new HashSetOrderNode()),
-       edges(new HashSetOrderEdge()),
+       nodes(new HashsetOrderNode()),
+       edges(new HashsetOrderEdge()),
        order(_order) {
 }
 
 OrderGraph *buildOrderGraph(Order *order) {
        OrderGraph *orderGraph = new OrderGraph(order);
+       order->graph = orderGraph;
        uint constrSize = order->constraints.getSize();
        for (uint j = 0; j < constrSize; j++) {
                orderGraph->addOrderConstraintToOrderGraph(order->constraints.get(j));
@@ -65,7 +66,8 @@ void OrderGraph::addOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *
        }
        case P_UNDEFINED:
                //There is an unreachable order constraint if this assert fires
-               ASSERT(0);
+               //Clients can easily do this, so don't do anything.
+               ;
        }
 }
 
@@ -159,14 +161,14 @@ void OrderGraph::addMustOrderConstraintToOrderGraph(BooleanOrder *bOrder) {
 }
 
 OrderGraph::~OrderGraph() {
-       HSIteratorOrderNode *iterator = nodes->iterator();
+       SetIteratorOrderNode *iterator = nodes->iterator();
        while (iterator->hasNext()) {
                OrderNode *node = iterator->next();
                delete node;
        }
        delete iterator;
 
-       HSIteratorOrderEdge *eiterator = edges->iterator();
+       SetIteratorOrderEdge *eiterator = edges->iterator();
        while (eiterator->hasNext()) {
                OrderEdge *edge = eiterator->next();
                delete edge;
@@ -175,3 +177,45 @@ OrderGraph::~OrderGraph() {
        delete nodes;
        delete edges;
 }
+
+bool OrderGraph::isTherePath(OrderNode *source, OrderNode *destination){
+       HashsetOrderNode visited;
+       visited.add(source);
+       SetIteratorOrderEdge *iterator = source->outEdges.iterator();
+       bool found = false;
+       while(iterator->hasNext()){
+               OrderNode* node = iterator->next()->sink;
+               if(!visited.contains(node)){
+                       if( node == destination ){
+                               found = true;
+                               break;
+                       }
+                       visited.add(node);
+                       found =isTherePathVisit(visited, node, destination);
+                       if(found){
+                               break;
+                       }
+               }
+       }
+       delete iterator;
+       return found;
+}
+
+bool OrderGraph::isTherePathVisit(HashsetOrderNode &visited, OrderNode* current, OrderNode* destination){
+       SetIteratorOrderEdge *iterator = current->outEdges.iterator();
+       bool found = false;
+       while(iterator->hasNext()){
+               OrderNode* node = iterator->next()->sink;
+               if(node == destination){
+                       found = true;
+                       break;
+               }
+               visited.add(node);
+               if(isTherePathVisit(visited, node, destination)){
+                       found = true;
+                       break;
+               }
+       }
+       delete iterator;
+       return found;
+}