X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=src%2FAST%2Fset.cc;h=4e7383aa7193be39450efa026c4eb97880e87c75;hb=5567c0959b9e3bcdebcf3c2dfab9af3728fe25c2;hp=c9e64ffb035a60b8cf6c6f8777b1400efad8ba92;hpb=78450a264304838bdf91bbab742dd32dae643fca;p=satune.git diff --git a/src/AST/set.cc b/src/AST/set.cc index c9e64ff..4e7383a 100644 --- a/src/AST/set.cc +++ b/src/AST/set.cc @@ -1,8 +1,13 @@ #include "set.h" #include +#include "csolver.h" + +Set::Set(VarType t) : type(t), isRange(false), low(0), high(0) { + members = new Vector(); +} Set::Set(VarType t, uint64_t *elements, uint num) : type(t), isRange(false), low(0), high(0) { - members = allocVectorArrayInt(num, elements); + members = new Vector(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,39 @@ 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(); + } +} + +uint64_t Set::getMemberAt(uint index) { + if (isRange) { + return low + index; + } else { + return members->get(index); } } 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; }