5 #include "serializer.h"
7 FunctionOperator::FunctionOperator(ArithOp _op, Set *_range, OverFlowBehavior _overflowbehavior) :
8 Function(OPERATORFUNC),
11 overflowbehavior(_overflowbehavior) {
14 FunctionTable::FunctionTable (Table *_table, UndefinedBehavior _undefBehavior) :
17 undefBehavior(_undefBehavior) {
20 uint64_t FunctionOperator::applyFunctionOperator(uint numVals, uint64_t *values) {
24 return values[0] + values[1];
27 return values[0] - values[1];
34 bool FunctionOperator::isInRangeFunction(uint64_t val) {
35 return range->exists(val);
38 Function *FunctionOperator::clone(CSolver *solver, CloneMap *map) {
39 Function *f = (Function *) map->get(this);
43 Set *rcopy = range->clone(solver, map);
44 f = solver->createFunctionOperator(op, rcopy, overflowbehavior);
49 Function *FunctionTable::clone(CSolver *solver, CloneMap *map) {
50 Function *f = (Function *) map->get(this);
54 Table *tcopy = table->clone(solver, map);
55 f = solver->completeTable(tcopy, undefBehavior);
60 Set *FunctionTable::getRange() {
61 return table->getRange();
64 void FunctionTable::serialize(Serializer *serializer) {
65 if (serializer->isSerialized(this))
67 serializer->addObject(this);
69 table->serialize(serializer);
71 ASTNodeType type = FUNCTABLETYPE;
72 serializer->mywrite(&type, sizeof(ASTNodeType));
73 FunctionTable *This = this;
74 serializer->mywrite(&This, sizeof(FunctionTable *));
75 serializer->mywrite(&table, sizeof(Table *));
76 serializer->mywrite(&undefBehavior, sizeof(UndefinedBehavior));
80 void FunctionTable::print() {
81 model_print("{FunctionTable<%p>:\n", this);
86 void FunctionOperator::serialize(Serializer *serializer) {
87 if (serializer->isSerialized(this))
89 serializer->addObject(this);
90 range->serialize(serializer);
92 ASTNodeType nodeType = FUNCOPTYPE;
93 serializer->mywrite(&nodeType, sizeof(ASTNodeType));
94 FunctionOperator *This = this;
95 serializer->mywrite(&This, sizeof(FunctionOperator *));
96 serializer->mywrite(&op, sizeof(ArithOp));
97 serializer->mywrite(&range, sizeof(Set *));
98 serializer->mywrite(&overflowbehavior, sizeof(OverFlowBehavior));
101 void FunctionOperator::print() {
102 model_print("{FunctionOperator<%p>: %s}\n", this, op == SATC_ADD ? "ADD" : "SUB" );