]> git.tdb.fi Git - poefilter.git/blobdiff - source/condition.h
Rework condition merging
[poefilter.git] / source / condition.h
index 53f2a8a8268be8e0248f76d41a1032b8a89516b7..141e57094cfd666a3b789b889329dbec50b2c1ed 100644 (file)
@@ -18,12 +18,16 @@ public:
        virtual ~Condition() { }
 
        virtual Condition *clone() const = 0;
+       virtual Condition *flatten() const { return clone(); }
        virtual bool can_merge(const Condition &, const CompoundCondition &) const { return false; }
+       virtual Condition *merge(const std::vector<Condition *> &, const CompoundCondition &) const { return 0; }
        virtual void add_lines(std::list<FilterStatement> &) const = 0;
-       virtual void add_merged_lines(const std::vector<Condition *> &, const CompoundCondition &, std::list<FilterStatement> &) const { }
 };
 
 
+class AndCondition;
+class OrCondition;
+
 class CompoundCondition: public Condition
 {
 protected:
@@ -37,6 +41,18 @@ protected:
 
 public:
        void add(Condition *);
+       unsigned count() const { return conditions.size(); }
+       const Condition *get(unsigned) const;
+
+       virtual Condition *flatten() const;
+protected:
+       Condition *dispatch_flatten(Condition *, Condition *) const;
+       virtual Condition *flatten(Condition *, Condition *) const = 0;
+       virtual Condition *flatten(AndCondition *, Condition *) const = 0;
+       virtual Condition *flatten(AndCondition *, AndCondition *) const = 0;
+       virtual Condition *flatten(OrCondition *, Condition *) const = 0;
+       virtual Condition *flatten(OrCondition *, AndCondition *) const = 0;
+       virtual Condition *flatten(OrCondition *, OrCondition *) const = 0;
 };
 
 
@@ -44,6 +60,14 @@ class AndCondition: public CompoundCondition
 {
 public:
        virtual AndCondition *clone() const;
+protected:
+       virtual Condition *flatten(Condition *, Condition *) const;
+       virtual Condition *flatten(AndCondition *, Condition *) const;
+       virtual Condition *flatten(AndCondition *, AndCondition *) const;
+       virtual Condition *flatten(OrCondition *, Condition *) const;
+       virtual Condition *flatten(OrCondition *, AndCondition *) const;
+       virtual Condition *flatten(OrCondition *, OrCondition *) const;
+public:
        virtual void add_lines(std::list<FilterStatement> &) const;
 };
 
@@ -52,6 +76,14 @@ class OrCondition: public CompoundCondition
 {
 public:
        virtual OrCondition *clone() const;
+protected:
+       virtual Condition *flatten(Condition *, Condition *) const;
+       virtual Condition *flatten(AndCondition *, Condition *) const;
+       virtual Condition *flatten(AndCondition *, AndCondition *) const;
+       virtual Condition *flatten(OrCondition *, Condition *) const;
+       virtual Condition *flatten(OrCondition *, AndCondition *) const;
+       virtual Condition *flatten(OrCondition *, OrCondition *) const;
+public:
        virtual void add_lines(std::list<FilterStatement> &) const;
 };