4 #include "serializer.h"
6 Set::Set(VarType t) : type(t), isRange(false), low(0), high(0) {
7 members = new Vector<uint64_t>();
10 Set::Set(VarType t, uint64_t *elements, uint num) : type(t), isRange(false), low(0), high(0) {
11 members = new Vector<uint64_t>(num, elements);
14 Set::Set(VarType t, uint64_t lowrange, uint64_t highrange) : type(t), isRange(true), low(lowrange), high(highrange), members(NULL) {
17 bool Set::exists(uint64_t element) {
19 return element >= low && element <= high;
21 uint size = members->getSize();
22 for (uint i = 0; i < size; i++) {
23 if (element == members->get(i))
30 uint64_t Set::getElement(uint index) {
34 return members->get(index);
39 return high - low + 1;
41 return members->getSize();
45 uint64_t Set::getMemberAt(uint index) {
49 return members->get(index);
58 Set *Set::clone(CSolver *solver, CloneMap *map) {
59 Set *s = (Set *) map->get(this);
63 s = solver->createRangeSet(type, low, high);
65 s = solver->createSet(type, members->expose(), members->getSize());
72 void Set::serialize(Serializer* serializer){
73 if(serializer->isSerialized(this))
75 serializer->addObject(this);
76 ASTNodeType asttype = SETTYPE;
77 serializer->mywrite(&asttype, sizeof(ASTNodeType));
79 serializer->mywrite(&This, sizeof(Set*));
80 serializer->mywrite(&type, sizeof(VarType));
81 serializer->mywrite(&isRange, sizeof(bool));
82 serializer->mywrite(&low, sizeof(uint64_t));
83 serializer->mywrite(&high, sizeof(uint64_t));
84 uint size = members->getSize();
85 serializer->mywrite(&size, sizeof(uint));
86 for(uint i=0; i<size; i++){
87 uint64_t mem = members->get(i);
88 serializer->mywrite(&mem, sizeof(uint64_t));