Finish clone
[satune.git] / src / AST / set.cc
index c9e64ffb035a60b8cf6c6f8777b1400efad8ba92..b0e1d8aabb6aadde4dc755b0a67f7ed545a6035c 100644 (file)
@@ -1,8 +1,13 @@
 #include "set.h"
 #include <stddef.h>
+#include "csolver.h"
+
+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 = allocVectorArrayInt(num, elements);
+       members = new Vector<uint64_t>(num, elements);
 }
 
 Set::Set(VarType t, uint64_t lowrange, uint64_t highrange) : type(t), isRange(true), low(lowrange), high(highrange), members(NULL) {
@@ -12,9 +17,9 @@ bool Set::exists(uint64_t element) {
        if (isRange) {
                return element >= low && element <= high;
        } else {
-               uint size = getSizeVectorInt(members);
+               uint size = members->getSize();
                for (uint i = 0; i < size; i++) {
-                       if (element == getVectorInt(members, i))
+                       if (element == members->get(i))
                                return true;
                }
                return false;
@@ -25,18 +30,31 @@ uint64_t Set::getElement(uint index) {
        if (isRange)
                return low + index;
        else
-               return getVectorInt(members, index);
+               return members->get(index);
 }
 
 uint Set::getSize() {
        if (isRange) {
                return high - low + 1;
        } else {
-               return getSizeVectorInt(members);
+               return members->getSize();
        }
 }
 
 Set::~Set() {
        if (!isRange)
-               deleteVectorInt(members);
+               delete members;
+}
+
+Set *Set::clone(CSolver *solver, CloneMap *map) {
+       Set *s = (Set *) map->get(this);
+       if (s != NULL)
+               return s;
+       if (isRange) {
+               s = solver->createRangeSet(type, low, high);
+       } else {
+               s = solver->createSet(type, members->expose(), members->getSize());
+       }
+       map->put(this, s);
+       return s;
 }