Merge
[satune.git] / src / AST / set.cc
1 #include "set.h"
2 #include <stddef.h>
3 #include "csolver.h"
4 #include "serializer.h"
5
6 Set::Set(VarType t) : type(t), isRange(false), low(0), high(0) {
7         members = new Vector<uint64_t>();
8 }
9
10 Set::Set(VarType t, uint64_t *elements, uint num) : type(t), isRange(false), low(0), high(0) {
11         members = new Vector<uint64_t>(num, elements);
12 }
13
14 Set::Set(VarType t, uint64_t lowrange, uint64_t highrange) : type(t), isRange(true), low(lowrange), high(highrange), members(NULL) {
15 }
16
17 bool Set::exists(uint64_t element) {
18         if (isRange) {
19                 return element >= low && element <= high;
20         } else {
21                 uint size = members->getSize();
22                 for (uint i = 0; i < size; i++) {
23                         if (element == members->get(i))
24                                 return true;
25                 }
26                 return false;
27         }
28 }
29
30 uint64_t Set::getElement(uint index) {
31         if (isRange)
32                 return low + index;
33         else
34                 return members->get(index);
35 }
36
37 uint Set::getSize() {
38         if (isRange) {
39                 return high - low + 1;
40         } else {
41                 return members->getSize();
42         }
43 }
44
45 uint64_t Set::getMemberAt(uint index) {
46         if (isRange) {
47                 return low + index;
48         } else {
49                 return members->get(index);
50         }
51 }
52
53 Set::~Set() {
54         if (!isRange)
55                 delete members;
56 }
57
58 Set *Set::clone(CSolver *solver, CloneMap *map) {
59         Set *s = (Set *) map->get(this);
60         if (s != NULL)
61                 return s;
62         if (isRange) {
63                 s = solver->createRangeSet(type, low, high);
64         } else {
65                 s = solver->createSet(type, members->expose(), members->getSize());
66         }
67         map->put(this, s);
68         return s;
69 }
70
71
72 void Set::serialize(Serializer* serializer){
73         if(serializer->isSerialized(this))
74                 return;
75         serializer->addObject(this);
76         ASTNodeType asttype = SETTYPE;
77         serializer->mywrite(&asttype, sizeof(ASTNodeType));
78         Set* This = this;
79         serializer->mywrite(&This, sizeof(Set*));
80         serializer->mywrite(&type, sizeof(VarType));
81         serializer->mywrite(&isRange, sizeof(bool));
82         serializer->mywrite(&low, sizeof(uint64_t));
83         serializer->mywrite(&high, sizeof(uint64_t));
84         uint size = members->getSize();
85         serializer->mywrite(&size, sizeof(uint));
86         for(uint i=0; i<size; i++){
87                 uint64_t mem = members->get(i);
88                 serializer->mywrite(&mem, sizeof(uint64_t));
89         }
90 }