Merge branch 'master' of ssh://demsky.eecs.uci.edu/home/git/constraint_compiler into...
[satune.git] / src / AST / order.cc
1 #include "order.h"
2 #include "structs.h"
3 #include "set.h"
4 #include "boolean.h"
5 #include "ordergraph.h"
6 #include "csolver.h"
7 #include "orderpairresolver.h"
8
9 Order::Order(OrderType _type, Set *_set) :
10         type(_type),
11         set(_set),
12         graph(NULL),
13         encoding(this)
14 {
15 }
16
17 void Order::addOrderConstraint(BooleanOrder *constraint) {
18         constraints.push(constraint);
19         useditems.add(constraint->first);
20         useditems.add(constraint->second);
21 }
22
23 void Order::setOrderEncodingType(OrderEncodingType type) {
24         encoding.type = type;
25 }
26
27 Order *Order::clone(CSolver *solver, CloneMap *map) {
28         Order *o = (Order *)map->get(this);
29         if (o != NULL)
30                 return o;
31         o = solver->createOrder(type, set->clone(solver, map));
32         map->put(this, o);
33         return o;
34 }
35
36 HashtableOrderPair *Order::getOrderPairTable() {
37         ASSERT( encoding.resolver != NULL);
38         if (OrderPairResolver *t = dynamic_cast<OrderPairResolver *>(encoding.resolver)) {
39                 return t->getOrderPairTable();
40         } else {
41                 ASSERT(0);
42         }
43 }
44
45 Order::~Order() {
46         if (graph != NULL) {
47                 delete graph;
48         }
49 }
50
51 void Order::serialize(Serializer *serializer) {
52         if (serializer->isSerialized(this))
53                 return;
54         serializer->addObject(this);
55         set->serialize(serializer);
56         ASTNodeType asttype = ORDERTYPE;
57         serializer->mywrite(&asttype, sizeof(ASTNodeType));
58         Order *This = this;
59         serializer->mywrite(&This, sizeof(Order *));
60         serializer->mywrite(&type, sizeof(OrderType));
61         serializer->mywrite(&set, sizeof(Set *));
62 }
63
64 void Order::print() {
65         model_print("{Order<%p> on Set:\n", this);
66         set->print();
67         model_print("}\n");
68 }