66f8461ace3a070975749dfccd479f4a5b98b55a
[satune.git] / src / AST / set.cc
1 #include "set.h"
2 #include <stddef.h>
3 #include "csolver.h"
4 #include "serializer.h"
5 #include "qsort.h"
6
7 int intcompare(const void *p1, const void *p2) {
8         uint64_t a=*(uint64_t const *) p1;
9         uint64_t b=*(uint64_t const *) p2;
10         if (a < b)
11                 return -1;
12         else if (a==b)
13                 return 0;
14         else
15                 return 1;
16 }
17
18 Set::Set(VarType t) : type(t), isRange(false), low(0), high(0) {
19         members = new Vector<uint64_t>();
20 }
21
22
23 Set::Set(VarType t, uint64_t *elements, uint num) : type(t), isRange(false), low(0), high(0) {
24         members = new Vector<uint64_t>(num, elements);
25         bsdqsort(members->expose(), members->getSize(), sizeof(uint64_t), intcompare);
26 }
27
28
29 Set::Set(VarType t, uint64_t lowrange, uint64_t highrange) : type(t), isRange(true), low(lowrange), high(highrange), members(NULL) {
30 }
31
32 bool Set::exists(uint64_t element) {
33         if (isRange) {
34                 return element >= low && element <= high;
35         } else {
36                 uint size = members->getSize();
37                 for (uint i = 0; i < size; i++) {
38                         if (element == members->get(i))
39                                 return true;
40                 }
41                 return false;
42         }
43 }
44
45 uint64_t Set::getElement(uint index) {
46         if (isRange)
47                 return low + index;
48         else
49                 return members->get(index);
50 }
51
52 uint Set::getSize() {
53         if (isRange) {
54                 return high - low + 1;
55         } else {
56                 return members->getSize();
57         }
58 }
59
60 uint64_t Set::getMemberAt(uint index) {
61         if (isRange) {
62                 return low + index;
63         } else {
64                 return members->get(index);
65         }
66 }
67
68 Set::~Set() {
69         if (!isRange)
70                 delete members;
71 }
72
73 Set *Set::clone(CSolver *solver, CloneMap *map) {
74         Set *s = (Set *) map->get(this);
75         if (s != NULL)
76                 return s;
77         if (isRange) {
78                 s = solver->createRangeSet(type, low, high);
79         } else {
80                 s = solver->createSet(type, members->expose(), members->getSize());
81         }
82         map->put(this, s);
83         return s;
84 }
85
86
87 void Set::serialize(Serializer* serializer){
88         if(serializer->isSerialized(this))
89                 return;
90         serializer->addObject(this);
91         ASTNodeType asttype = SETTYPE;
92         serializer->mywrite(&asttype, sizeof(ASTNodeType));
93         Set* This = this;
94         serializer->mywrite(&This, sizeof(Set*));
95         serializer->mywrite(&type, sizeof(VarType));
96         serializer->mywrite(&isRange, sizeof(bool));
97         serializer->mywrite(&low, sizeof(uint64_t));
98         serializer->mywrite(&high, sizeof(uint64_t));
99         bool isMutable = isMutableSet();
100         serializer->mywrite(&isMutable, sizeof(bool));
101         uint size = members->getSize();
102         serializer->mywrite(&size, sizeof(uint));
103         for(uint i=0; i<size; i++){
104                 uint64_t mem = members->get(i);
105                 serializer->mywrite(&mem, sizeof(uint64_t));
106         }
107 }