Bug fix
[satune.git] / src / AST / set.cc
index c3050ec3f0c0e83ee24d87beb70466c59e8a4cf9..d3801f8d498eb98e3a55440a4ac7faf243a195f3 100644 (file)
@@ -4,10 +4,6 @@
 #include "serializer.h"
 #include "qsort.h"
 
-Set::Set(VarType t) : type(t), isRange(false), low(0), high(0) {
-       members = new Vector<uint64_t>();
-}
-
 int intcompare(const void *p1, const void *p2) {
        uint64_t a=*(uint64_t const *) p1;
        uint64_t b=*(uint64_t const *) p2;
@@ -19,6 +15,11 @@ int intcompare(const void *p1, const void *p2) {
                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);
@@ -39,12 +40,12 @@ bool Set::exists(uint64_t element) {
                        uint middle=(low+high)/2;
                        uint64_t val=members->get(middle);
                        if (element < val) {
-                               high=middle;
-                               if (middle==low)
+                               high=middle-1;
+                               if (middle<=low)
                                        return false;
                        } else if (element > val) {
-                               low=middle;
-                               if (middle==high)
+                               low=middle+1;
+                               if (middle>=high)
                                        return false;
                        } else {
                                return true;
@@ -132,6 +133,8 @@ void Set::serialize(Serializer* serializer){
        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++){