Restructure transforms a little and run make tabbing
[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 uint64_t Set::getMemberAt(uint index) {
45         if (isRange) {
46                 return low + index;
47         } else {
48                 return members->get(index);
49         }
50 }
51
52 Set::~Set() {
53         if (!isRange)
54                 delete members;
55 }
56
57 Set *Set::clone(CSolver *solver, CloneMap *map) {
58         Set *s = (Set *) map->get(this);
59         if (s != NULL)
60                 return s;
61         if (isRange) {
62                 s = solver->createRangeSet(type, low, high);
63         } else {
64                 s = solver->createSet(type, members->expose(), members->getSize());
65         }
66         map->put(this, s);
67         return s;
68 }