making the qsort deterministic for BooleanEdge
[satune.git] / src / AST / boolean.h
index afcf512499aa40561b580bce56dc544c0af721cf..1f218b2cd855fde36aeab02738bfd917cda6dd46 100644 (file)
@@ -8,27 +8,35 @@
 #include "astnode.h"
 #include "functionencoding.h"
 #include "constraint.h"
+#include "serializer.h"
 
 class Boolean : public ASTNode {
+private:
+    static uint64_t counter;
 public:
        Boolean(ASTNodeType _type);
        virtual ~Boolean() {}
        virtual Boolean *clone(CSolver *solver, CloneMap *map) = 0;
-       virtual bool isTrue() {return false;}
-       virtual bool isFalse() {return false;}
+       virtual void serialize(Serializer * ) = 0;
+       virtual void print() = 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() {}
+        uint64_t id;
        CMEMALLOC;
 };
 
 class BooleanConst : public Boolean {
- public:
+public:
        BooleanConst(bool isTrue);
        Boolean *clone(CSolver *solver, CloneMap *map);
        bool isTrue() {return istrue;}
        bool isFalse() {return !istrue;}
+       void serialize(Serializer *serializer ) {};
+       virtual void print();
        bool istrue;
        CMEMALLOC;
 };
@@ -37,7 +45,8 @@ class BooleanVar : public Boolean {
 public:
        BooleanVar(VarType t);
        Boolean *clone(CSolver *solver, CloneMap *map);
-
+       void serialize(Serializer *serializer );
+       virtual void print();
        VarType vtype;
        Edge var;
        CMEMALLOC;
@@ -47,6 +56,9 @@ class BooleanOrder : public Boolean {
 public:
        BooleanOrder(Order *_order, uint64_t _first, uint64_t _second);
        Boolean *clone(CSolver *solver, CloneMap *map);
+       void serialize(Serializer *serializer );
+       virtual void print();
+       void updateParents();
 
        Order *order;
        uint64_t first;
@@ -56,24 +68,35 @@ public:
 
 class BooleanPredicate : public Boolean {
 public:
-       BooleanPredicate(Predicate *_predicate, Element **_inputs, uint _numInputs, Boolean *_undefinedStatus);
+       BooleanPredicate(Predicate *_predicate, Element **_inputs, uint _numInputs, BooleanEdge _undefinedStatus);
        Boolean *clone(CSolver *solver, CloneMap *map);
+       Predicate *getPredicate() {return predicate;}
+       FunctionEncoding *getFunctionEncoding() {return &encoding;}
+       void updateParents();
+       void serialize(Serializer *serializer );
+       virtual void print();
+       CMEMALLOC;
 
        Predicate *predicate;
        FunctionEncoding encoding;
        Array<Element *> inputs;
-       Boolean *undefStatus;
-       FunctionEncoding *getFunctionEncoding() {return &encoding;}
-       CMEMALLOC;
+       BooleanEdge undefStatus;
 };
 
 class BooleanLogic : public Boolean {
 public:
-       BooleanLogic(CSolver *solver, LogicOp _op, Boolean **array, uint asize);
+       BooleanLogic(CSolver *solver, LogicOp _op, BooleanEdge *array, uint asize);
        Boolean *clone(CSolver *solver, CloneMap *map);
-
+       void serialize(Serializer *serializer );
+       virtual void print();
        LogicOp op;
-       Array<Boolean *> inputs;
+       bool replaced;
+       Array<BooleanEdge> inputs;
+       void updateParents();
+
        CMEMALLOC;
 };
+BooleanEdge cloneEdge(CSolver *solver, CloneMap *map, BooleanEdge e);
+
+
 #endif