X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcondition.h;h=6b0cf6bda2831109cc7ef38b66fb08abf8a1bf7f;hb=HEAD;hp=59976aad096b19781895060bdd94dc806741cf58;hpb=fc27eb63c05d915d606e17992ecd5b7f68478101;p=poefilter.git diff --git a/source/condition.h b/source/condition.h index 59976aa..6b0cf6b 100644 --- a/source/condition.h +++ b/source/condition.h @@ -3,6 +3,7 @@ #include #include +#include #include #include "rarity.h" @@ -17,32 +18,69 @@ 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; } + virtual bool is_viable() const { return true; } virtual void add_lines(std::list &) const = 0; - virtual void add_merged_lines(const std::list &, const CompoundCondition &, std::list &) const { } }; +class AndCondition; +class OrCondition; + class CompoundCondition: public Condition { protected: - std::list conditions; + std::vector conditions; public: virtual ~CompoundCondition(); protected: void clone_to(CompoundCondition &) const; + bool sub_equals(const CompoundCondition &) const; 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; + 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; + virtual Condition *flatten(OrCondition *, Condition *) const = 0; + virtual Condition *flatten(OrCondition *, AndCondition *) const = 0; + virtual Condition *flatten(OrCondition *, OrCondition *) const = 0; }; class AndCondition: public CompoundCondition { public: - virtual Condition *clone() const; + virtual AndCondition *clone() const; + virtual bool equals(const Condition &) 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 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; }; @@ -50,7 +88,17 @@ public: class OrCondition: public CompoundCondition { public: - virtual Condition *clone() const; + virtual OrCondition *clone() const; + virtual bool equals(const Condition &) 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 bool is_viable() const; virtual void add_lines(std::list &) const; }; @@ -69,7 +117,8 @@ private: public: LinkedColorsCondition(const Colors &); - virtual Condition *clone() const; + virtual LinkedColorsCondition *clone() const; + virtual bool equals(const Condition &) const; virtual void add_lines(std::list &) const; };