remove redundant domains
[satune.git] / src / AST / table.cc
1 #include "table.h"
2 #include "common.h"
3 #include "structs.h"
4 #include "tableentry.h"
5 #include "set.h"
6 #include "mutableset.h"
7 #include "csolver.h"
8 #include "serializer.h"
9
10 Table::Table(Set *_range) :
11         range(_range) {
12         entries = new HashsetTableEntry();
13 }
14
15 void Table::addNewTableEntry(uint64_t *inputs, uint inputSize, uint64_t result) {
16 #ifdef CONFIG_ASSERT
17         if (range == NULL)
18                 ASSERT(result == true || result == false);
19 #endif
20         TableEntry *tb = allocTableEntry(inputs, inputSize, result);
21         bool status = entries->add(tb);
22         ASSERT(status);
23 }
24
25 TableEntry *Table::getTableEntry(uint64_t *inputs, uint inputSize) {
26         TableEntry *temp = allocTableEntry(inputs, inputSize, -1);
27         TableEntry *result = entries->get(temp);
28         deleteTableEntry(temp);
29         return result;
30 }
31
32 Table *Table::clone(CSolver *solver, CloneMap *map) {
33         Table *t = (Table *) map->get(this);
34         if (t != NULL)
35                 return t;
36
37         Set *rcopy = range != NULL ? range->clone(solver, map) : NULL;
38         t = solver->createTable(rcopy);
39         SetIteratorTableEntry *entryit = entries->iterator();
40         while (entryit->hasNext()) {
41                 TableEntry *te = entryit->next();
42                 solver->addTableEntry(t, &te->inputs[0], te->inputSize, te->output);
43         }
44         delete entryit;
45         map->put(this, t);
46         return t;
47 }
48
49 Table::~Table() {
50         SetIteratorTableEntry *iterator = entries->iterator();
51         while (iterator->hasNext()) {
52                 deleteTableEntry(iterator->next());
53         }
54         delete iterator;
55         delete entries;
56 }
57
58 void Table::serialize(Serializer *serializer) {
59         if (serializer->isSerialized(this))
60                 return;
61         serializer->addObject(this);
62
63         if (range != NULL)
64                 range->serialize(serializer);
65
66         ASTNodeType type = TABLETYPE;
67         serializer->mywrite(&type, sizeof(ASTNodeType));
68         Table *This = this;
69         serializer->mywrite(&This, sizeof(Table *));
70         serializer->mywrite(&range, sizeof(Set *));
71         uint size = entries->getSize();
72         serializer->mywrite(&size, sizeof(uint));
73         SetIteratorTableEntry *iterator = getEntries();
74         while (iterator->hasNext()) {
75                 TableEntry *entry = iterator->next();
76                 serializer->mywrite(&entry->output, sizeof(uint64_t));
77                 serializer->mywrite(&entry->inputSize, sizeof(uint));
78                 serializer->mywrite(entry->inputs, sizeof(uint64_t) * entry->inputSize);
79         }
80         delete iterator;
81 }
82
83 void Table::print() {
84         model_print("{Table<%p>:\n", this);
85         SetIteratorTableEntry *iterator = getEntries();
86         while (iterator->hasNext()) {
87                 TableEntry *entry = iterator->next();
88                 model_print("<");
89                 for (uint i = 0; i < entry->inputSize; i++) {
90                         model_print("%lu, ", entry->inputs[i]);
91                 }
92                 model_print(" == %lu>", entry->output);
93         }
94         model_print("}\n");
95         delete iterator;
96 }