completed serializer/deserializer
[satune.git] / src / AST / function.h
index 158a55c9059f0650b2dbab700af63434781ea844..98ef53641b926a0b78132e5ee65ffcfd3cce95a6 100644 (file)
@@ -3,30 +3,44 @@
 #include "classlist.h"
 #include "mymemory.h"
 #include "ops.h"
+#include "astops.h"
 #include "structs.h"
 
-#define GETFUNCTIONTYPE(o) (((Function*)o)->type)
-
-struct Function {
+class Function {
+public:
+       Function(FunctionType _type) : type(_type) {}
        FunctionType type;
+       virtual ~Function() {}
+       virtual Function *clone(CSolver *solver, CloneMap *map) {ASSERT(0); return NULL;}
+       virtual void serialize(Serializer* serialiezr) =0;
+       virtual Set * getRange() = 0;
+       CMEMALLOC;
 };
 
-struct FunctionOperator {
-       Function base;
+class FunctionOperator : public Function {
+public:
        ArithOp op;
-       ArraySet domains;
-       Set * range;
+       Array<Set *> domains;
+       Set *range;
        OverFlowBehavior overflowbehavior;
+       FunctionOperator(ArithOp op, Set **domain, uint numDomain, Set *range, OverFlowBehavior overflowbehavior);
+       uint64_t applyFunctionOperator(uint numVals, uint64_t *values);
+       bool isInRangeFunction(uint64_t val);
+       Function *clone(CSolver *solver, CloneMap *map);
+       virtual void serialize(Serializer* serialiezr);
+       Set * getRange() {return range;}
+       CMEMALLOC;
 };
 
-struct FunctionTable {
-       Function base;
-       Table* table;
+class FunctionTable : public Function {
+public:
+       Table *table;
+       UndefinedBehavior undefBehavior;
+       FunctionTable (Table *table, UndefinedBehavior behavior);
+       Function *clone(CSolver *solver, CloneMap *map);
+       virtual void serialize(Serializer* serialiezr);
+       Set * getRange();
+       CMEMALLOC;
 };
 
-Function* allocFunctionOperator( ArithOp op, Set ** domain, uint numDomain, Set * range,OverFlowBehavior overflowbehavior);
-Function* allocFunctionTable (Table* table);
-uint64_t applyFunctionOperator(FunctionOperator* func, uint64_t var1, uint64_t var2, bool* isInrange);
-void deleteFunction(Function* This);
-
 #endif