#include "boolean.h"
+#include "structs.h"
+#include "csolver.h"
Boolean* allocBoolean(VarType t) {
BooleanVar* tmp=(BooleanVar *) ourmalloc(sizeof (BooleanVar));
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);
}
#include "classlist.h"
#include "mymemory.h"
#include "ops.h"
+#include "structs.h"
/**
This is a little sketchy, but apparently legit.
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
#include "element.h"
+#include "structs.h"
-Element *allocElement(Set * s) {
- Element * tmp=(Element *)ourmalloc(sizeof(Element));
+Element *allocElementSet(Set * s) {
+ ElementSet * tmp=(ElementSet *)ourmalloc(sizeof(ElementSet));
+ GETELEMENTTYPE(tmp)= ELEMSET;
tmp->set=s;
- return tmp;
+ return &tmp->base;
+}
+
+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) {
#define ELEMENT_H
#include "classlist.h"
#include "mymemory.h"
+#include "ops.h"
+#include "structs.h"
+
+#define GETELEMENTTYPE(o) (((Element*)o)->type)
struct Element {
- Set * set;
+ ElementType type;
+};
+
+struct ElementSet {
+ Element base;
+ Set * set;
+};
+
+struct ElementFunction{
+ Element base;
+ Function * function;
+ VectorElement* Elements;
+ Boolean * overflowstatus;
};
-Element * allocElement(Set *s);
+Element * allocElementSet(Set *s);
+Element* allocElementFunction(Function * function, Element ** array, uint numArrays, Boolean * overflowstatus);
void deleteElement(Element *This);
#endif
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
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++){
};
Order* allocOrder(OrderType type, Set * set);
-Boolean* getOrderConstraint(Order* order,uint64_t first, uint64_t second);
void deleteOrder(Order* order);
#endif
typedef struct BooleanVar BooleanVar;
typedef struct BooleanLogic BooleanLogic;
typedef struct BooleanComp BooleanComp;
+typedef struct BooleanPredicate BooleanPredicate;
struct Boolean;
typedef struct Boolean Boolean;
typedef struct Set MutableSet;
+typedef struct ElementFunction ElementFunction;
+typedef struct ElementSet ElementSet;
+
struct Element;
typedef struct Element Element;
for(uint i=0;i<size;i++) {
deleteFunction(getVectorFunction(This->allFunctions, i));
}
- deleteVectorOrder(This->allFunctions);
+ deleteVectorFunction(This->allFunctions);
ourfree(This);
}
}
Element * getElementVar(CSolver *This, Set * set) {
- Element * element=allocElement(set);
+ Element * element=allocElementSet(set);
pushVectorElement(This->allElements, element);
return element;
}
}
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) {
/** 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 */