4 #include "tableentry.h"
6 #include "mutableset.h"
8 #include "serializer.h"
10 Table::Table(Set *_range) :
12 entries = new HashsetTableEntry();
15 void Table::addNewTableEntry(uint64_t *inputs, uint inputSize, uint64_t result) {
18 ASSERT(result == true || result == false);
20 TableEntry *tb = allocTableEntry(inputs, inputSize, result);
21 bool status = entries->add(tb);
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);
32 Table *Table::clone(CSolver *solver, CloneMap *map) {
33 Table *t = (Table *) map->get(this);
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);
50 SetIteratorTableEntry *iterator = entries->iterator();
51 while (iterator->hasNext()) {
52 deleteTableEntry(iterator->next());
58 void Table::serialize(Serializer *serializer) {
59 if (serializer->isSerialized(this))
61 serializer->addObject(this);
64 range->serialize(serializer);
66 ASTNodeType type = TABLETYPE;
67 serializer->mywrite(&type, sizeof(ASTNodeType));
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);
84 model_print("{Table<%p>:\n", this);
85 SetIteratorTableEntry *iterator = getEntries();
86 while (iterator->hasNext()) {
87 TableEntry *entry = iterator->next();
89 for (uint i = 0; i < entry->inputSize; i++) {
90 model_print("%lu, ", entry->inputs[i]);
92 model_print(" == %lu>", entry->output);