Renaming
[satune.git] / src / AST / table.cc
index 016b3cce41ff49e866540555be390d09449b1e28..4d0716eb00b94def7db28c2794b6f1cc8e720503 100644 (file)
@@ -4,6 +4,7 @@
 #include "tableentry.h"
 #include "set.h"
 #include "mutableset.h"
+#include "csolver.h"
 
 Table::Table(Set **_domains, uint numDomain, Set *_range) :
        domains(_domains, numDomain),
@@ -21,15 +22,35 @@ void Table::addNewTableEntry(uint64_t *inputs, uint inputSize, uint64_t result)
        ASSERT(status);
 }
 
-TableEntry * Table::getTableEntry(uint64_t *inputs, uint inputSize) {
+TableEntry *Table::getTableEntry(uint64_t *inputs, uint inputSize) {
        TableEntry *temp = allocTableEntry(inputs, inputSize, -1);
        TableEntry *result = entries->get(temp);
        deleteTableEntry(temp);
        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());
        }