X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcondition.h;h=6b0cf6bda2831109cc7ef38b66fb08abf8a1bf7f;hb=HEAD;hp=bbabf22e5f27d98c8de47b0b4a58622a910dff63;hpb=746329e61ac9f26962af740b0b11dee716803521;p=poefilter.git diff --git a/source/condition.h b/source/condition.h index bbabf22..6b0cf6b 100644 --- a/source/condition.h +++ b/source/condition.h @@ -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 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 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 &) 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 &) const; };