X-Git-Url: http://git.tdb.fi/?p=poefilter.git;a=blobdiff_plain;f=source%2Fcondition.h;h=141e57094cfd666a3b789b889329dbec50b2c1ed;hp=53f2a8a8268be8e0248f76d41a1032b8a89516b7;hb=8b9d1f472e7bfbb1e097bb6d8bcad026e9636822;hpb=1805b8e549e6b5c0a53b2f735b8f2eb725f40b2e diff --git a/source/condition.h b/source/condition.h index 53f2a8a..141e570 100644 --- a/source/condition.h +++ b/source/condition.h @@ -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 &, const CompoundCondition &) const { return 0; } virtual void add_lines(std::list &) const = 0; - virtual void add_merged_lines(const std::vector &, const CompoundCondition &, std::list &) 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 &) 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 &) const; };