X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=src%2FAST%2Ffunction.h;h=2d65f61a009d0e4d6d744b527bbb7aadf37edf21;hb=d0d465672d8745d091999e9d5036260dbc47c8dd;hp=61a6148fb9a568d380a42e1d073a4096401e5a48;hpb=c393a0d9d17a8bae36b2635544db57fc919db906;p=satune.git diff --git a/src/AST/function.h b/src/AST/function.h index 61a6148..2d65f61 100644 --- a/src/AST/function.h +++ b/src/AST/function.h @@ -3,12 +3,46 @@ #include "classlist.h" #include "mymemory.h" #include "ops.h" +#include "astops.h" #include "structs.h" -struct Function { - enum ArithOp op; - VectorSet* domains; - Set * range; - enum OverFlowBehavior overflowbehavior; - Table* table; + +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 void print() = 0; + virtual Set *getRange() = 0; + CMEMALLOC; }; + +class FunctionOperator : public Function { +public: + ArithOp op; + Set *range; + OverFlowBehavior overflowbehavior; + FunctionOperator(ArithOp op, 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); + virtual void print(); + Set *getRange() {return range;} + CMEMALLOC; +}; + +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); + virtual void print(); + Set *getRange(); + CMEMALLOC; +}; + #endif