4 #include "serializer.h"
7 Set::Set(VarType t) : type(t), isRange(false), low(0), high(0) {
8 members = new Vector<uint64_t>();
11 int intcompare(const void *p1, const void *p2) {
12 uint64_t a=*(uint64_t const *) p1;
13 uint64_t b=*(uint64_t const *) p2;
22 Set::Set(VarType t, uint64_t *elements, uint num) : type(t), isRange(false), low(0), high(0) {
23 members = new Vector<uint64_t>(num, elements);
24 bsdqsort(members->expose(), members->getSize(), sizeof(uint64_t), intcompare);
28 Set::Set(VarType t, uint64_t lowrange, uint64_t highrange) : type(t), isRange(true), low(lowrange), high(highrange), members(NULL) {
31 bool Set::exists(uint64_t element) {
33 return element >= low && element <= high;
37 uint high=members->getSize()-1;
39 uint middle=(low+high)/2;
40 uint64_t val=members->get(middle);
45 } else if (element > val) {
56 uint64_t Set::getElement(uint index) {
60 return members->get(index);
65 return high - low + 1;
67 return members->getSize();
71 uint64_t Set::getMemberAt(uint index) {
75 return members->get(index);
84 Set *Set::clone(CSolver *solver, CloneMap *map) {
85 Set *s = (Set *) map->get(this);
89 s = solver->createRangeSet(type, low, high);
91 s = solver->createSet(type, members->expose(), members->getSize());
97 uint Set::getUnionSize(Set *s) {
98 uint sSize = s->getSize();
99 uint thisSize = getSize();
103 uint64_t sValue = s->getElement(sIndex);
104 uint64_t thisValue = getElement(thisIndex);
105 while(thisIndex < thisSize && sIndex < sSize) {
106 if (sValue < thisValue) {
107 sValue = s->getElement(++sIndex);
109 } else if (thisValue < sValue) {
110 thisValue = getElement(++thisIndex);
113 thisValue = getElement(++thisIndex);
114 sValue = s->getElement(++sIndex);
118 sum += (thisSize - thisIndex) + (sSize - sIndex);
123 void Set::serialize(Serializer* serializer){
124 if(serializer->isSerialized(this))
126 serializer->addObject(this);
127 ASTNodeType asttype = SETTYPE;
128 serializer->mywrite(&asttype, sizeof(ASTNodeType));
130 serializer->mywrite(&This, sizeof(Set*));
131 serializer->mywrite(&type, sizeof(VarType));
132 serializer->mywrite(&isRange, sizeof(bool));
133 serializer->mywrite(&low, sizeof(uint64_t));
134 serializer->mywrite(&high, sizeof(uint64_t));
135 uint size = members->getSize();
136 serializer->mywrite(&size, sizeof(uint));
137 for(uint i=0; i<size; i++){
138 uint64_t mem = members->get(i);
139 serializer->mywrite(&mem, sizeof(uint64_t));