4 #include "serializer.h"
7 int intcompare(const void *p1, const void *p2) {
8 uint64_t a = *(uint64_t const *) p1;
9 uint64_t b = *(uint64_t const *) p2;
18 Set::Set(VarType t) : type(t), isRange(false), low(0), high(0) {
19 members = new Vector<uint64_t>();
23 Set::Set(VarType t, uint64_t *elements, uint num) : type(t), isRange(false), low(0), high(0) {
24 members = new Vector<uint64_t>(num, elements);
25 bsdqsort(members->expose(), members->getSize(), sizeof(uint64_t), intcompare);
29 Set::Set(VarType t, uint64_t lowrange, uint64_t highrange) : type(t), isRange(true), low(lowrange), high(highrange), members(NULL) {
32 bool Set::exists(uint64_t element) {
34 return element >= low && element <= high;
38 uint high = members->getSize() - 1;
40 uint middle = (low + high) / 2;
41 uint64_t val = members->get(middle);
46 } else if (element > val) {
57 uint64_t Set::getElement(uint index) {
61 return members->get(index);
66 return high - low + 1;
68 return members->getSize();
77 Set *Set::clone(CSolver *solver, CloneMap *map) {
78 Set *s = (Set *) map->get(this);
82 s = solver->createRangeSet(type, low, high);
84 s = solver->createSet(type, members->expose(), members->getSize());
90 uint Set::getUnionSize(Set *s) {
91 uint sSize = s->getSize();
92 uint thisSize = getSize();
96 uint64_t sValue = s->getElement(sIndex);
97 uint64_t thisValue = getElement(thisIndex);
98 while (thisIndex < thisSize && sIndex < sSize) {
99 if (sValue < thisValue) {
102 sValue = s->getElement(sIndex);
104 } else if (thisValue < sValue) {
106 if (thisIndex < thisSize)
107 thisValue = getElement(thisIndex);
113 sValue = s->getElement(sIndex);
114 if (thisIndex < thisSize)
115 thisValue = getElement(thisIndex);
119 sum += (thisSize - thisIndex) + (sSize - sIndex);
124 void Set::serialize(Serializer *serializer) {
125 if (serializer->isSerialized(this))
127 serializer->addObject(this);
128 ASTNodeType asttype = SETTYPE;
129 serializer->mywrite(&asttype, sizeof(ASTNodeType));
131 serializer->mywrite(&This, sizeof(Set *));
132 serializer->mywrite(&type, sizeof(VarType));
133 serializer->mywrite(&isRange, sizeof(bool));
134 bool isMutable = isMutableSet();
135 serializer->mywrite(&isMutable, sizeof(bool));
137 serializer->mywrite(&low, sizeof(uint64_t));
138 serializer->mywrite(&high, sizeof(uint64_t));
140 uint size = members->getSize();
141 serializer->mywrite(&size, sizeof(uint));
142 for (uint i = 0; i < size; i++) {
143 uint64_t mem = members->get(i);
144 serializer->mywrite(&mem, sizeof(uint64_t));
150 model_print("{Set(%lu)<%p>:", type, this);
152 model_print("Range: low=%lu, high=%lu}", low, high);
154 uint size = members->getSize();
155 model_print("Members: ");
156 for (uint i = 0; i < size; i++) {
157 uint64_t mem = members->get(i);
158 model_print("%lu, ", mem);