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;
35 uint size = members->getSize();
36 for (uint i = 0; i < size; i++) {
37 if (element == members->get(i))
44 uint64_t Set::getElement(uint index) {
48 return members->get(index);
53 return high - low + 1;
55 return members->getSize();
59 uint64_t Set::getMemberAt(uint index) {
63 return members->get(index);
72 Set *Set::clone(CSolver *solver, CloneMap *map) {
73 Set *s = (Set *) map->get(this);
77 s = solver->createRangeSet(type, low, high);
79 s = solver->createSet(type, members->expose(), members->getSize());
85 uint Set::getUnionSize(Set *s) {
86 uint sSize = s->getSize();
87 uint thisSize = getSize();
91 uint64_t sValue = s->getElement(sIndex);
92 uint64_t thisValue = getElement(thisIndex);
93 while(thisIndex < thisSize && sIndex < sSize) {
94 if (sValue < thisValue) {
95 sValue = s->getElement(++sIndex);
97 } else if (thisValue < sValue) {
98 thisValue = getElement(++thisIndex);
101 thisValue = getElement(++thisIndex);
102 sValue = s->getElement(++sIndex);
106 sum += (thisSize - thisIndex) + (sSize - sIndex);
111 void Set::serialize(Serializer* serializer){
112 if(serializer->isSerialized(this))
114 serializer->addObject(this);
115 ASTNodeType asttype = SETTYPE;
116 serializer->mywrite(&asttype, sizeof(ASTNodeType));
118 serializer->mywrite(&This, sizeof(Set*));
119 serializer->mywrite(&type, sizeof(VarType));
120 serializer->mywrite(&isRange, sizeof(bool));
121 serializer->mywrite(&low, sizeof(uint64_t));
122 serializer->mywrite(&high, sizeof(uint64_t));
123 uint size = members->getSize();
124 serializer->mywrite(&size, sizeof(uint));
125 for(uint i=0; i<size; i++){
126 uint64_t mem = members->get(i);
127 serializer->mywrite(&mem, sizeof(uint64_t));