61152958cd8bbfe4616024dfb979346424a306f9
[satune.git] / src / Translator / decomposeorderresolver.cc
1
2 /* 
3  * File:   DecomposeOrderResolver.cc
4  * Author: hamed
5  * 
6  * Created on September 1, 2017, 10:36 AM
7  */
8
9 #include "decomposeorderresolver.h"
10 #include "order.h"
11 #include "ordernode.h"
12 #include "ordergraph.h"
13
14 DecomposeOrderResolver::DecomposeOrderResolver(OrderGraph* _graph, Vector<Order*>& _orders):
15         graph(_graph),
16         orders(_orders.getSize(), _orders.expose())
17 {
18 }
19
20 DecomposeOrderResolver::~DecomposeOrderResolver() {
21         delete graph;
22 }
23
24 HappenedBefore DecomposeOrderResolver::resolveOrder(uint64_t first, uint64_t second){
25         OrderNode *from = graph->getOrderNodeFromOrderGraph(first, false /*Don't create new node if doesn't exist*/);
26         if(from == NULL){
27                 return SATC_UNORDERED;
28         }
29         OrderNode *to = graph->getOrderNodeFromOrderGraph(second, false);
30         if(from == NULL){
31                 return SATC_UNORDERED;
32         }
33         if (from->sccNum != to->sccNum) {
34                 OrderEdge *edge = graph->getOrderEdgeFromOrderGraph(from, to, false /* Don't create a new edge*/);
35                 if (edge != NULL && edge->mustPos){
36                         return SATC_FIRST;
37                 } else if( edge != NULL && edge->mustNeg){
38                         return SATC_SECOND;
39                 }else {
40                         switch(graph->getOrder()->encoding.type){
41                                 case SATC_TOTAL:
42                                         return from->sccNum < to->sccNum? SATC_FIRST: SATC_SECOND;
43                                 case SATC_PARTIAL:
44                                 default:
45                                         ASSERT(0);
46                         }       
47                 }
48         } else {
49                 Order *suborder = NULL;
50                 // We should ask this query from the suborder ....
51                 suborder = orders.get(from->sccNum);
52                 ASSERT(suborder != NULL);
53                 return suborder->encoding.resolver->resolveOrder(from->id, to->id);
54         }
55 }
56