Finish clone
[satune.git] / src / AST / set.cc
1 #include "set.h"
2 #include <stddef.h>
3 #include "csolver.h"
4
5 Set::Set(VarType t) : type(t), isRange(false), low(0), high(0) {
6         members = new Vector<uint64_t>();
7 }
8
9 Set::Set(VarType t, uint64_t *elements, uint num) : type(t), isRange(false), low(0), high(0) {
10         members = new Vector<uint64_t>(num, elements);
11 }
12
13 Set::Set(VarType t, uint64_t lowrange, uint64_t highrange) : type(t), isRange(true), low(lowrange), high(highrange), members(NULL) {
14 }
15
16 bool Set::exists(uint64_t element) {
17         if (isRange) {
18                 return element >= low && element <= high;
19         } else {
20                 uint size = members->getSize();
21                 for (uint i = 0; i < size; i++) {
22                         if (element == members->get(i))
23                                 return true;
24                 }
25                 return false;
26         }
27 }
28
29 uint64_t Set::getElement(uint index) {
30         if (isRange)
31                 return low + index;
32         else
33                 return members->get(index);
34 }
35
36 uint Set::getSize() {
37         if (isRange) {
38                 return high - low + 1;
39         } else {
40                 return members->getSize();
41         }
42 }
43
44 Set::~Set() {
45         if (!isRange)
46                 delete members;
47 }
48
49 Set *Set::clone(CSolver *solver, CloneMap *map) {
50         Set *s = (Set *) map->get(this);
51         if (s != NULL)
52                 return s;
53         if (isRange) {
54                 s = solver->createRangeSet(type, low, high);
55         } else {
56                 s = solver->createSet(type, members->expose(), members->getSize());
57         }
58         map->put(this, s);
59         return s;
60 }