#include "csolver.h"
#include "serializer.h"
-Table::Table(Set **_domains, uint numDomain, Set *_range) :
- domains(_domains, numDomain),
+Table::Table(Set *_range) :
range(_range) {
entries = new HashsetTableEntry();
}
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);
+ t = solver->createTable(rcopy);
SetIteratorTableEntry *entryit = entries->iterator();
while (entryit->hasNext()) {
TableEntry *te = entryit->next();
delete entries;
}
-
-
-void Table::serialize(Serializer* serializer){
- if(serializer->isSerialized(this))
+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)
+
+ if (range != NULL)
range->serialize(serializer);
-
- ASTNodeType type = TABLETYPE;
+
+ 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();
+ Table *This = this;
+ serializer->mywrite(&This, sizeof(Table *));
+ serializer->mywrite(&range, sizeof(Set *));
+ uint size = entries->getSize();
serializer->mywrite(&size, sizeof(uint));
- SetIteratorTableEntry* iterator = getEntries();
- while(iterator->hasNext()){
- TableEntry* entry = iterator->next();
+ 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<%p>:\n", this);
+ 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;
+}