Adding function operator handler+ omitting some redundant codes
[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         allocInlineArrayInitSet(&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* func, uint64_t var1, uint64_t var2, bool* isInRange, bool* hasOverFlow){
24         uint64_t result = 0;
25         switch( func->op){
26                 case ADD:
27                         result = var1+ var2;
28                         if(result < var1){
29                                 *hasOverFlow=true;
30                         }
31                         break;
32                 case SUB:
33                         result = var1 - var2;
34                         //FIXME: Should we consider underflow as well?
35                         break;
36                 default:
37                         ASSERT(0);
38         }
39         *isInRange = existsInSet(func->range, result);
40         return result;
41 }
42
43 void deleteFunction(Function* This){
44         switch(GETFUNCTIONTYPE(This)){
45         case TABLEFUNC:
46                 break;
47         case OPERATORFUNC:
48                 deleteInlineArraySet(&((FunctionOperator*) This)->domains);
49                 break;
50         default:
51                 ASSERT(0);
52         }
53         ourfree(This);
54 }