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;
36 uint size = members->getSize();
37 for (uint i = 0; i < size; i++) {
38 if (element == members->get(i))
45 uint64_t Set::getElement(uint index) {
49 return members->get(index);
54 return high - low + 1;
56 return members->getSize();
60 uint64_t Set::getMemberAt(uint index) {
64 return members->get(index);
73 Set *Set::clone(CSolver *solver, CloneMap *map) {
74 Set *s = (Set *) map->get(this);
78 s = solver->createRangeSet(type, low, high);
80 s = solver->createSet(type, members->expose(), members->getSize());
87 void Set::serialize(Serializer* serializer){
88 if(serializer->isSerialized(this))
90 serializer->addObject(this);
91 ASTNodeType asttype = SETTYPE;
92 serializer->mywrite(&asttype, sizeof(ASTNodeType));
94 serializer->mywrite(&This, sizeof(Set*));
95 serializer->mywrite(&type, sizeof(VarType));
96 serializer->mywrite(&isRange, sizeof(bool));
97 serializer->mywrite(&low, sizeof(uint64_t));
98 serializer->mywrite(&high, sizeof(uint64_t));
99 bool isMutable = isMutableSet();
100 serializer->mywrite(&isMutable, sizeof(bool));
101 uint size = members->getSize();
102 serializer->mywrite(&size, sizeof(uint));
103 for(uint i=0; i<size; i++){
104 uint64_t mem = members->get(i);
105 serializer->mywrite(&mem, sizeof(uint64_t));