]> git.tdb.fi Git - poefilter.git/blobdiff - source/condition.h
Correctly merge icon and light beam appearances
[poefilter.git] / source / condition.h
index bbabf22e5f27d98c8de47b0b4a58622a910dff63..6b0cf6bda2831109cc7ef38b66fb08abf8a1bf7f 100644 (file)
@@ -18,6 +18,7 @@ public:
        virtual ~Condition() { }
 
        virtual Condition *clone() const = 0;
+       virtual bool equals(const Condition &) 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<const Condition *> &, const CompoundCondition &) const { return 0; }
@@ -39,6 +40,7 @@ public:
 
 protected:
        void clone_to(CompoundCondition &) const;
+       bool sub_equals(const CompoundCondition &) const;
 
 public:
        void add(Condition *);
@@ -48,9 +50,9 @@ public:
        virtual Condition *flatten() const;
 protected:
        Condition *dispatch_flatten(Condition *, Condition *) const;
-       Condition *merge_two(Condition *, Condition *, bool) const;
-       Condition *add_merged_to(Condition *, CompoundCondition *, bool) const;
-       Condition *merge_contents_to(CompoundCondition *, CompoundCondition *) const;
+       static Condition *merge_two(Condition *, Condition *, const CompoundCondition &, bool);
+       static Condition *add_merged_to(Condition *, CompoundCondition *, bool);
+       static Condition *merge_contents_to(CompoundCondition *, CompoundCondition *);
        virtual Condition *flatten(Condition *, Condition *) const = 0;
        virtual Condition *flatten(AndCondition *, Condition *) const = 0;
        virtual Condition *flatten(AndCondition *, AndCondition *) const = 0;
@@ -64,6 +66,7 @@ class AndCondition: public CompoundCondition
 {
 public:
        virtual AndCondition *clone() const;
+       virtual bool equals(const Condition &) const;
 protected:
        virtual Condition *flatten(Condition *, Condition *) const;
        virtual Condition *flatten(AndCondition *, Condition *) const;
@@ -71,6 +74,11 @@ protected:
        virtual Condition *flatten(OrCondition *, Condition *) const;
        virtual Condition *flatten(OrCondition *, AndCondition *) const;
        virtual Condition *flatten(OrCondition *, OrCondition *) const;
+public:
+       virtual bool can_merge(const Condition &, const CompoundCondition &) const;
+       virtual AndCondition *merge(const std::vector<const Condition *> &, const CompoundCondition &) const;
+private:
+       static bool merge(const AndCondition &, const AndCondition &, const CompoundCondition &, AndCondition **);
 public:
        virtual bool is_viable() const;
        virtual void add_lines(std::list<FilterStatement> &) const;
@@ -81,6 +89,7 @@ class OrCondition: public CompoundCondition
 {
 public:
        virtual OrCondition *clone() const;
+       virtual bool equals(const Condition &) const;
 protected:
        virtual Condition *flatten(Condition *, Condition *) const;
        virtual Condition *flatten(AndCondition *, Condition *) const;
@@ -109,6 +118,7 @@ public:
        LinkedColorsCondition(const Colors &);
 
        virtual LinkedColorsCondition *clone() const;
+       virtual bool equals(const Condition &) const;
        virtual void add_lines(std::list<FilterStatement> &) const;
 };