remove redundant sets
[satune.git] / src / AST / element.h
index 6a8ea956a6fc0b788e4d79fc0296b196dc9e4da2..ac1ed2f63a51f11cd9932659b40fc15dab8c72b5 100644 (file)
@@ -8,51 +8,65 @@
 #include "elementencoding.h"
 #include "boolean.h"
 
-#define GETELEMENTTYPE(o) (o->type)
-#define GETELEMENTPARENTS(o) (&((Element *)o)->parents)
 class Element : public ASTNode {
- public:
+public:
        Element(ASTNodeType type);
-       virtual ~Element();
+       virtual ~Element() {}
        Vector<ASTNode *> parents;
        ElementEncoding encoding;
-       MEMALLOC;
-};
-
-class ElementConst : public Element {
- public:
-       ElementConst(uint64_t value, VarType type);
-       ~ElementConst();
-       Set *set;
-       uint64_t value;
-       MEMALLOC;
+       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;
 };
 
 class ElementSet : public Element {
- public:
+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;
-       MEMALLOC;
+       friend class ElementOpt;
+};
+
+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;
 };
 
 class ElementFunction : public Element {
- public:
-       ElementFunction(Function *function, Element **array, uint numArrays, Boolean *overflowstatus);
-       ~ElementFunction();
-       Function *function;
+public:
+       virtual ~ElementFunction() {}
+       ElementFunction(Function *function, Element **array, uint numArrays, BooleanEdge overflowstatus);
        Array<Element *> inputs;
-       Boolean *overflowstatus;
+       BooleanEdge overflowstatus;
        FunctionEncoding functionencoding;
-       MEMALLOC;
+       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;
 };
 
-Set *getElementSet(Element *This);
-
-static inline ElementEncoding *getElementEncoding(Element *e) {
-       return &e->encoding;
-}
 
-static inline FunctionEncoding *getElementFunctionEncoding(ElementFunction *func) {
-       return &func->functionencoding;
-}
 #endif