Adding function operator handler+ omitting some redundant codes
[satune.git] / src / AST / function.c
index c8163637a905fae6b93f623c9f7812cac8252acc..65aea05acf939ab12eb5bd5f61ede77ee6507f5f 100644 (file)
@@ -6,7 +6,7 @@
 Function* allocFunctionOperator( ArithOp op, Set ** domain, uint numDomain, Set * range,OverFlowBehavior overflowbehavior){
        FunctionOperator* This = (FunctionOperator*) ourmalloc(sizeof(FunctionOperator));
        GETFUNCTIONTYPE(This)=OPERATORFUNC;
-       This->domains = allocVectorArraySet(numDomain, domain);
+       allocInlineArrayInitSet(&This->domains, domain, numDomain);
        This->op=op;
        This->overflowbehavior = overflowbehavior;
        This->range=range;
@@ -20,15 +20,35 @@ Function* allocFunctionTable (Table* table){
        return &This->base;
 }
 
+uint64_t applyFunctionOperator(FunctionOperator* func, uint64_t var1, uint64_t var2, bool* isInRange, bool* hasOverFlow){
+       uint64_t result = 0;
+       switch( func->op){
+               case ADD:
+                       result = var1+ var2;
+                       if(result < var1){
+                               *hasOverFlow=true;
+                       }
+                       break;
+               case SUB:
+                       result = var1 - var2;
+                       //FIXME: Should we consider underflow as well?
+                       break;
+               default:
+                       ASSERT(0);
+       }
+       *isInRange = existsInSet(func->range, result);
+       return result;
+}
+
 void deleteFunction(Function* This){
        switch(GETFUNCTIONTYPE(This)){
        case TABLEFUNC:
-               ourfree((FunctionTable*)This);
                break;
        case OPERATORFUNC:
-               ourfree((FunctionOperator*) This);
+               deleteInlineArraySet(&((FunctionOperator*) This)->domains);
                break;
        default:
                ASSERT(0);
        }
+       ourfree(This);
 }