#include "classlist.h"
#include "mymemory.h"
#include "ops.h"
+#include "astops.h"
#include "structs.h"
-#include "structtype.h"
-/**
- This is a little sketchy, but apparently legit.
- https://www.python.org/dev/peps/pep-3123/ */
+#include "astnode.h"
+#include "functionencoding.h"
+#include "constraint.h"
-#define GETBOOLEANTYPE(o) (((Boolean *)(o))->btype)
+class Boolean : public ASTNode {
+public:
+ Boolean(ASTNodeType _type);
+ virtual ~Boolean() {}
+ virtual Boolean *clone(CSolver *solver, CloneMap *map) = 0;
+ virtual bool isTrue() {return false;}
+ virtual bool isFalse() {return false;}
+ Polarity polarity;
+ BooleanValue boolVal;
+ Vector<Boolean *> parents;
-struct Boolean {
- Struct stype;
- BooleanType btype;
+ 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;
- Boolean * left;
- Boolean * right;
+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;
- VectorElement* inputs;
+class BooleanPredicate : public Boolean {
+public:
+ BooleanPredicate(Predicate *_predicate, Element **_inputs, uint _numInputs, Boolean *_undefinedStatus);
+ Boolean *clone(CSolver *solver, CloneMap *map);
+
+ Predicate *predicate;
+ FunctionEncoding encoding;
+ Array<Element *> inputs;
+ Boolean *undefStatus;
+ FunctionEncoding *getFunctionEncoding() {return &encoding;}
+ CMEMALLOC;
};
-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);
+class BooleanLogic : public Boolean {
+public:
+ BooleanLogic(CSolver *solver, LogicOp _op, Boolean **array, uint asize);
+ Boolean *clone(CSolver *solver, CloneMap *map);
+ LogicOp op;
+ Array<Boolean *> inputs;
+ CMEMALLOC;
+};
#endif