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; }
+ virtual bool is_viable() const { return true; }
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:
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;
};
{
public:
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 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;
};
{
public:
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<FilterStatement> &) const;
};
LinkedColorsCondition(const Colors &);
virtual LinkedColorsCondition *clone() const;
+ virtual bool equals(const Condition &) const;
virtual void add_lines(std::list<FilterStatement> &) const;
};