c4e95941a2fbd66e4a56ebe52a77b607ba34c1bd
[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
9 Table::Table(Set **_domains, uint numDomain, Set *_range) :
10         domains(_domains, numDomain),
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         Set *array[domains.getSize()];
37         for (uint i = 0; i < domains.getSize(); i++) {
38                 array[i] = domains.get(i)->clone(solver, map);
39         }
40         Set *rcopy = range != NULL ? range->clone(solver, map) : NULL;
41         t = solver->createTable(array, domains.getSize(), rcopy);
42         HSIteratorTableEntry *entryit = entries->iterator();
43         while (entryit->hasNext()) {
44                 TableEntry *te = entryit->next();
45                 solver->addTableEntry(t, &te->inputs[0], te->inputSize, te->output);
46         }
47         delete entryit;
48         map->put(this, t);
49         return t;
50 }
51
52 Table::~Table() {
53         HSIteratorTableEntry *iterator = entries->iterator();
54         while (iterator->hasNext()) {
55                 deleteTableEntry(iterator->next());
56         }
57         delete iterator;
58         delete entries;
59 }
60