3 * File: DecomposeOrderResolver.cc
6 * Created on September 1, 2017, 10:36 AM
9 #include "decomposeorderresolver.h"
11 #include "ordernode.h"
12 #include "ordergraph.h"
14 DecomposeOrderResolver::DecomposeOrderResolver(Order * _order) :
20 DecomposeOrderResolver::~DecomposeOrderResolver() {
23 uint size=edges.getSize();
24 edges.resetAndDelete();
27 void DecomposeOrderResolver::mustOrderEdge(uint64_t first, uint64_t second) {
28 DOREdge edge(first, second, 0, first, second);
29 if (!edges.contains(&edge)) {
30 DOREdge *newedge=new DOREdge(first, second, 0, first, second);
35 void DecomposeOrderResolver::remapEdge(uint64_t first, uint64_t second, uint64_t newfirst, uint64_t newsecond) {
36 DOREdge edge(first, second, 0, first, second);
37 DOREdge *oldedge=edges.get(&edge);
38 if (oldedge != NULL) {
39 edges.remove(oldedge);
40 oldedge->newfirst=newfirst;
41 oldedge->newsecond=newsecond;
44 DOREdge *newedge=new DOREdge(first, second, 0, newfirst, newsecond);
49 void DecomposeOrderResolver::setEdgeOrder(uint64_t first, uint64_t second, uint sccNum) {
50 DOREdge edge(first, second, 0, first, second);
51 DOREdge *oldedge=edges.get(&edge);
52 if (oldedge != NULL) {
53 oldedge->orderindex=sccNum;
55 DOREdge *newedge=new DOREdge(first, second, sccNum, first, second);
60 void DecomposeOrderResolver::setOrder(uint sccNum, Order *neworder) {
61 orders.setExpand(sccNum, neworder);
64 Order * DecomposeOrderResolver::getOrder(uint sccNum) {
65 Order *neworder = NULL;
66 if (orders.getSize() > sccNum)
67 neworder = orders.get(sccNum);
71 bool DecomposeOrderResolver::resolveOrder(uint64_t first, uint64_t second) {
72 OrderNode *from = graph->lookupOrderNodeFromOrderGraph(first);
74 OrderNode *to = graph->lookupOrderNodeFromOrderGraph(second);
76 if (from->removed || to->removed) {
77 HashsetOrderNode fromset, toset;
78 // processNode(&fromset, from, true);
79 // processNode(&toset, to, false);
80 SetIteratorOrderNode *fromit=fromset.iterator();
81 while(fromit->hasNext()) {
82 OrderNode * nodefrom=fromit->next();
83 SetIteratorOrderNode *toit=toset.iterator();
84 while(toit->hasNext()) {
85 OrderNode * nodeto=toit->next();
86 if (resolveOrder(nodefrom->getID(), nodeto->getID())) {
96 } else if (from->sccNum != to->sccNum) {
97 OrderEdge *edge = graph->lookupOrderEdgeFromOrderGraph(from, to);
98 switch (graph->getOrder()->type) {
100 return from->sccNum < to->sccNum;
102 return resolvePartialOrder(from, to);
107 Order *suborder = NULL;
108 // We should ask this query from the suborder ....
109 suborder = orders.get(from->sccNum);
110 ASSERT(suborder != NULL);
111 return suborder->encoding.resolver->resolveOrder(from->id, to->id);
115 bool DecomposeOrderResolver::resolvePartialOrder(OrderNode *first, OrderNode *second) {
116 if (first->sccNum > second->sccNum) {
119 return graph->isTherePath(first, second);