Adding an API for finalizing MutableSet
[satune.git] / src / AST / set.cc
index e33bad0e65308827771f53cb24ac7b78995cdbf8..66f8461ace3a070975749dfccd479f4a5b98b55a 100644 (file)
@@ -1,15 +1,31 @@
 #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) {
 }
 
@@ -41,10 +57,10 @@ uint Set::getSize() {
        }
 }
 
-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);
        }
 }
@@ -66,3 +82,26 @@ Set *Set::clone(CSolver *solver, CloneMap *map) {
        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));
+       }
+}