Commit after resolving conflicts
authorHamed <hamed.gorjiara@gmail.com>
Tue, 20 Jun 2017 18:12:02 +0000 (11:12 -0700)
committerHamed <hamed.gorjiara@gmail.com>
Tue, 20 Jun 2017 18:12:02 +0000 (11:12 -0700)
src/AST/boolean.c
src/AST/boolean.h
src/AST/element.c
src/AST/element.h
src/AST/ops.h
src/AST/order.c
src/AST/order.h
src/classlist.h
src/csolver.c
src/csolver.h

index 1a46ccd..831a200 100644 (file)
@@ -1,4 +1,6 @@
 #include "boolean.h"
+#include "structs.h"
+#include "csolver.h"
 
 Boolean* allocBoolean(VarType t) {
        BooleanVar* tmp=(BooleanVar *) ourmalloc(sizeof (BooleanVar));
@@ -17,6 +19,33 @@ Boolean* allocBooleanOrder(Order* order, uint64_t first, uint64_t second) {
        return & tmp -> base;
 }
 
+Boolean * allocBooleanPredicate(Predicate * predicate, Element ** inputs, uint numInputs){
+    BooleanPredicate* bp = (BooleanPredicate*) ourmalloc(sizeof(BooleanPredicate));
+    GETBOOLEANTYPE(bp)= PREDICATEOP;
+    bp->predicate=predicate;
+    bp->inputs= allocVectorArrayElement (numInputs,inputs);
+    return & bp->base;
+}
+
+Boolean * allocBooleanLogic(LogicOp op, Boolean * left, Boolean* right){
+    BooleanLogic* bl = (BooleanLogic*) ourmalloc(sizeof(BooleanLogic));
+    GETBOOLEANTYPE(bl) = LOGICOP;
+    bl->op=op;
+    bl->left=left;
+    bl->right=right;
+    return &bl->base;
+}
+Boolean * allocBooleanLogicArray(CSolver *solver, LogicOp op, Boolean ** array, uint asize){
+    ASSERT(asize>=2);
+    Boolean* boolean = allocBooleanLogic(op,array[0], array[1]);
+    pushVectorBoolean(solver->allBooleans,boolean);
+    for(uint i=2; i<asize; i++){
+       boolean=allocBooleanLogic(op,boolean, array[i]);
+       pushVectorBoolean(solver->allBooleans,boolean);
+    }
+    return boolean;
+}
+
 void deleteBoolean(Boolean * This) {
        ourfree(This);
 }
index 860365f..0222fc7 100644 (file)
@@ -3,6 +3,7 @@
 #include "classlist.h"
 #include "mymemory.h"
 #include "ops.h"
+#include "structs.h"
 
 /** 
                This is a little sketchy, but apparently legit.
@@ -41,10 +42,26 @@ struct BooleanComp {
        Boolean * right;
 };
 
+struct BooleanPredicate{
+    Boolean base;
+    Predicate * predicate;
+    VectorElement* inputs;
+};
 
 
 Boolean * allocBoolean(VarType t);
 Boolean * allocBooleanOrder(Order * order, uint64_t first, uint64_t second);
+Boolean * allocBooleanPredicate(Predicate * predicate, Element ** inputs, uint numInputs);
+Boolean * allocBooleanLogic(LogicOp op, Boolean * left, Boolean* right);
+/**
+ * This function also save new boooleans to solver->allbooleans
+ * @param solver
+ * @param op
+ * @param array
+ * @param asize
+ * @return 
+ */
+Boolean * allocBooleanLogicArray(CSolver *solver, LogicOp op, Boolean ** array, uint asize);
 void deleteBoolean(Boolean * This);
 
 #endif
index df29cfe..3746d25 100644 (file)
@@ -1,12 +1,23 @@
 #include "element.h"
-
+#include "structs.h"
+//FIXME: ELEMENTSET?
 Element *allocElement(Set * s) {
        Element * tmp=(Element *)ourmalloc(sizeof(Element));
+       GETELEMENTTYPE(tmp)= ELEMSET;
        tmp->set=s;
        tmp->encoding=NULL;
        return tmp;
 }
 
+Element* allocElementFunction(Function * function, Element ** array, uint numArrays, Boolean * overflowstatus){
+    ElementFunction* ef = (ElementFunction*) ourmalloc(sizeof(ElementFunction));
+    GETELEMENTTYPE(ef)= ELEMFUNCRETURN;
+    ef->function=function;
+    ef->overflowstatus = overflowstatus;
+    ef->Elements = allocVectorArrayElement(numArrays, array);
+    return &ef->base;
+}
+
 void deleteElement(Element *This) {
        ourfree(This);
 }
index 91d19db..0a23d88 100644 (file)
@@ -2,12 +2,31 @@
 #define ELEMENT_H
 #include "classlist.h"
 #include "mymemory.h"
+#include "ops.h"
+#include "structs.h"
 
+#define GETELEMENTTYPE(o) (((Element*)o)->type)
+
+//FIXME:TALK ABOUT ELEMENT
 struct Element {
+       ElementType type;
        Set * set;
        ElementEncoding * encoding;
 };
 
+struct ElementSet {
+    Element base;
+    Set * set;
+};
+
+struct ElementFunction{
+    Element base;
+    Function * function;
+    VectorElement* Elements;
+    Boolean * overflowstatus;
+};
+
 Element * allocElement(Set *s);
+Element* allocElementFunction(Function * function, Element ** array, uint numArrays, Boolean * overflowstatus);
 void deleteElement(Element *This);
 #endif
index b330d1b..9fa2966 100644 (file)
@@ -23,9 +23,12 @@ typedef enum OrderType OrderType;
 enum OverFlowBehavior {IGNORE, WRAPAROUND, FLAGFORCESOVERFLOW, OVERFLOWSETSFLAG, FLAGIFFOVERFLOW, NOOVERFLOW};
 typedef enum OverFlowBehavior OverFlowBehavior;
 
-enum BooleanType {ORDERCONST, BOOLEANVAR, LOGICOP, COMPARE};
+enum BooleanType {ORDERCONST, BOOLEANVAR, LOGICOP, COMPARE, PREDICATEOP};
 typedef enum BooleanType BooleanType;
 
 enum FunctionType {TABLEFUNC, OPERATORFUNC};
 typedef enum FunctionType FunctionType;
+
+enum ElementType {ELEMSET, ELEMFUNCRETURN};
+typedef enum ElementType ElementType;
 #endif
index 1d7b1cf..47cc374 100644 (file)
@@ -12,31 +12,6 @@ Order* allocOrder(OrderType type, Set * set){
     return order;
 }
 
-Boolean* getOrderConstraint(Order* order, uint64_t first, uint64_t second){
-       //Probably a bad idea to do a O(n) search through the order...
-       //We have a hashset data structure, why not use it for O(1) search
-
-
-       //We don't like warnings
-       return NULL;
-
-       /*
-       uint size = getSizeVectorInt(order->set->members);
-    //First we need to make sure that first and second are part of the list!
-    bool exist1=false, exist2=false;
-    for(int i=0; i<size; i++){
-        if(getVectorInt(order->set->members, i)==first){
-            exist1=true;
-        }else if(getVectorInt(order->set->members, i) == second){
-            exist2=true;
-        }else if(exist1 && exist2){
-            break;
-        }
-    }
-    ASSERT(exist1 && exist2);
-       */
-}
-
 void deleteOrder(Order* order){
     uint size = getSizeVectorBoolean( order->constraints );
     for(uint i=0; i<size; i++){
index 0a589a5..7d2bc3c 100644 (file)
@@ -11,7 +11,6 @@ struct Order {
 };
 
 Order* allocOrder(OrderType type, Set * set);
-Boolean* getOrderConstraint(Order* order,uint64_t first, uint64_t second);
 void deleteOrder(Order* order);
 
 #endif
index 237d529..3306ffe 100644 (file)
@@ -29,6 +29,7 @@ typedef struct BooleanOrder BooleanOrder;
 typedef struct BooleanVar BooleanVar;
 typedef struct BooleanLogic BooleanLogic;
 typedef struct BooleanComp BooleanComp;
+typedef struct BooleanPredicate BooleanPredicate;
 
 struct Boolean;
 typedef struct Boolean Boolean;
@@ -40,6 +41,9 @@ struct Set;
 typedef struct Set Set;
 typedef struct Set MutableSet;
 
+typedef struct ElementFunction ElementFunction;
+typedef struct ElementSet ElementSet;
+
 struct Element;
 typedef struct Element Element;
 
index a7af8d3..b35680c 100644 (file)
@@ -139,15 +139,19 @@ Function * completeTable(CSolver *solver, Table * table) {
 }
 
 Element * applyFunction(CSolver *solver, Function * function, Element ** array, uint numArrays, Boolean * overflowstatus) {
-       return NULL;
+    Element* element= allocElementFunction(function,array,numArrays,overflowstatus);
+    pushVectorElement(solver->allElements, element);
+    return element;
 }
 
 Boolean * applyPredicate(CSolver *solver, Predicate * predicate, Element ** inputs, uint numInputs) {
-       return NULL;
+    Boolean* boolean= allocBooleanPredicate(predicate, inputs, numInputs);
+    pushVectorBoolean(solver->allBooleans, boolean);
+    return boolean;
 }
 
-Boolean * applyLogicalOperation(CSolver *solver, LogicOp op, Boolean ** array) {
-       return NULL;
+Boolean * applyLogicalOperation(CSolver *solver, LogicOp op, Boolean ** array, uint asize) {
+    return allocBooleanLogicArray(solver, op, array, asize);
 }
 
 void addBoolean(CSolver *This, Boolean * constraint) {
index 93f19a4..ace6e78 100644 (file)
@@ -95,7 +95,7 @@ Boolean * applyPredicate(CSolver *, Predicate * predicate, Element ** inputs, ui
 
 /** This function applies a logical operation to the Booleans in its input. */
 
-Boolean * applyLogicalOperation(CSolver *, LogicOp op, Boolean ** array);
+Boolean * applyLogicalOperation(CSolver *, LogicOp op, Boolean ** array, uint asize);
 
 /** This function adds a boolean constraint to the set of constraints
     to be satisfied */