Rewrite function operator code
[satune.git] / src / AST / function.c
1 #include "function.h"
2 #include "table.h"
3 #include "set.h"
4
5
6 Function* allocFunctionOperator(ArithOp op, Set ** domain, uint numDomain, Set * range, OverFlowBehavior overflowbehavior) {
7         FunctionOperator* This = (FunctionOperator*) ourmalloc(sizeof(FunctionOperator));
8         GETFUNCTIONTYPE(This)=OPERATORFUNC;
9         initArrayInitSet(&This->domains, domain, numDomain);
10         This->op=op;
11         This->overflowbehavior = overflowbehavior;
12         This->range=range;
13         return &This->base;
14 }
15
16 Function* allocFunctionTable (Table* table){
17         FunctionTable* This = (FunctionTable*) ourmalloc(sizeof(FunctionTable));
18         GETFUNCTIONTYPE(This)=TABLEFUNC;
19         This->table = table;
20         return &This->base;
21 }
22
23 uint64_t applyFunctionOperator(FunctionOperator* This, uint numVals, uint64_t * values) {
24         ASSERT(numVals == 2);
25         switch(This->op){
26                 case ADD:
27                         return values[0] + values[1];
28                         break;
29                 case SUB:
30                         return values[0] - values[1];
31                         break;
32                 default:
33                         ASSERT(0);
34         }
35 }
36
37 bool isInRangeFunction(FunctionOperator *This, uint64_t val) {
38         return existsInSet(This->range, val);
39 }
40
41 void deleteFunction(Function* This){
42         switch(GETFUNCTIONTYPE(This)){
43         case TABLEFUNC:
44                 break;
45         case OPERATORFUNC:
46                 deleteInlineArraySet(&((FunctionOperator*) This)->domains);
47                 break;
48         default:
49                 ASSERT(0);
50         }
51         ourfree(This);
52 }