Edits
[satune.git] / src / AST / table.cc
index d54aefbac1b03c3babb4a3e0a530cdf24ce0088b..5786b173d2499ebe9dc499630343aeaf46723da0 100644 (file)
@@ -4,11 +4,13 @@
 #include "tableentry.h"
 #include "set.h"
 #include "mutableset.h"
+#include "csolver.h"
+#include "serializer.h"
 
 Table::Table(Set **_domains, uint numDomain, Set *_range) :
        domains(_domains, numDomain),
        range(_range) {
-       entries = new HashSetTableEntry();
+       entries = new HashsetTableEntry();
 }
 
 void Table::addNewTableEntry(uint64_t *inputs, uint inputSize, uint64_t result) {
@@ -28,8 +30,28 @@ TableEntry *Table::getTableEntry(uint64_t *inputs, uint inputSize) {
        return result;
 }
 
+Table *Table::clone(CSolver *solver, CloneMap *map) {
+       Table *t = (Table *) map->get(this);
+       if (t != NULL)
+               return t;
+       Set *array[domains.getSize()];
+       for (uint i = 0; i < domains.getSize(); i++) {
+               array[i] = domains.get(i)->clone(solver, map);
+       }
+       Set *rcopy = range != NULL ? range->clone(solver, map) : NULL;
+       t = solver->createTable(array, domains.getSize(), rcopy);
+       SetIteratorTableEntry *entryit = entries->iterator();
+       while (entryit->hasNext()) {
+               TableEntry *te = entryit->next();
+               solver->addTableEntry(t, &te->inputs[0], te->inputSize, te->output);
+       }
+       delete entryit;
+       map->put(this, t);
+       return t;
+}
+
 Table::~Table() {
-       HSIteratorTableEntry *iterator = entries->iterator();
+       SetIteratorTableEntry *iterator = entries->iterator();
        while (iterator->hasNext()) {
                deleteTableEntry(iterator->next());
        }
@@ -37,3 +59,55 @@ Table::~Table() {
        delete entries;
 }
 
+
+
+void Table::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
+               return;
+       serializer->addObject(this);
+
+       uint size = domains.getSize();
+       for (uint i = 0; i < size; i++) {
+               Set *domain = domains.get(i);
+               domain->serialize(serializer);
+       }
+       if (range != NULL)
+               range->serialize(serializer);
+
+       ASTNodeType type = TABLETYPE;
+       serializer->mywrite(&type, sizeof(ASTNodeType));
+       Table *This = this;
+       serializer->mywrite(&This, sizeof(Table *));
+       serializer->mywrite(&size, sizeof(uint));
+       for (uint i = 0; i < size; i++) {
+               Set *domain = domains.get(i);
+               serializer->mywrite(&domain, sizeof(Set *));
+       }
+       serializer->mywrite(&range, sizeof(Set *));
+       size = entries->getSize();
+       serializer->mywrite(&size, sizeof(uint));
+       SetIteratorTableEntry *iterator = getEntries();
+       while (iterator->hasNext()) {
+               TableEntry *entry = iterator->next();
+               serializer->mywrite(&entry->output, sizeof(uint64_t));
+               serializer->mywrite(&entry->inputSize, sizeof(uint));
+               serializer->mywrite(entry->inputs, sizeof(uint64_t) * entry->inputSize);
+       }
+       delete iterator;
+}
+
+
+void Table::print() {
+       model_print("{Table:\n");
+       SetIteratorTableEntry *iterator = getEntries();
+       while (iterator->hasNext()) {
+               TableEntry *entry = iterator->next();
+               model_print("<");
+               for (uint i = 0; i < entry->inputSize; i++) {
+                       model_print("%lu, ", entry->inputs[i]);
+               }
+               model_print(" == %lu>", entry->output);
+       }
+       model_print("}\n");
+       delete iterator;
+}