Merge branch 'master' of ssh://demsky.eecs.uci.edu/home/git/constraint_compiler into...
[satune.git] / src / AST / boolean.h
index 411af2604b771835682316e1d191c7d56c1b600d..8be1d30626c93f6c3612ab0447157bb3f4825dc1 100644 (file)
@@ -3,52 +3,88 @@
 #include "classlist.h"
 #include "mymemory.h"
 #include "ops.h"
+#include "astops.h"
 #include "structs.h"
 #include "astnode.h"
 #include "functionencoding.h"
+#include "constraint.h"
 
-/**
-    This is a little sketchy, but apparently legit.
-    https://www.python.org/dev/peps/pep-3123/ */
 
-#define GETBOOLEANTYPE(o) GETASTNODETYPE(o)
-#define GETBOOLEANPARENTS(o) (&((Boolean *)(o))->parents)
 
-struct Boolean {
-       ASTNode base;
-       VectorBoolean parents;
+class Boolean : public ASTNode {
+public:
+       Boolean(ASTNodeType _type);
+       virtual ~Boolean() {}
+       virtual Boolean *clone(CSolver *solver, CloneMap *map) = 0;
+       virtual bool isTrue() {return boolVal == BV_MUSTBETRUE;}
+       virtual bool isFalse() {return boolVal == BV_MUSTBEFALSE;}
+       Polarity polarity;
+       BooleanValue boolVal;
+       Vector<Boolean *> parents;
+       virtual void updateParents() {}
+       
+       CMEMALLOC;
 };
 
-struct BooleanOrder {
-       Boolean base;
-       Order* order;
-       uint64_t first;
-       uint64_t second;
+class BooleanConst : public Boolean {
+public:
+       BooleanConst(bool isTrue);
+       Boolean *clone(CSolver *solver, CloneMap *map);
+       bool isTrue() {return istrue;}
+       bool isFalse() {return !istrue;}
+       bool istrue;
+       CMEMALLOC;
 };
 
-struct BooleanVar {
-       Boolean base;
+class BooleanVar : public Boolean {
+public:
+       BooleanVar(VarType t);
+       Boolean *clone(CSolver *solver, CloneMap *map);
+
        VarType vtype;
-       Constraint * var;
+       Edge var;
+       CMEMALLOC;
 };
 
-struct BooleanLogic {
-       Boolean base;
-       LogicOp op;
-       ArrayBoolean inputs;
+class BooleanOrder : public Boolean {
+public:
+       BooleanOrder(Order *_order, uint64_t _first, uint64_t _second);
+       Boolean *clone(CSolver *solver, CloneMap *map);
+
+       Order *order;
+       uint64_t first;
+       uint64_t second;
+       CMEMALLOC;
 };
 
-struct BooleanPredicate {
-       Boolean base;
-       Predicate * predicate;
+class BooleanPredicate : public Boolean {
+public:
+       BooleanPredicate(Predicate *_predicate, Element **_inputs, uint _numInputs, BooleanEdge _undefinedStatus);
+       Boolean *clone(CSolver *solver, CloneMap *map);
+
+       Predicate *predicate;
        FunctionEncoding encoding;
-       ArrayElement inputs;
+       Array<Element *> inputs;
+       BooleanEdge undefStatus;
+       FunctionEncoding *getFunctionEncoding() {return &encoding;}
+       void updateParents();
+
+       CMEMALLOC;
+};
+
+class BooleanLogic : public Boolean {
+public:
+       BooleanLogic(CSolver *solver, LogicOp _op, BooleanEdge *array, uint asize);
+       Boolean *clone(CSolver *solver, CloneMap *map);
+
+       LogicOp op;
+       bool replaced;
+       Array<BooleanEdge> inputs;
+       void updateParents();
+       
+       CMEMALLOC;
 };
+BooleanEdge cloneEdge(CSolver *solver, CloneMap *map, BooleanEdge e);
 
-Boolean * allocBoolean(VarType t);
-Boolean * allocBooleanOrder(Order * order, uint64_t first, uint64_t second);
-Boolean * allocBooleanPredicate(Predicate * predicate, Element ** inputs, uint numInputs);
-Boolean * allocBooleanLogicArray(CSolver *solver, LogicOp op, Boolean ** array, uint asize);
-void deleteBoolean(Boolean * This);
 
 #endif