5 #include "serializer.h"
7 FunctionOperator::FunctionOperator(ArithOp _op, Set **domain, uint numDomain, Set *_range, OverFlowBehavior _overflowbehavior) :
8 Function(OPERATORFUNC),
10 domains(domain, numDomain),
12 overflowbehavior(_overflowbehavior) {
15 FunctionTable::FunctionTable (Table *_table, UndefinedBehavior _undefBehavior) :
18 undefBehavior(_undefBehavior) {
21 uint64_t FunctionOperator::applyFunctionOperator(uint numVals, uint64_t *values) {
25 return values[0] + values[1];
28 return values[0] - values[1];
35 bool FunctionOperator::isInRangeFunction(uint64_t val) {
36 return range->exists(val);
39 Function *FunctionOperator::clone(CSolver *solver, CloneMap *map) {
40 Function *f = (Function *) map->get(this);
44 Set *array[domains.getSize()];
45 for (uint i = 0; i < domains.getSize(); i++) {
46 array[i] = domains.get(i)->clone(solver, map);
48 Set *rcopy = range->clone(solver, map);
49 f = solver->createFunctionOperator(op, array, domains.getSize(), rcopy, overflowbehavior);
54 Function *FunctionTable::clone(CSolver *solver, CloneMap *map) {
55 Function *f = (Function *) map->get(this);
59 Table *tcopy = table->clone(solver, map);
60 f = solver->completeTable(tcopy, undefBehavior);
65 Set *FunctionTable::getRange() {
66 return table->getRange();
69 void FunctionTable::serialize(Serializer *serializer) {
70 if (serializer->isSerialized(this))
72 serializer->addObject(this);
74 table->serialize(serializer);
76 ASTNodeType type = FUNCTABLETYPE;
77 serializer->mywrite(&type, sizeof(ASTNodeType));
78 FunctionTable *This = this;
79 serializer->mywrite(&This, sizeof(FunctionTable *));
80 serializer->mywrite(&table, sizeof(Table *));
81 serializer->mywrite(&undefBehavior, sizeof(UndefinedBehavior));
85 void FunctionTable::print() {
86 model_print("{FunctionTable:\n");
91 void FunctionOperator::serialize(Serializer *serializer) {
92 if (serializer->isSerialized(this))
94 serializer->addObject(this);
96 uint size = domains.getSize();
97 for (uint i = 0; i < size; i++) {
98 Set *domain = domains.get(i);
99 domain->serialize(serializer);
101 range->serialize(serializer);
103 ASTNodeType nodeType = FUNCOPTYPE;
104 serializer->mywrite(&nodeType, sizeof(ASTNodeType));
105 FunctionOperator *This = this;
106 serializer->mywrite(&This, sizeof(FunctionOperator *));
107 serializer->mywrite(&op, sizeof(ArithOp));
108 serializer->mywrite(&size, sizeof(uint));
109 for (uint i = 0; i < size; i++) {
110 Set *domain = domains.get(i);
111 serializer->mywrite(&domain, sizeof(Set *));
113 serializer->mywrite(&range, sizeof(Set *));
114 serializer->mywrite(&overflowbehavior, sizeof(OverFlowBehavior));
117 void FunctionOperator::print() {
118 model_print("{FunctionOperator: %s}\n", op == SATC_ADD ? "ADD" : "SUB" );