#include "elementencoding.h"
#include "boolean.h"
-#define GETELEMENTTYPE(o) GETASTNODETYPE(o)
-#define GETELEMENTPARENTS(o) (&((Element*)o)->parents)
-#define GETELEMENTENCODING(e) (GETELEMENTTYPE(e)==ELEMSET? \
- &((ElementSet*)e)->encoding: \
- GETELEMENTTYPE(e)==ELEMFUNCRETURN? \
- &((ElementFunction*)e)->domainencoding: NULL)
-// Should be called on the element or boolean
-#define GETFUNCTIONENCODING(f) (GETASTNODETYPE(f) == ELEMFUNCRETURN? \
- &((ElementFunction*)f)->functionencoding: \
- GETASTNODETYPE(f) == PREDICATEOP? \
- &((BooleanPredicate*)f)->encoding: NULL)
-
-struct Element {
- ASTNode base;
- VectorASTNode parents;
+class Element : public ASTNode {
+public:
+ Element(ASTNodeType type);
+ virtual ~Element() {}
+ Vector<ASTNode *> parents;
+ ElementEncoding encoding;
+ inline ElementEncoding *getElementEncoding() { return &encoding; }
+ virtual Element *clone(CSolver *solver, CloneMap *map) {ASSERT(0); return NULL;};
+ virtual void serialize(Serializer *serializer) = 0;
+ virtual void print() = 0;
+ virtual void updateParents() {}
+ virtual Set *getRange() = 0;
+ CMEMALLOC;
};
-struct ElementSet {
- Element base;
- Set * set;
- ElementEncoding encoding;
+class ElementSet : public Element {
+public:
+ ElementSet(ASTNodeType type, Set *s);
+ virtual ~ElementSet() {}
+ ElementSet(Set *s);
+ virtual Element *clone(CSolver *solver, CloneMap *map);
+ virtual void serialize(Serializer *serializer);
+ virtual void print();
+ CMEMALLOC;
+ Set *getRange() {return set;}
+protected:
+ Set *set;
+
+};
+
+class ElementConst : public ElementSet {
+public:
+ ElementConst(uint64_t value, Set *_set);
+ virtual ~ElementConst() {}
+ uint64_t value;
+ virtual void serialize(Serializer *serializer);
+ virtual void print();
+ Element *clone(CSolver *solver, CloneMap *map);
+ CMEMALLOC;
};
-struct ElementFunction {
- Element base;
- Function * function;
- ArrayElement inputs;
- Boolean * overflowstatus;
+class ElementFunction : public Element {
+public:
+ virtual ~ElementFunction() {}
+ ElementFunction(Function *function, Element **array, uint numArrays, BooleanEdge overflowstatus);
+ Array<Element *> inputs;
+ BooleanEdge overflowstatus;
FunctionEncoding functionencoding;
- ElementEncoding domainencoding;
+ Element *clone(CSolver *solver, CloneMap *map);
+ virtual void serialize(Serializer *serializer);
+ virtual void print();
+ Set *getRange();
+ void updateParents();
+ Function *getFunction() {return function;}
+ inline FunctionEncoding *getElementFunctionEncoding() {return &functionencoding;}
+ CMEMALLOC;
+private:
+ Function *function;
};
-Element * allocElementSet(Set *s);
-Element* allocElementFunction(Function * function, Element ** array, uint numArrays, Boolean * overflowstatus);
-void deleteElement(Element *This);
-uint getElementSize(Element* This);
-Constraint * getElementValueConstraint(Element* This, uint64_t value);
#endif