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();
72 uint64_t Set::getMemberAt(uint index) {
76 return members->get(index);
85 Set *Set::clone(CSolver *solver, CloneMap *map) {
86 Set *s = (Set *) map->get(this);
90 s = solver->createRangeSet(type, low, high);
92 s = solver->createSet(type, members->expose(), members->getSize());
98 uint Set::getUnionSize(Set *s) {
99 uint sSize = s->getSize();
100 uint thisSize = getSize();
104 uint64_t sValue = s->getElement(sIndex);
105 uint64_t thisValue = getElement(thisIndex);
106 while (thisIndex < thisSize && sIndex < sSize) {
107 if (sValue < thisValue) {
110 sValue = s->getElement(sIndex);
112 } else if (thisValue < sValue) {
114 if (thisIndex < thisSize)
115 thisValue = getElement(thisIndex);
121 sValue = s->getElement(sIndex);
122 if (thisIndex < thisSize)
123 thisValue = getElement(thisIndex);
127 sum += (thisSize - thisIndex) + (sSize - sIndex);
132 void Set::serialize(Serializer *serializer) {
133 if (serializer->isSerialized(this))
135 serializer->addObject(this);
136 ASTNodeType asttype = SETTYPE;
137 serializer->mywrite(&asttype, sizeof(ASTNodeType));
139 serializer->mywrite(&This, sizeof(Set *));
140 serializer->mywrite(&type, sizeof(VarType));
141 serializer->mywrite(&isRange, sizeof(bool));
142 bool isMutable = isMutableSet();
143 serializer->mywrite(&isMutable, sizeof(bool));
145 serializer->mywrite(&low, sizeof(uint64_t));
146 serializer->mywrite(&high, sizeof(uint64_t));
148 uint size = members->getSize();
149 serializer->mywrite(&size, sizeof(uint));
150 for (uint i = 0; i < size; i++) {
151 uint64_t mem = members->get(i);
152 serializer->mywrite(&mem, sizeof(uint64_t));
158 model_print("{Set<%p>:", this);
160 model_print("Range: low=%lu, high=%lu}", low, high);
162 uint size = members->getSize();
163 model_print("Members: ");
164 for (uint i = 0; i < size; i++) {
165 uint64_t mem = members->get(i);
166 model_print("%lu, ", mem);