4 #include "tableentry.h"
6 #include "mutableset.h"
8 #include "serializer.h"
10 Table::Table(Set **_domains, uint numDomain, Set *_range) :
11 domains(_domains, numDomain),
13 entries = new HashsetTableEntry();
16 void Table::addNewTableEntry(uint64_t *inputs, uint inputSize, uint64_t result) {
19 ASSERT(result == true || result == false);
21 TableEntry *tb = allocTableEntry(inputs, inputSize, result);
22 bool status = entries->add(tb);
26 TableEntry *Table::getTableEntry(uint64_t *inputs, uint inputSize) {
27 TableEntry *temp = allocTableEntry(inputs, inputSize, -1);
28 TableEntry *result = entries->get(temp);
29 deleteTableEntry(temp);
33 Table *Table::clone(CSolver *solver, CloneMap *map) {
34 Table *t = (Table *) map->get(this);
37 Set *array[domains.getSize()];
38 for (uint i = 0; i < domains.getSize(); i++) {
39 array[i] = domains.get(i)->clone(solver, map);
41 Set *rcopy = range != NULL ? range->clone(solver, map) : NULL;
42 t = solver->createTable(array, domains.getSize(), rcopy);
43 SetIteratorTableEntry *entryit = entries->iterator();
44 while (entryit->hasNext()) {
45 TableEntry *te = entryit->next();
46 solver->addTableEntry(t, &te->inputs[0], te->inputSize, te->output);
54 SetIteratorTableEntry *iterator = entries->iterator();
55 while (iterator->hasNext()) {
56 deleteTableEntry(iterator->next());
64 void Table::serialize(Serializer *serializer) {
65 if (serializer->isSerialized(this))
67 serializer->addObject(this);
69 uint size = domains.getSize();
70 for (uint i = 0; i < size; i++) {
71 Set *domain = domains.get(i);
72 domain->serialize(serializer);
75 range->serialize(serializer);
77 ASTNodeType type = TABLETYPE;
78 serializer->mywrite(&type, sizeof(ASTNodeType));
80 serializer->mywrite(&This, sizeof(Table *));
81 serializer->mywrite(&size, sizeof(uint));
82 for (uint i = 0; i < size; i++) {
83 Set *domain = domains.get(i);
84 serializer->mywrite(&domain, sizeof(Set *));
86 serializer->mywrite(&range, sizeof(Set *));
87 size = entries->getSize();
88 serializer->mywrite(&size, sizeof(uint));
89 SetIteratorTableEntry *iterator = getEntries();
90 while (iterator->hasNext()) {
91 TableEntry *entry = iterator->next();
92 serializer->mywrite(&entry->output, sizeof(uint64_t));
93 serializer->mywrite(&entry->inputSize, sizeof(uint));
94 serializer->mywrite(entry->inputs, sizeof(uint64_t) * entry->inputSize);
100 void Table::print() {
101 model_print("{Table:\n");
102 SetIteratorTableEntry *iterator = getEntries();
103 while (iterator->hasNext()) {
104 TableEntry *entry = iterator->next();
106 for (uint i = 0; i < entry->inputSize; i++) {
107 model_print("%lu, ", entry->inputs[i]);
109 model_print(" == %lu>", entry->output);