7 #include <msp/strings/format.h>
10 class CompoundCondition;
11 class FilterStatement;
18 virtual ~Condition() { }
20 virtual Condition *clone() const = 0;
21 virtual bool equals(const Condition &) const = 0;
22 virtual Condition *flatten() const { return clone(); }
23 virtual bool can_merge(const Condition &, const CompoundCondition &) const { return false; }
24 virtual Condition *merge(const std::vector<const Condition *> &, const CompoundCondition &) const { return 0; }
25 virtual bool is_viable() const { return true; }
26 virtual void add_lines(std::list<FilterStatement> &) const = 0;
33 class CompoundCondition: public Condition
36 std::vector<Condition *> conditions;
39 virtual ~CompoundCondition();
42 void clone_to(CompoundCondition &) const;
43 bool sub_equals(const CompoundCondition &) const;
46 void add(Condition *);
47 unsigned count() const { return conditions.size(); }
48 const Condition &get(unsigned) const;
50 virtual Condition *flatten() const;
52 Condition *dispatch_flatten(Condition *, Condition *) const;
53 static Condition *merge_two(Condition *, Condition *, const CompoundCondition &, bool);
54 static Condition *add_merged_to(Condition *, CompoundCondition *, bool);
55 static Condition *merge_contents_to(CompoundCondition *, CompoundCondition *);
56 virtual Condition *flatten(Condition *, Condition *) const = 0;
57 virtual Condition *flatten(AndCondition *, Condition *) const = 0;
58 virtual Condition *flatten(AndCondition *, AndCondition *) const = 0;
59 virtual Condition *flatten(OrCondition *, Condition *) const = 0;
60 virtual Condition *flatten(OrCondition *, AndCondition *) const = 0;
61 virtual Condition *flatten(OrCondition *, OrCondition *) const = 0;
65 class AndCondition: public CompoundCondition
68 virtual AndCondition *clone() const;
69 virtual bool equals(const Condition &) const;
71 virtual Condition *flatten(Condition *, Condition *) const;
72 virtual Condition *flatten(AndCondition *, Condition *) const;
73 virtual Condition *flatten(AndCondition *, AndCondition *) const;
74 virtual Condition *flatten(OrCondition *, Condition *) const;
75 virtual Condition *flatten(OrCondition *, AndCondition *) const;
76 virtual Condition *flatten(OrCondition *, OrCondition *) const;
78 virtual bool can_merge(const Condition &, const CompoundCondition &) const;
79 virtual AndCondition *merge(const std::vector<const Condition *> &, const CompoundCondition &) const;
81 static bool merge(const AndCondition &, const AndCondition &, const CompoundCondition &, AndCondition **);
83 virtual bool is_viable() const;
84 virtual void add_lines(std::list<FilterStatement> &) const;
88 class OrCondition: public CompoundCondition
91 virtual OrCondition *clone() const;
92 virtual bool equals(const Condition &) const;
94 virtual Condition *flatten(Condition *, Condition *) const;
95 virtual Condition *flatten(AndCondition *, Condition *) const;
96 virtual Condition *flatten(AndCondition *, AndCondition *) const;
97 virtual Condition *flatten(OrCondition *, Condition *) const;
98 virtual Condition *flatten(OrCondition *, AndCondition *) const;
99 virtual Condition *flatten(OrCondition *, OrCondition *) const;
101 virtual bool is_viable() const;
102 virtual void add_lines(std::list<FilterStatement> &) const;
106 class LinkedColorsCondition: public Condition
118 LinkedColorsCondition(const Colors &);
120 virtual LinkedColorsCondition *clone() const;
121 virtual bool equals(const Condition &) const;
122 virtual void add_lines(std::list<FilterStatement> &) const;
125 void operator>>(const Msp::LexicalConverter &, LinkedColorsCondition::Colors &);