After merging with master branch ...
[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, UndefinedBehavior undefBehavior) {
17         FunctionTable *This = (FunctionTable *) ourmalloc(sizeof(FunctionTable));
18         GETFUNCTIONTYPE(This) = TABLEFUNC;
19         This->table = table;
20         This->undefBehavior = undefBehavior;
21         return &This->base;
22 }
23
24 uint64_t applyFunctionOperator(FunctionOperator *This, uint numVals, uint64_t *values) {
25         ASSERT(numVals == 2);
26         switch (This->op) {
27         case ADD:
28                 return values[0] + values[1];
29                 break;
30         case SUB:
31                 return values[0] - values[1];
32                 break;
33         default:
34                 ASSERT(0);
35         }
36 }
37
38 bool isInRangeFunction(FunctionOperator *This, uint64_t val) {
39         return existsInSet(This->range, val);
40 }
41
42 void deleteFunction(Function *This) {
43         switch (GETFUNCTIONTYPE(This)) {
44         case TABLEFUNC:
45                 break;
46         case OPERATORFUNC:
47                 deleteInlineArraySet(&((FunctionOperator *) This)->domains);
48                 break;
49         default:
50                 ASSERT(0);
51         }
52         ourfree(This);
53 }