Finish clone
[satune.git] / src / AST / predicate.cc
index 0e04668a6ac719d8c49582f3982fe062734fad35..99cd311757051f10da2a8dccb0a4b6062fda65f3 100644 (file)
@@ -2,6 +2,7 @@
 #include "boolean.h"
 #include "set.h"
 #include "table.h"
+#include "csolver.h"
 
 PredicateOperator::PredicateOperator(CompOp _op, Set **domain, uint numDomain) : Predicate(OPERATORPRED), op(_op), domains(domain, numDomain) {
 }
@@ -25,3 +26,27 @@ bool PredicateOperator::evalPredicateOperator(uint64_t *inputs) {
        ASSERT(0);
        return false;
 }
+
+Predicate *PredicateOperator::clone(CSolver *solver, CloneMap *map) {
+       Predicate *p = (Predicate *) map->get(this);
+       if (p != NULL)
+               return p;
+
+       Set *array[domains.getSize()];
+       for (uint i = 0; i < domains.getSize(); i++)
+               array[i] = domains.get(i)->clone(solver, map);
+
+       p = solver->createPredicateOperator(op, array, domains.getSize());
+       map->put(this, p);
+       return p;
+}
+
+Predicate *PredicateTable::clone(CSolver *solver, CloneMap *map) {
+       Predicate *p = (Predicate *) map->get(this);
+       if (p != NULL)
+               return p;
+
+       p = solver->createPredicateTable(table->clone(solver, map), undefinedbehavior);
+       map->put(this, p);
+       return p;
+}