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) {
108 sValue = s->getElement(++sIndex);
110 } else if (thisValue < sValue) {
111 thisValue = getElement(++thisIndex);
114 thisValue = getElement(++thisIndex);
115 sValue = s->getElement(++sIndex);
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 serializer->mywrite(&low, sizeof(uint64_t));
135 serializer->mywrite(&high, sizeof(uint64_t));
136 bool isMutable = isMutableSet();
137 serializer->mywrite(&isMutable, sizeof(bool));
138 uint size = members->getSize();
139 serializer->mywrite(&size, sizeof(uint));
140 for(uint i=0; i<size; i++){
141 uint64_t mem = members->get(i);
142 serializer->mywrite(&mem, sizeof(uint64_t));