Fix tabbing
[satune.git] / src / AST / element.h
index bce0073f3826a84d14ccf6907ae0dba506171aa9..91d677fc2b8726ff67aedcbda69338ac2b35c6ad 100644 (file)
@@ -8,46 +8,66 @@
 #include "elementencoding.h"
 #include "boolean.h"
 
-#define GETELEMENTTYPE(o) GETASTNODETYPE(o)
-#define GETELEMENTPARENTS(o) (&((Element*)o)->parents)         
-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;
+       bool anyValue;
 };
 
-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;
+       friend class ElementOpt;
 };
 
-struct ElementFunction {
-       Element base;
-       Function * function;
-       ArrayElement inputs;
-       Boolean * overflowstatus;
-       FunctionEncoding functionencoding;
-       ElementEncoding domainencoding;
+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;
 };
 
-Element * allocElementSet(Set *s);
-Element* allocElementFunction(Function * function, Element ** array, uint numArrays, Boolean * overflowstatus);
-void deleteElement(Element *This);
-Set* getElementSet(Element* This);
+class ElementFunction : public Element {
+public:
+       virtual ~ElementFunction() {}
+       ElementFunction(Function *function, Element **array, uint numArrays, BooleanEdge overflowstatus);
+       Array<Element *> inputs;
+       BooleanEdge overflowstatus;
+       FunctionEncoding functionencoding;
+       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;
+};
 
-static inline ElementEncoding* getElementEncoding(Element* This){
-       switch(GETELEMENTTYPE(This)){
-               case ELEMSET:
-                       return &((ElementSet*)This)->encoding;
-               case ELEMFUNCRETURN:            
-                       return &((ElementFunction*)This)->domainencoding;
-               default:
-                       ASSERT(0);
-       }
-       return NULL;
-}
 
-static inline FunctionEncoding* getElementFunctionEncoding(ElementFunction* func){
-       return &func->functionencoding;
-}
 #endif