-/*
+/*
* File: DecomposeOrderResolver.cc
* Author: hamed
- *
+ *
* Created on September 1, 2017, 10:36 AM
*/
#include "ordernode.h"
#include "ordergraph.h"
-DecomposeOrderResolver::DecomposeOrderResolver(OrderGraph* _graph, Vector<Order*>& _orders):
- OrderResolver(_graph),
+DecomposeOrderResolver::DecomposeOrderResolver(OrderGraph *_graph, Vector<Order *> &_orders) :
+ graph(_graph),
orders(_orders.getSize(), _orders.expose())
{
}
DecomposeOrderResolver::~DecomposeOrderResolver() {
- delete graph;
}
-HappenedBefore DecomposeOrderResolver::getOrder(OrderNode* from, OrderNode* to){
- ASSERT(from->id == to->id);
- // We should ask this query from the suborder ....
- Order *suborder = NULL;
- suborder = orders.get(from->sccNum);
- ASSERT(suborder != NULL);
- return suborder->encoding.resolver->resolveOrder(from->id, to->id);
+bool DecomposeOrderResolver::resolveOrder(uint64_t first, uint64_t second) {
+ OrderNode *from = graph->lookupOrderNodeFromOrderGraph(first);
+ ASSERT(from != NULL);
+ OrderNode *to = graph->lookupOrderNodeFromOrderGraph(second);
+ ASSERT(to != NULL);
+
+ if (from->sccNum != to->sccNum) {
+ OrderEdge *edge = graph->lookupOrderEdgeFromOrderGraph(from, to);
+ if (edge != NULL && edge->mustPos) {
+ return true;
+ } else if ( edge != NULL && edge->mustNeg) {
+ return false;
+ } else {
+ switch (graph->getOrder()->type) {
+ case SATC_TOTAL:
+ return from->sccNum < to->sccNum;
+ case SATC_PARTIAL:
+ //Adding support for partial order ...
+ default:
+ ASSERT(0);
+ }
+ }
+ } else {
+ Order *suborder = NULL;
+ // We should ask this query from the suborder ....
+ suborder = orders.get(from->sccNum);
+ ASSERT(suborder != NULL);
+ return suborder->encoding.resolver->resolveOrder(from->id, to->id);
+ }
}