removing true nodes from the OrderGraph
[satune.git] / src / AST / function.c
index 61e413b88ebdf1ce42553288b4a1a0495bdc5c29..3a32139a03f1edb5acc1ab8fd8e4252968291d7f 100644 (file)
@@ -3,45 +3,48 @@
 #include "set.h"
 
 
-Function* allocFunctionOperator( ArithOp op, Set ** domain, uint numDomain, Set * range,OverFlowBehavior overflowbehavior){
-       FunctionOperator* This = (FunctionOperator*) ourmalloc(sizeof(FunctionOperator));
-       GETFUNCTIONTYPE(This)=OPERATORFUNC;
-       allocInlineArrayInitSet(&This->domains, domain, numDomain);
-       This->op=op;
+Function *allocFunctionOperator(ArithOp op, Set **domain, uint numDomain, Set *range, OverFlowBehavior overflowbehavior) {
+       FunctionOperator *This = (FunctionOperator *) ourmalloc(sizeof(FunctionOperator));
+       GETFUNCTIONTYPE(This) = OPERATORFUNC;
+       initArrayInitSet(&This->domains, domain, numDomain);
+       This->op = op;
        This->overflowbehavior = overflowbehavior;
-       This->range=range;
+       This->range = range;
        return &This->base;
 }
 
-Function* allocFunctionTable (Table* table){
-       FunctionTable* This = (FunctionTable*) ourmalloc(sizeof(FunctionTable));
-       GETFUNCTIONTYPE(This)=TABLEFUNC;
+Function *allocFunctionTable (Table *table, UndefinedBehavior undefBehavior) {
+       FunctionTable *This = (FunctionTable *) ourmalloc(sizeof(FunctionTable));
+       GETFUNCTIONTYPE(This) = TABLEFUNC;
        This->table = table;
+       This->undefBehavior = undefBehavior;
        return &This->base;
 }
 
-uint64_t applyFunctionOperator(FunctionOperator* func, uint64_t var1, uint64_t var2, bool* isInRange){
-       uint64_t result = 0;
-       switch( func->op){
-               case ADD:
-                       result = var1+ var2;
-                       break;
-               case SUB:
-                       result = var1 - var2;
-                       break;
-               default:
-                       ASSERT(0);
+uint64_t applyFunctionOperator(FunctionOperator *This, uint numVals, uint64_t *values) {
+       ASSERT(numVals == 2);
+       switch (This->op) {
+       case ADD:
+               return values[0] + values[1];
+               break;
+       case SUB:
+               return values[0] - values[1];
+               break;
+       default:
+               ASSERT(0);
        }
-       *isInRange = existsInSet(func->range, result);
-       return result;
 }
 
-void deleteFunction(Function* This){
-       switch(GETFUNCTIONTYPE(This)){
+bool isInRangeFunction(FunctionOperator *This, uint64_t val) {
+       return existsInSet(This->range, val);
+}
+
+void deleteFunction(Function *This) {
+       switch (GETFUNCTIONTYPE(This)) {
        case TABLEFUNC:
                break;
        case OPERATORFUNC:
-               deleteInlineArraySet(&((FunctionOperator*) This)->domains);
+               deleteInlineArraySet(&((FunctionOperator *) This)->domains);
                break;
        default:
                ASSERT(0);