#include "set.h"
#include <stddef.h>
#include "csolver.h"
+#include "serializer.h"
+#include "qsort.h"
+
+int intcompare(const void *p1, const void *p2) {
+ uint64_t a=*(uint64_t const *) p1;
+ uint64_t b=*(uint64_t const *) p2;
+ if (a < b)
+ return -1;
+ else if (a==b)
+ return 0;
+ else
+ return 1;
+}
Set::Set(VarType t) : type(t), isRange(false), low(0), high(0) {
members = new Vector<uint64_t>();
}
+
Set::Set(VarType t, uint64_t *elements, uint num) : type(t), isRange(false), low(0), high(0) {
members = new Vector<uint64_t>(num, elements);
+ bsdqsort(members->expose(), members->getSize(), sizeof(uint64_t), intcompare);
}
+
Set::Set(VarType t, uint64_t lowrange, uint64_t highrange) : type(t), isRange(true), low(lowrange), high(highrange), members(NULL) {
}
}
}
-uint64_t Set::getMemberAt(uint index){
- if(isRange){
- return low+index;
- }else {
+uint64_t Set::getMemberAt(uint index) {
+ if (isRange) {
+ return low + index;
+ } else {
return members->get(index);
}
}
map->put(this, s);
return s;
}
+
+
+void Set::serialize(Serializer* serializer){
+ if(serializer->isSerialized(this))
+ return;
+ serializer->addObject(this);
+ ASTNodeType asttype = SETTYPE;
+ serializer->mywrite(&asttype, sizeof(ASTNodeType));
+ Set* This = this;
+ serializer->mywrite(&This, sizeof(Set*));
+ serializer->mywrite(&type, sizeof(VarType));
+ serializer->mywrite(&isRange, sizeof(bool));
+ serializer->mywrite(&low, sizeof(uint64_t));
+ serializer->mywrite(&high, sizeof(uint64_t));
+ bool isMutable = isMutableSet();
+ serializer->mywrite(&isMutable, sizeof(bool));
+ uint size = members->getSize();
+ serializer->mywrite(&size, sizeof(uint));
+ for(uint i=0; i<size; i++){
+ uint64_t mem = members->get(i);
+ serializer->mywrite(&mem, sizeof(uint64_t));
+ }
+}