type lastVector ## name(Vector ## name * vector); \
void popVector ## name(Vector ## name * vector); \
type getVector ## name(Vector ## name * vector, uint index); \
+ void setExpandVector ## name(Vector ## name * vector, uint index, type item); \
void setVector ## name(Vector ## name * vector, uint index, type item); \
uint getSizeVector ## name(Vector ## name * vector); \
void setSizeVector ## name(Vector ## name * vector, uint size); \
type getVector ## name(Vector ## name * vector, uint index) { \
return vector->array[index]; \
} \
+ void setExpandVector ## name(Vector ## name * vector, uint index, type item) { \
+ if (index>=vector->size) \
+ setSizeVector ## name(vector, index + 1); \
+ setVector ## name(vector, index, item); \
+ } \
void setVector ## name(Vector ## name * vector, uint index, type item) { \
vector->array[index] = item; \
} \
#include "order.h"
#include "ordernode.h"
#include "rewriter.h"
+#include "mutableset.h"
OrderGraph *buildOrderGraph(Order *order) {
OrderGraph *orderGraph = allocOrderGraph(order);
deleteIterOrderEdge(iterator);
}
-void decomposeOrder(Order *order, OrderGraph *graph) {
+void decomposeOrder(CSolver *This, Order *order, OrderGraph *graph) {
+ VectorOrder ordervec;
+ initDefVectorOrder(&ordervec);
uint size = getSizeVectorBooleanOrder(&order->constraints);
for (uint i = 0; i < size; i++) {
BooleanOrder *orderconstraint = getVectorBooleanOrder(&order->constraints, i);
replaceBooleanWithFalse((Boolean *)orderconstraint);
} else {
//Build new order and change constraint's order
-
+ Order * neworder = NULL;
+ if (getSizeVectorOrder(&ordervec) > from->sccNum)
+ neworder = getVectorOrder(&ordervec, from->sccNum);
+ if (neworder == NULL) {
+ Set * set = (Set *) allocMutableSet(order->set->type);
+ neworder = allocOrder(order->type, set);
+ pushVectorOrder(This->allOrders, neworder);
+ setExpandVectorOrder(&ordervec, from->sccNum, neworder);
+ }
+ if (from->status != ADDEDTOSET) {
+ from->status = ADDEDTOSET;
+ addElementMSet((MutableSet *)neworder->set, from->id);
+ }
+ if (to->status != ADDEDTOSET) {
+ to->status = ADDEDTOSET;
+ addElementMSet((MutableSet *)neworder->set, to->id);
+ }
+ orderconstraint->order = neworder;
+ addOrderConstraint(neworder, orderconstraint);
}
}
+ deleteVectorArrayOrder(&ordervec);
}
void orderAnalysis(CSolver *This) {
//This is needed for splitorder
computeStronglyConnectedComponentGraph(graph);
- decomposeOrder(order, graph);
+ decomposeOrder(This, order, graph);
deleteOrderGraph(graph);
}